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
반응형