본문 바로가기

책 정리/Effective C++ 2판

(50)
항목 45 ~ 50까지 요약정리 항목 45. C++가 은밀하게 어떤 함수를 만들어 주고 호출하는지 이해하기 항목 46. 실행시간 에러보다는 컴파일 시간과 링크 시간 에러가 좋다 항목 47. 비지역 정적 객체는 사용되기 전에 초기화하도록 해야 한다. 항목 48. 컴파일러의 경고에 주의를 기울여라 항목 49. 표준 라이브러리를 잘 알아두어라 항목 50. C++에 대한 이해를 넓혀라 44항목까지 읽었다면, 45 ~ 50 까지는 제목이 바로 요약이다! 2판을 했으니 More Effective C++ 로 넘어 간다. 열혈강의 C++ -> Effective C++ 2판 -> More Effective C++ -> Effective C++ 3판 으로 갈 생각이다 C++에 대해선
항목 44. 의미하는 바를 표현하도록 하라; 자신이 표현한 것의 의미를 이해하도록 하라. 항목 44. 의미하는 바를 표현하도록 하라; 자신이 표현한 것의 의미를 이해하도록 하라. 이유 1. 클래스 설계시의 난해함이 있다. 해결 방법 1. 의미하는 바를 표현하도록 하라; 자신이 표현한 것의 의미를 이해하도록 하라. 개인적인 생각 1. 클래스 설계 항목들에 대해서 빠짐없이 이해해라는 것을 말한다. 이번 장은 이렇게 마무리! 알아야 할것 1. public 계승의 쓰임은? 2. private 계승의 쓰임은? 3. 레이어링 계승의 쓰임은? 4. 순수 가상 함수의 쓰임은? 5. 단순 가상 함수의 쓰임은? 6. 비가상 함수의 쓰임은? 어떻게 쓰이는지를 알아야 한다고 필자는 설명했다.
항목 43. 다중 계승을 바르게 사용하도록 하라 항목 43. 다중 계승을 바르게 사용하도록 하라 이유 1. 모호함이 생김(항목 26) 2. 다이아몬드 형태의 계승이 이루어 지게 된다. 해결방법 1. 이유 1번을 처리하기 위한 클래스(인터페이스만을 위한)를 만들어 사용한다. 2. 가상 베이스 클래스를 선언한다..( 등등.. 너무 길다) 3. 다중 계승 .. 유혹을 피해야 한다! 개인적인 생각 필자는 다중 상속에 따라 클래스가 거대해 질수록 점점 복잡해짐을 설명하고 있다. 물론 다중상속을 해선 안된다고 말하진 않는다. 단지 복잡하다는것 뿐이다. 복잡함은 가독성을 떨어뜨리고, 코드의 수정이 더불어 복잡해 짐을 나타낸다. 나의 경우, 점점 복잡함에 따라, 피하는것이 아닌, 포기하는 것이다!
항목 42. private 계승을 바르게 사용하라. 항목 42. private 계승을 바르게 사용하라. 이유 1. 환상코드의 필요 조건이 된다! 깔끔한 코드로 유지 할수 있지만, 몇가지 주의점이 있다. 2008/07/18 14:45 수정 해결 방법 1. private 계승을 똑바로 이해해야 한다. 이것은 각종 상속에 따른 데이터 접근에 대해서 이해가 필수조건이다. 클래스 내부의 public protected private의 인터페이스를 public projected private 로 상속했을때의 접근도를 이해해야만 한다. 코드로 표현하고, 주석을 달아 둔다. 2008/07/18 14:45 수정 #include class Base { public: int ba; protected: int bb; private: int bc; }; class Derived ..
항목 41. 계승과 템플릿과의 차이점을 이해한다. 항목 41. 계승과 템플릿과의 차이점을 이해한다. 이유. 1. 코드 재사용을 위해서 (코드 재사용은 정말 중요하다. 물론 개념 재사용도 중요하다..) 해결 방법 1. 계승과 템플릿과의 차이점을 이해한다. 계승이란? 1. 다른 클래스에 있는 데이터와 메소드를 흡수하는것을 계승이라 한다. 템플릿이란? 1. 동일한 작업의 처리되는 데이터를 사용자가 지정하는 것을 템플릿 이라 한다. 어떨 때 계승과 템플릿을 구분지어 사용 하는가? 계승은 객체의 타입이 클래스에 정의된 함수들의 동작 원리에 영향을 미치는 경우 템플릿은 객체의 타입이 클래스에 정의된 함수들의 동작 원리에 영향을 미치지 않을 경우 개인적인 생각. 역시 프로그래머의 능력은 설계와 최적화에서 평가 된다. (구현은 기본이고..)
항목 40. 레이어링을 통해 가지고 있는 것과 사용하여 구현된것을 모델링하도록 한다. 항목 40. 레이어링을 통해 가지고 있는 것과 사용하여 구현된것을 모델링하도록 한다. 이유 1. 클래스 디자인의 일관성과 편의성을 제공해주기 때문이다. 해결방법 1. is a 관계 계승과 has a 관계(is implemented in terms of 관계)의 차이점을 인지해라. 개인적인 생각 1. public 상속을 통해서도 구현은 가능하다. 하지만 일관성이 떨어진다. 이 일관성이 떨어지는 시점에서, 클래스 디자인은 무너지게 된다. 2008/07/18 12:15:47 추가 설명, 일관성이랑 is-a 관계의 일관성을 뜻한다. 2. 그래서 상속관계에 대해서는 충분히 사용법에 따라 분류해야 한다. 예) isa 와 hasa 의 차이점을 이해하여, 3. 사람은 한 손으로 다른것을 들고 있을땐, 그 손은 다른것을..
항목 39. 계층도의 아래쪽 클래스로 다운캐스트 하지 않도록 한다. 항목 39. 계층도의 아래쪽 클래스로 다운캐스트 하지 않도록 한다. 캐스트(cast)란? 사전적 의미 : http://endic.naver.com/endic.nhn?docid=182460&rd=s 형 변환을 말하며, C 스타일은 (원하는 형) 으로 쓴다. 예) int a = 3; (double)a .....; 식 C++ 스타일 4종 캐스트 변환이 있으며, 기존 C를 보다 구체적으로 분류하여 가독성과 안정성을 고려한방식이다. static_cast, dynamic_cast, const_cast, 절대권력자 reinterpret_cast 사용법은 인터넷에 널려 있다. 그렇다면 다운 캐스트(down cast)란? 부모클래스를 가리키는 포인터를 자식을 가리키는 포인터로 바꾸는것 을 다운 캐스트라 한다. (부모에서..
항목 38. 계승된 부재 인자값을 재정의하지 않도록 한다. 항목 38. 계승된 부재 인자값을 재정의하지 않도록 한다. 여기서 계승된 메소드는 가상함수일때로 국한한다는 전제조건이 따른다. 부재 인자값(default argument)이란? 기본 인자값을 말한다 (void hehehe(int a = 1); 여기서 a가 기본 인자다. 사실 부재인자도 맞는 말이다.) 2008/07/16 15:06:11 추가, 영문 표기가 오히려, 한글 표기보다 직관적일 경우가 많이 있는것 같다. 이유 1. 부모클래스의 메소드에서 설정했던 기본 인자값으로 ... 자식클래스의 메소드에서 기본 인자값이 ... 자동 셋팅 되기 때문이다. 2008/07/16 15:06:11 수정 1. 부모 클래스에서 멤버 함수의 디폴트 매개변수는 정적바인딩 되기 때문에 동적 바인딩 되는 멤버 함수가 호출되더라도..