저번장까지는 설계에 관한 이야기보다는 상속시 유의해야 되는 부분이 강조되었다면, 이번 항목은 .. 설계에 관한 부분이다. 나는 지금까지 private 상속이면 "is-implemented-in-terms-of(...는...를 써서 구현됨)" 이고 클래스 내부에서 객체선언하면 "has-a(...는...를가짐)" 이다 라고 이해했지만, 이것은 잘못된 이해이다.

각각은 추상화된 설계 패턴의 일부분이라는 것이다.  이 패턴 들은 객체 합성으로(.. 이라고 불리지만, 레이어링, 포함 통합 내장 으로도 불린다)으로 만들수 있다는 것이다.


그렇다면 다시 제목을 봐보자..
항목 38: "has-a(...는...를가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화 할 때는 객체 합성을 사용하자.

이 말은, 특정 객체를 상속해야지만 만들수 있는 객체가 public 상속을 할수 없다면, 객체 합성으로 만들자. 라고 이해해도 무리는 없을 것이다.


그렇다면 "has-a(...는...를가짐)"  객체 합성 과 "is-implemented-in-terms-of(...는...를 써서 구현됨)"의 차이점은 무엇일까?
"has-a(...는...를가짐)"은 사람, 주소, 전화번호 등 데이터로써 가치가 있는 객체 합성을 뜻하며
"is-implemented-in-terms-of(...는...를 써서 구현됨)"은 사람을 찾는 방법, 주소를 찾는 방법, 전화번호를 찾는 방법 등, 무엇인가를 위한 알고리즘으로써 가치가 있는 객체 합성을 뜻한다.

.. 역시 말로만 하면 이해가 안가니, 소스코드로 포함을 하려 한다.


크게 각각의 차이를 아는것도 도움이 되겠지만, 이번 항목에서는 두 패턴의 차이를 중점으로 이야기 한것이 아니다. 이번 항목에선,특정 객체를 구현함에 있어, public 상속이 모순이 된다면, 객체 합성이 더 좋은 선택이라고 말하는 것이다.


착각을 정리
"is-implemented-in-terms-of(...는...를 써서 구현됨)" 상속(.. 합성이겠지)은 설계 패턴이다.
private: 상속은 "is-implemented-in-terms-of(...는...를 써서 구현됨)" 상속 을 뜻한다!
그렇다고 "is-implemented-in-terms-of(...는...를 써서 구현됨)" 패턴이 private: 상속은 아니다!


관련링크
http://ikpil.tistory.com/341
http://evax.springnote.com/pages/871732
http://yatoyato.tistory.com/1105
http://www.winapi.co.kr/clec/cpp3/29-4-2.htm
http://swblog.net/STEP-9-상속구현-2-More-inheritance
http://www.xevious7.com/49

신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. 감자1호 2010.09.03 17:08 신고  Addr  Edit/Del  Reply

    감사합니다. ^^

  2. somy 2012.02.01 15:38 신고  Addr  Edit/Del  Reply

    이 말은, 특정 객체를 상속해야지만 만들수 있는 객체가 public 상속을 할수 없다면, 객체 합성으로 만들자. 라고 이해해도 무리는 없을 것이다.
    ---> 이 말이 참 이해하기 쉬운 말이네요... 너무 고마워서 댓글을 남깁니다.