파트 1 ~ 2 까지 하면서 믿을 수 없게, 컴파일 의존성을 줄였다.
파트 3에서는 파트2의 완성형에 조금 더 손을 봐, 컴파일 타임 의존성을 더 줄 일수 있다고 말하고 있다. public: 인터페이스를 변경하지 않는 수준에서 X를 변경하고 #include를 더 줄여 보도록 하라.
그렇다면 IS-A 관계보다 약한 관계는 무엇이 있을까? 그것은 HAS-A 3, USES-A 4 가 있다. 이 코드에서 public 상속과 private 상속을 사용 하는데, public 상속은 반드시 IS-A 관계여야 하므로 건들일 수 없지만 private: 상속인 B에 대해서는 HAS-A 관계로 만들 수 있을 것이다. 5
물론 X가 B의 가상 함수를 재정의 한다거나, protected 영역을 사용하지 않을 경우 이다.(.. 이럴 경우 USES-A 관계를 사용 하는게 일반 적이다. )
자! Pimpl 안에 B객체를 넣고 #include <b.h> 를 빼버리자.
파트 1, 2, 3을 종합해 보면 다음과 같다.
다음 코드는 파트 2 까지 정리된 코드이다.
파트 3에서는 파트2의 완성형에 조금 더 손을 봐, 컴파일 타임 의존성을 더 줄 일수 있다고 말하고 있다. public: 인터페이스를 변경하지 않는 수준에서 X를 변경하고 #include를 더 줄여 보도록 하라.
분석
파트 2에선 Pimple 이디엄을 사용하여, 컴파일 타임 의존성을 줄였지만, 상속에 따른 의존성을 .. 손을 댈 수가 없었다. 알다시피 상속은 매우 강한 연관관계를 유지하기 때문에, 꼭 필요한 경우에만 사용 해야만 한다. 많은 사람들은 상속해야지만 OO가 아니냐고 하겠지만, 알버트 아인슈타인의 말을 인용 1 한다면 필요할 때만 사용 해라가 된다. 2그렇다면 IS-A 관계보다 약한 관계는 무엇이 있을까? 그것은 HAS-A 3, USES-A 4 가 있다. 이 코드에서 public 상속과 private 상속을 사용 하는데, public 상속은 반드시 IS-A 관계여야 하므로 건들일 수 없지만 private: 상속인 B에 대해서는 HAS-A 관계로 만들 수 있을 것이다. 5
물론 X가 B의 가상 함수를 재정의 한다거나, protected 영역을 사용하지 않을 경우 이다.(.. 이럴 경우 USES-A 관계를 사용 하는게 일반 적이다. )
자! Pimpl 안에 B객체를 넣고 #include <b.h> 를 빼버리자.
파트3 완성형 코드
총평
각 상속의 관계를 이해 했다면, 이런 방법을 사용 할 수 있을 것이다. 처음보다 정말 줄여진 모습은 거의 환상이다!파트 1, 2, 3을 종합해 보면 다음과 같다.
- 써야만 하는 헤더파일을 추려내서 #include 한다.
- Pimpl 이디엄을 사용 한다.
- 상속 관계를 분석하여 더 감출 수 있는것을 Pimpl 에 넣어 버린다.
- 1921년 이론물리학에 대한 기여 및 광양자설을 제안한 업적으로 노벨 물리학상을 수상했다. 그의 상대성 이론은 원자력과 원자 폭탄의 기본적 이론을 제공했고, 광양자설로 광전효과 등 빛의 입자성을 효과적으로 설명하였으며, 이로 인하여 양자역학의 성립에서 주요한 기여를 하였다고 평가된다. 그가 주로 기여한 물리학의 분야는 양자역학, 통계역학과 우주론을 망라하며, 일반적으로 20세기의 가장 중요한 물리학자로 기억된다. [본문으로]
- "필요한 만큼 강한 관계를 사용하되, 더 강해서는 아니 된다" [본문으로]
- public 상속을 말함, Effective C++ 3판을 보면 public 상속의 의미에 대해서 자세히 나와 있다. 놀라운 것은, 컴파일러 조차 IS-A 관계로 받아 들인다는것에 있다. [본문으로]
- 클래스 내부에 객체를 가지고 있는 관계를 뜻함 [본문으로]
- private: 상속을 뜻 함, 마치 사용 되어서 구현되어 진 것으로 보여 이런 이름이 붙여 졌다고 함 대게 USES-A 보다는 HAS-A를 더 선호한다. 하지만 필요할 땐 반드시 USES-A 를 사용 해야 한다. [본문으로]
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 22 : 클래스 관계 - 파트 1 (난이도 5) (0) | 2008.10.19 |
---|---|
항목 21 : 가상 함수들의 재정의 (난이도 6) (0) | 2008.10.19 |
항목 20 : 클래스 동작 원리 (난이도 7) (0) | 2008.10.18 |
항목 30 : "Fast Pimpl" 이디엄 (난이도 4) (0) | 2008.10.17 |
항목 29 : 컴파일 방화벽 (난이도 6) (0) | 2008.10.16 |
항목 27 : 컴파일 시간 의존성 줄이기 - 파트 2 (난이도 6) (0) | 2008.10.16 |
항목 26 : 컴파일 시간 의존성 줄이기 - 파트 1 (난이도 4) (0) | 2008.10.16 |
항목 34 : 이름 검색과 인터페이스 - 파트 4 (난이도 9) (0) | 2008.10.16 |
항목 33 : 이름 검색과 인터페이스 - 파트 3 (난이도 5) (0) | 2008.10.16 |
항목 32 : 이름 검색과 인터페이스 - 파트 2 (난이도 9) (0) | 2008.10.15 |
최근댓글