항목 38 : "has-a(...는...를 가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자
합성이란, 어떤 타입의 객체들이 그와 다른 타입의 객체들을 포함하고 있을 경우에 성립하는 그 타입들 사이의 관계를 일컫습니다. 포함된 객체들을 모아서 이들을 포함한 다른 객체를 합성한다는 뜻입니다.
public 상속의 의미가 "is-a(...는 ...의 일종이다)"라고 공부했었습니다. 객체 합성 역시 의미를 갖고 있습니다.
두 가지의 뜻을 가지고 있는데, "has-a(...는 ...를 가짐)"을 뜻할수도 있고 "is-implemented-in-terms-of(...는 ...를 써서 구현됨)"을 뜻할수도 있습니다. 이렇게 뜻이 두 개인 이유는 소프트웨어 개발에서 대하는 영역이 두 가지이기 때문입니다.
객체 중에는 우리 일상생활에서 볼 수 있는 사물을 본 뜬 것들이 있습니다. 이를테면 사람, 이동수단, 비디오 프레임 등인데, 이런 객체는 소프트웨어의 응용 영역에 속합니다. 응용 영역에 속하지 않는 나머지들은 버퍼, 뮤텍스, 탐색 트리 등 순수하게 시스템 구현만을 위한 인공물입니다. 이런 종류의 객체가 속한 부분은 소프트웨어의 구현 영역이라고 합니다.
여기서 객체 합성이 응용 영역에서 일어나면 has-a 관계입니다. 반면, 구현 영역에서 일어나면 is-implemented-in-terms-of 관계를 나타냅니다.
꼭 잊지 말아야 할 것!
1. 객체 합성의 의미는 public 상속이 가진 의미와 완전히 다릅니다.
2. 응용 영역에서 객체 합성의 의미는 has-a(...는...를 가짐)입니다. 구현 영역에서는 is-implemented-in-terms-of(...는...를 써서 구현됨)의 의미를 갖습니다.
'언어 > C++' 카테고리의 다른 글
[Effective C++] 다중 상속은 심사숙고해서 사용하자 (0) | 2020.02.09 |
---|---|
[Effective C++] private 상속은 심사숙고해서 구사하자 (0) | 2020.02.08 |
[Effective C++] 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 (0) | 2020.02.06 |
[Effective C++] 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! (0) | 2020.02.05 |
[Effective C++] 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 (0) | 2020.02.04 |