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… 이다.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 40. 다중 상속은 심사숙고해서 사용하자 (0) | 2020.03.16 |
---|---|
항목 39. private 상속은 심사숙고해서 구사하자 (0) | 2020.03.16 |
항목 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 정의하지 말자 (0) | 2020.03.10 |
항목 36. 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! (0) | 2020.03.10 |
항목 35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 (0) | 2020.03.10 |
댓글