[Effective C++] 38. "has-a(..는..를 가짐)" 혹은 "is-implemented-in-terms-of(..는..를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자
728x90
반응형
합성
항목 32에서 public 상속의 의미는 "is-a(.. 는.. 의 일종이다)"라는 사실을 알았다.
객체의 합성 또한 두 가지 의미를 가지고 있는데, "has-a(.. 는.. 를 가짐)"과 "is-implemented-in-terms-of(.. 는.. 를 써서 구현됨)"을 뜻할 수도 있다.
Has-a(.. 는.. 를 가짐)
class Address {...};
class PhoneNumber {...};
class Person
{
public:
...
private:
std::string name;
Address address;
PhoneNumber voiceNumber;
};
위의 예시를 보면 Person은 name과 address, voiceNumber 등을 가지고 있다. 이렇게 소유의 개념이 들어간다면 has-a 관계가 성립됨을 알 수 있다.
Is-implemented-in-terms-of(.. 는.. 를 써서 구현됨)
template<class T>
class Set
{
pubilc:
bool member(const T& item) const;
void insert(const T& item);
void remove(const T& item);
std::size_t size() cosnt;
private:
std::list<T> rep; // Set 데이터의 내부 표현부
};
---
template<typename T>
bool Set<T>::member(const T& item) const
{
return std::find(rep.begin(), rep.end(), item) != rep.end();
}
template<typename T>
void Set<T>::insert(const T& item)
{
if(!member(item)) rep.push_back(item);
}
template<typename T>
void Set<T>::remove(const T& item)
{
typename std::list<T>::iterator it = std::find(rep.begin(), rep.end(), item); // 항목 42에서 얘기함
if(it != rep.end()) rep.erase(it);
}
template<typename T>
std::size_t Set<T>::size() const
{
return rep.size();
}
위의 예시에서 Set 객체는 list 객체를 써서 구현되는 형태의 설계로 이루어져 있음을 알 수 있다.
STL 컨테이너 규약에 맞춰서 구현했으면 좋지 않냐는 말을 할 수도 있지만, 여기서는 Set과 list의 관계에 대해서 집중하므로 이 관계는 is-a 관계가 아니라 is-implemented-in-terms-of이다.
요약
- 객체 합성의 의미는 public 상속이 가진 의미와 완전히 다르다.
- 응용 영역에서 객체 합성의 의미는 has-a(.. 는.. 를 가짐)이다. 구현 영역에서는 is-implemented-in-terms-of(.. 는.. 를 써서 구현됨)의 의미를 가진다.
728x90
반응형
'Books > Effective C++' 카테고리의 다른 글
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자 (0) | 2022.07.03 |
---|---|
[Effective C++] 39. private 상속은 심사숙고해서 구사하자 (0) | 2022.07.03 |
[Effective C++] 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 (0) | 2022.07.02 |
[Effective C++] 36. 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! (0) | 2022.07.02 |
[Effective C++] 35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 (0) | 2022.06.26 |
댓글
이 글 공유하기
다른 글
-
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자
[Effective C++] 40. 다중 상속은 심사숙고해서 사용하자
2022.07.03 -
[Effective C++] 39. private 상속은 심사숙고해서 구사하자
[Effective C++] 39. private 상속은 심사숙고해서 구사하자
2022.07.03 -
[Effective C++] 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자
[Effective C++] 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자
2022.07.02 -
[Effective C++] 36. 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물!
[Effective C++] 36. 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물!
2022.07.02