[Effective C++] #38 객체 합성, private 영역
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 6장 "상속, 그리고 객체 지향 설계", 항목 38 "has-a 혹은 is-implemented-in-terms-of를 모형화할 때는 객체 합성을 사용하자"에 해당하는 내용입니다.
객체 합성
class Address {...};
class PhoneNumber {...};
class Person
{
public:
...
private:
std::string Name;
Address addr;
PhoneNumber voiceNumber;
PhoneNumber faxNumber;
}
"객체 합성"이란, 어떤 타입의 객체가 다른 타입의 객체들을 포함하고 있을 경우에 성립합니다. 이때, 합성의 의미는 두 가지를 갖고 있습니다. 하나는 "has-a", 다른 하나는 "is-implemented-in-terms-of"입니다. 이렇게 나누어지는 이유는 개발의 영역이 두 가지이기 때문입니다. 소프트웨어 개발은 사물 등을 일컫는 객체의 영역, 응용 영역, 그리고 응용 영역 밖의 구현 영역이 있습니다. 응용 영역의 객체들 사이에서 "합성"이 발생하면, "has-a" 관계를 갖게 되고, 구현 영역에서 발생하면 "is-implemented-in-terms-of" 관계입니다. 위 예제 코드를 살펴보겠습니다. Person은 주소 혹은 이름의 일종(is-a)라고 하기에 어색하죠. 사람은 주소 혹은 이름을 갖고 있다고 표현하는게 맞겠습니다. 따라서, Person has an address, 즉 "has-a" 관계를 갖는 합성입니다.
"is-a-implemented-in-terms-of", 구현 영역의 합성
template <Typename T>
class Set
{
public:
bool member(const T& item) const;
void insert(const T& item);
void remove(const T& item);
...
private:
std::list<T> rep; // 템플릿 클래스, SET의 내부에 존재하는 LIST 템플릿
}
먼저 예제 코드를 살펴보겠습니다. SET(중복 원소가 없는 집합, set 템플릿) 내부에 List(리스트 자료구조)를 멤버로 갖고 있습니다. Set은 중복이 없는 원소들을 갖는 자료구조입니다. 반면에, List는 내부에 중복 원소를 가질 수 있습니다. 따라서 두 객체의 관계는 "public 상속", 즉 "is-a" 관계가 성립될 수 없습니다. (public 상속에 대한 자세한 내용은 아래 링크를 참고해 주세요) 그러므로, 위 예제 코드의 경우, 구현 영역의 "has-a" 관계를 갖는 "합성"으로 표현합니다.
객체 합성 != Public 상속, 응용 영역의 객체 합성 = "has-a" 관계, 구현 영역의 객체 합성 = "is-implemented-in-terms-of".
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #40 다중 상속 (0) | 2022.02.17 |
---|---|
[Effective C++] #39 private 상속 (0) | 2022.02.16 |
[Effective C++] #37 가상 함수, 기본 매개변수 (0) | 2022.02.09 |
[Effective C++] #36 비 가상 함수의 상속, 바인딩 (0) | 2022.02.04 |
[Effective C++] #35 Public 가상 함수의 대안, NVI, 전략 패턴 (0) | 2022.02.03 |