일지

Effective C++...36

niamdank 2022. 8. 7. 13:14

"has-a(...는 ...를 가짐)" 혹은 "is-implemented-in-terms-of(...는 ...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자

객체 합성이란

어떤 타입이 다른 타입의 객체를 포함할 때의 관계를 말하며 다음과 같은 예를 들 수 있다.


class Address { ... };

class PhoneNumber { ... };

class Person {

public:

    ...

private:

    // 아래 객체들은 Person 클래스와 has-a 관계를 가진다.

    std::string name;

    Address address;

    PhoneNumber voiceNumber;

    PhoneNumber faxNumber;

};


 

※ 합성이란 용어 대신 레이어링, 포함, 통합 또는 내장이라고도 부른다.

 

is-implemented-in-terms-of 예제

이러한 관계는 일반적으로 특정 클래스를 상속받아 새로운 기능을 추가하거나 다르게 만들려고 할 때 발생한다.

 

가령 list를 상속받아 Set 클래스를 만든다고 하면 두 클래스의 관계가 is-a 관계가 될 수 없으므로 list를 Set 클래스 내부에 데이터 변수로 사용하게 되는데 이때 Set 객체는 list 객체를 써서 구현되는 형태가 된다.


template<class T>

class Set {

public:

   ...

private:

    std::list<T> rep;

};