목록C++ (43)
방프리
항목 40. 함수자 클래스는 어댑터 적용이 가능하게(adaptable) 만들자 - 이 항목을 살펴보기 전 우리는 먼저 ptr_fun에 대해 알아보아야 합니다. ptr_fun이란 typedef 타입 몇 개를 쓸 수 있도록 만들어 주는 것입니다. 왜 typedef 타입으로 해주어야 할까요? STL의 4대 표준 함수 어댑터(not1, not2, bind1st, bind2nd)가 모두 typedef 타입으로 동작하기 때문입니다. 표준 STL이 아닌 SGI, Boost 등도 마찬가지 입니다. 그래서 typedef를 제공하는 함수 객체를 "어댑터 적용이 가능하다"라고 하고 제공하지 않는 함수 객체를 "어댑터 적용이 불가능하다" 라고 정의합니다. typedef를 제공하는 함수 객체는 그렇지 않은 것보다 더 많은 일을..
항목 46. 알고리즘의 매개 변수로는 함수 대신 함수 객체가 괜찮다. - 프로그래머가 코딩을 할 때 추상화의 정도가 높아질수록 코드의 효율을 떨어지게 됩니다. ( 상속 받는 부모의 클래스의 양이 많아지기 때문인 것 같습니다.) 간단한 예로 double을 가진 클래스를 조작하는 코드는 double을 직접 조작하는 코드보다 느리다는 것을 알 수 있습니다. 하지만 STL 함수객체를 알고리즘에 넘기는 게 진짜 함수를 넘기는 것보다 빠릅니다. (말이 안되죠;; 방금 위에서는 간접 조작이 느리다고 해놓고선) 예로 double의 백터를 내림차순으로 정렬한다 코딩을 한다면 이렇게 할 것입니다. vector v; ... // 이외의 코드 sort(v.begin(), v.end(), greater()); 만약 위의 내용을..
항목 1. 적재적소에 알맞는 컨테이너를 사용하자. - 각각의 컨테이너에는 장, 단점이 존재합니다. 프로그래머는 컨테이너들의 기능에 대해 잘 숙지하고 만들고자 하는 기능에 맞게 컨테이너를 사용할 줄 알아야 합니다. 항목 2. "컨테이너에 독립적인 코드" 라는 환상을 조심하자. - 컨테이너를 사용할 때 항상 하나의 컨테이너만 사용한다는 고정관념을 버려야 합니다. 유지보수나 제작 시에도 해당 기능의 방향이 달라질 수 있음을 고려해야 한다는 것입니다. 예를 들어 처음엔 vector 컨테이너가 적합하다고 생각하다가 나중엔 list 컨테이너로 바꾸어야할 상황이 올 수도 있기 때문입니다. 해결방법으로는 typedef를 활용하여 컨테이너를 선언하는 것입니다. ex) typedef std::vector VInt; VIn..
항목 34 : 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 public 상속의 개념을 두 가지로 분류해서 나누어 볼 수 있습니다. (1). 함수 인터페이스의 상속 (2). 함수 구현의 상속 이 두가지를 간단하게 나누어보자면 함수인터페이스 상속 = 순수가상함수 함수 구현의 상속 = 단순가상함수 로 나눌 수 있습니다. 다음 예제 코드를 보면서 천천히 살펴보겠습니다. ex1) class Shape { public: virtual void draw() const = 0; //순수가상함수 virtual void error(const std::string&); //단순가상함수 int ObjectID() const(); //비가상함수 ... }; class Rectangle : public Shap..

항목 33: 상속된 이름을 숨기는 일은 피하자 이 세상에 존재하는 모든 것들은 이름을 가지고 있습니다. 사람들도 각각 이름을 가지고 있으며 동물, 식물들도 모두 이름을 가지고 있죠. 이번 항목에서는 모든 존재하는 것들이 이름을 가지듯이 프로그래밍에서도 이름이 중요하다는 것을 필자는 강조하고 있습니다. 일단 예제 코드를 먼저 보겠습니다. ex1) int x; // 전역 변수 void someFunc() { double x; //지역 변수 std::cin >> x; //입력을 받아, 지역변수 x에 새 값을 읽어 넣는다. } 어떤 변수에 사용이 될까요?? 전역 변수인 x? 아님 지역변수인 x??? 정답은 바로 지역변수인 x입니다. 이유가 궁금하신 분들을 위해 그림으로 간단하게 표현해보겠습니다. (그림 1-1)..
항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 객체 지향 OOP의 3대 요소 중 하나인 상속!! 짚고 넘어가지 않을 수 없는데요. 책에서도 다른 건 다 까먹어도 되지만 이 항목만큼은 항상 기억하고 넘어가야 한다고 강조하고 있습니다. 그만큼 중요하다는 뜻이겠죠? 일반적으로 public 상속은 "...는 ...의 일종이다~" 라고 정의할 때 사용합니다. 이해가 잘 안되시죠? 차근차근 예를 들어서 살펴보겠습니다. 간단한 몬스터를 생성하는 클래스를 통해 알아보겠습니다. ex1) class cMonster { //do Something };//몬스터 모두를 지징하는 클래스 class cGoblin : public cMonster { //do Somethi..
항목 31 : 파일 사이의 컴파일 의존성을 최대로 줄이자 C++로 코딩을 하면서 기초로 배우는 것이 바로 #include란 키워드 입니다. .h파일을 포함함으로써 헤더파일 안에 있는 클래스의 정의나 구현부를 컴파일할 때 불러오는 역할을 하는 키워드인데요. 이번 항목에서는 #include 의 사용을 줄이자? 라고 할 수 있겠네요. C++의 클래스 정의는 클래스 인터페이스 뿐만 아니라 세부 구현 사항까지 많은 부분을 다루고 있습니다. 예를 들어 MMORPG게임의 경우엔 User 클래스 안에 수 많은 변수와 구현 함수들이 존재하죠. (기존 3~4만줄은 그냥 뛰어 넘는다고 보시면 됩니다.) 이렇게 수많은 작업을 처리하는 클래스에서 일을 하려면 같이 작업 해야하는 수 많은 클래스들을 User 클래스는 알아야 하기..
항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자 - inline 함수... 정말 좋은 키워드입니다. 원래라면 함수를 호출할 때 메모리에 함수의 이름을 저장 한 후 함수를 호출 시 메모리에 기록된 함수의 포인터를 보고 함수를 실행시키는데요. 인라인 함수는 그 과정을 다 무시하고 함수의 내용 자체를 메모리에 올리도록 해줍니다. 그 덕분에 실행속도도 일반 함수에 비해 굉장히 빨라지게 됩니다. 최적화에 정말 도움이 많이 되는 키워드죠 하지만 이런 좋은 inline 함수도 나름의 단점을 가지고 있습니다. 1) 최적화에 오히려 방해가 될 수 있습니다. - inline 함수는 함수의 내용을 통째로 컴파일러에 요청을 하는 것입니다. 즉, 내용이 많으면 많을 수록 처리량 또한 많아진다는 뜻이죠. 2) 라이브..