파트 1 ~ 2 까지 하면서 믿을 수 없게, 컴파일 의존성을 줄였다.

다음 코드는 파트 2 까지 정리된 코드이다.



파트 3에서는 파트2의 완성형에 조금 더 손을 봐, 컴파일 타임 의존성을 더 줄 일수 있다고 말하고 있다. public: 인터페이스를 변경하지 않는 수준에서 X를 변경하고 #include를 더 줄여 보도록 하라.

분석

파트 2에선 Pimple 이디엄을 사용하여, 컴파일 타임 의존성을 줄였지만, 상속에 따른 의존성을 .. 손을 댈 수가 없었다. 알다시피 상속은 매우 강한 연관관계를 유지하기 때문에, 꼭 필요한 경우에만 사용 해야만 한다. 많은 사람들은 상속해야지만 OO가 아니냐고 하겠지만, 알버트 아인슈타인[각주:1]의 말을 인용[각주:2] 한다면 필요할 때만 사용 해라가 된다.

 그렇다면 IS-A 관계[각주:3]보다 약한 관계는 무엇이 있을까? 그것은 HAS-A[각주:4], USES-A[각주:5] 가 있다. 이 코드에서 public 상속과 private 상속을 사용 하는데, public 상속은 반드시 IS-A 관계여야 하므로 건들일 수 없지만 private: 상속인 B에 대해서는 HAS-A 관계로 만들 수 있을 것이다.

물론 X가 B의 가상 함수를 재정의 한다거나, protected 영역을 사용하지 않을 경우 이다.(.. 이럴 경우 USES-A 관계를 사용 하는게 일반 적이다. )

자! Pimpl 안에 B객체를 넣고 #include <b.h> 를 빼버리자.


파트3 완성형 코드




총평

 각 상속의 관계를 이해 했다면, 이런 방법을 사용 할 수 있을 것이다. 처음보다 정말 줄여진 모습은 거의 환상이다!
파트 1, 2, 3을 종합해 보면 다음과 같다.
  1. 써야만 하는 헤더파일을 추려내서 #include 한다.
  2. Pimpl 이디엄을 사용 한다.
  3. 상속 관계를 분석하여 더 감출 수 있는것을 Pimpl 에 넣어 버린다.






  1. 1921년 이론물리학에 대한 기여 및 광양자설을 제안한 업적으로 노벨 물리학상을 수상했다. 그의 상대성 이론은 원자력과 원자 폭탄의 기본적 이론을 제공했고, 광양자설로 광전효과 등 빛의 입자성을 효과적으로 설명하였으며, 이로 인하여 양자역학의 성립에서 주요한 기여를 하였다고 평가된다. 그가 주로 기여한 물리학의 분야는 양자역학, 통계역학과 우주론을 망라하며, 일반적으로 20세기의 가장 중요한 물리학자로 기억된다. [본문으로]
  2. "필요한 만큼 강한 관계를 사용하되, 더 강해서는 아니 된다" [본문으로]
  3. public 상속을 말함, Effective C++ 3판을 보면 public 상속의 의미에 대해서 자세히 나와 있다. 놀라운 것은, 컴파일러 조차 IS-A 관계로 받아 들인다는것에 있다. [본문으로]
  4. 클래스 내부에 객체를 가지고 있는 관계를 뜻함 [본문으로]
  5. private: 상속을 뜻 함, 마치 사용 되어서 구현되어 진 것으로 보여 이런 이름이 붙여 졌다고 함 대게 USES-A 보다는 HAS-A를 더 선호한다. 하지만 필요할 땐 반드시 USES-A 를 사용 해야 한다. [본문으로]
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기