본문 바로가기
책 정리/Effective C++ 3rd

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

by ocean20 2020. 3. 12.

1. 결론 :  public 상속을 없다면, 객체합성(has-a, is-imple…) 사용하자

 

2. 용어정리

  1) 합성(composition) - 어떤 타입의 객체들(ex. Person) 다른타입의 객체들(ex. Address, Phonenumber) 포함할때,  성립하는 관계를 뜻함

class Address {…};
class Phonenumber {…};

class Person{
private:
  string name;
  Address address;
  Phonenumber pn;
};

 

  2) 객체합성 - has-a, is-imple… 두가지 뜻으로 나뉜다.

  why? - sw개발자는 2가지 영역을 마주하기 때문이다.

 

  3) 2가지 영역과 객체합성

    (1) 응용영역 - 실제로 가치가 있는 데이터를 다룸(ex. 사람, 이동수단, 비디오 프레임 등등)

    (2) 구현영역 - 시스템 구현만을 위한 영역(ex. 뮤텍스, 탐색트리 등등)

    * 만약 객체합성이 응용영역에서 일어나면, has-a 관계, 구현영역에서 일어나면, is-imple.. 관계를 나타낸다.

 

    (3) has-a 관계

    - - 가진다. 사람은 주소를 가질 있으나, 사람이 주소의 일종은 아니다. is-a 헷갈릴 이유가 없다.

    (4) is-implemented-in-terms-of 관계

    이는 B 이용하여 A 구현한다. , A B 가진다가 아니라, A B 기능몇개를 빌려와 구현하였다.

 

3. 구현 예

STL set 비슷한  내가 구현할 set의 짭퉁 "Set" std::list 이용하여 구현해보자.

(STL의 set 정의는 정렬된 집합을 뜻하며, 중복된 값을 가질 없다.)

 

Q. 어떻게 구현가능할까?

상속관계를 생각해보자. is-a관계를 떠올려보자. Set is a List ? 이 관계가 성립할 수 있을? 다시말해, std::list 모든 프로퍼티와 메소드를 내가 구현할 Set에서도 똑같이 적용할 있을까? 답은 no이다. 이유는 std::list 중복값 삽입이 가능하기 때문이다. (set의 정의와 반대되므로 모순이다.)

 

A. 합성관계를 생각해보자.

이 글의 처음 결론에서 얘기한것처럼 is-a 관계가 성립하지 않을시 합성 관계를 쓴다고하였다.

합성관계는 2가지로 나뉘니 한가지씩 생각해보자.

1. has-a 관계

  Set List 가진다??

2. is-imple…

  Set 이용하여 List 만든다??

 

2번, is-imple... 적절한것으로 보인다.

 

이것만은 잊지 말자

- 객체 합성의 의미는 public 상속이 가진의미와 전혀 다르다.

- 응용영역 has-a, 구현영역 is-imple… 이다.

댓글