본문 바로가기

전체 글

(42)
[Exceptional C++ Style] 18. 클래스 가상성 가상성이라...책 제목에 대한 번역 참 마음에 안 든다... 이 챕터에서는 가상 함수에 대한 공개(public, protected, private) 수준과 부모 클래스의 소멸자를 가상 함수로 해야 하는가에 대해 이야기 하고 잇으며, 그 이야기들로부터 좋은 설계를 위한 지침을 안내하고 있다. 상속 관계와 가상성은 늘 도마 위에 올라 지겹게 보는 내용이지만, 다시 한 번 리마인드하는 것도 나쁘지 않을 듯 하다. 1. 가상 함수들을 언제 public/protected/private으로 해야 할까? 가상 함수의 공개 여부에 대해 표어를 하나 만들어보면 다음과 같을 것이다. public은 '드물게', protected는 '가끔', private는 '기본적으로' 사실 위 표어는 비단 가상 함수뿐 아니라 클래스의 다..
[Exceptional C++ Style] 16. private는 얼마나 비공개적인가? 이번 챕터는 private 키워드의 비공개성에 대해 접근성과 가시성이라는 두 가지 측면에서 설명하고 있다. 그리고, private 멤버에 대해서 클래스 외부의 non-friend 코드가 private 이름에 접근할 수 있는 방법들에 대해서 설명하고 있지만, 이 부분은 사실 이렇게하면 할 수 있다는 이야기이지 바람직한 부분은 아니기에 굳이 정리하지 않겠다. 물론 아주 기초적인 내용이지만, 한 번쯤 정독과 고찰을 해 볼 필요는 있어 보인다. 특히, 컴파일러가 함수 호출을 결정하는 순서는 가급적 확실하게 이해를 하고 있어야 한다. 고수 질문 Twice 함수들이 링크 과정에 포함되는 다른 어떤 번역 단위에 정의되어 있다고 할 때(cpp에 되어 있겟지), 다음의 프로그램이 제대로 컴파일, 실행될까? 아니라면 왜 ..
[Exceptional C++ Style] 14. 클래스 객체 생성(소멸) 순서의 중요성 이 챕터에서는 클래스가 상속 관계를 가질 때, 특히 생성자와 소멸자의 처리 순서에 대해 다루고 있다. 기본 클래스로부터 상속받은 파생 클래스가 생성될 때 어떠한 순서로 생성 처리가 되며, 이러한 순서에 대해 정확한 이해없이 코드를 만들면 어떠한 문제가 생기는 지 알아본다. 신참 질문 다음 코드에서 무엇이, 그리고 왜 잘못 되었는가? #include using namespace std; class Base { public: explicit Base(const string& a) { //... } string f() { return "Hello World"; } }; class Derived : public Base { public: Derived() : Base(s = f()) {} private: str..
[Exceptional C++ Style] 8. 템플릿 친구 만들기 (friend function template) 책에서는 friend 함수 템플릿 특수화를 사용하는 케이스에 대해 범위 지정 연산자 (::)를 사용할 수 있는 경우에 대해, 주로 예시를 들면서 범위 지정 연산자가 있을 때 사용할 수 있는 두 가지 방법에 대해 논의한다. 하지만 실제 범위 지정 연산자를 쓸 수 없는 경우(클래스 정적 멤버가 아니거나 네임스페이스 속에 있지 않거나)도 많기에 이번 챕터 정리는 책과 조금 다르게 풀어갈 생각이며, (범위 지정 연산자를 사용하는 경우를 예외적으로 소개하겠다) 책에서 얘기하고 있는 friend 함수의 조건도 바뀐 C++ 0X 기준으로 설명하겠다. 주어진 객체에 대해 로그를 남긴 후 삭제하는 다음 함수 템플릿이 있다고 하자. template void LoggedDelete(T* t) { // 로그를 남겨라 dele..
[Exceptional C++ Style] 1. vector의 올바른/잘못된 용법 STL의 vector는 가장 흔하게 사용되는 컨테이너 중 하나이다. C/C++의 배열을 표방하고 있으며, operator []를 제공함으로써 사용법도 크게 낯설지 않다. 하지만, 사용 빈도에 비례하여 잘못된 용법으로 사용하는 경우도 그만큼 많다. 신참 질문 "vector v" 가 주어졌을 때, 아래의 줄 A와 B의 차이는 무엇일까? void f(const vector& v) { v[0]; // A v.at(0); // B } 위 예제에서 A와 B 라인은 벡터 요소에 접근하는 두 가지 방법을 보여주고 있다. vector v의 0번째 인덱스에 요소가 존재한다면 A와 B는 아무런 차이가 없다. 하지만, v가 비어 있는 경우 B라인은 std::out_of_range 예외를 던져주지만, A의 경우 미정의 결과(컴..
[Exceptional C++ Style] 7. 함수 템플릿을 특수화하지 말아야 하는 이유 이 챕터는 함수 템플릿 오버로드와 특수화에 대해 이야기하고 있다. 제목에서 함수 템플릿을 특수화하지 말라고 하는데, 이는 함수 템플릿 특수화의 낮은 직관성에 기인한다. 일반 함수 - 함수 템플릿 - 함수 템플릿 오버로드 - 함수 템플릿 특수화의 차이와 인스턴스화가 발생하는 우선 순위에 대해 짚고 넘어갈 수 있는 챕터이다. 신참 질문 C++에 존재하는 템플릿의 두 종류는 무엇이며, 각각 어떻게 특수화되는가? C++ 템플릿은 다음 두 가지 종류가 있다. 함수 템플릿 클래스 템플릿 이 두 종류의 템플릿은 정확히 동일한 방식으로는 동작하지 않는데, 가장 명백한 차이는 역시 오버로드의 유무이다. 보통의 C++ 클래스와 마찬가지로 클래스 템플릿 역시 오버로드를 할 수 없다. 역시 C++ 함수와 마찬가지로 함수 템플..
HTN (Hierachical Task Network) 서문 최근 F/TPS 게임에서 AI 팀의 개별 AI 행위 조직화는 가장 중요한 이슈중 하나이다. 예를 들어, 하프라이프에서 기억에 남는 장면으로 회자되는 것 중 하나는 주인공과 해병대간 총격전이다. 적 해병대원들은 싱글 캠페인 중 엄호하고, 측면으로 돌아가거나 엄폐하는 행동들을 했다. 비록 총격전이 벌어진 곳에서 시나리오의 특수한 상황에 맞게 하드코딩 되었으나, NPC간 조직화된 행동의 임팩트를 충분히 보여줬었다. 이러한 성공에도 불구하고, 팀 조직화는 많은 노력을 필요로 한다. 지금껏은 대부분 상당히 정교하고 복잡한 FSM으로 제작되어 왔지만, 최근에는 Goal-Oriented Action Planning (GOAP)이 새로운 패러다임으로 제시되고 있다. GOAP는 캐릭터가 "무엇을" "어떻게" 해야하..
Perforce workspace 지정 p4 set P4CLIENT=(workspace name) ex) workspace 이름이 TEMP 라면 prompt> p4 set P4CLIENT=TEMP