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

Minsu._.Lighting·2023년 12월 9일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" is-a 관계와 has-a / is-implemented-in-terms-of 관계의 차이점을 이해하자!"

  • 객체 합성의 의미는 public 상속이 가진 의미와 완전히 다르다!
  • 응용 영역에서 객체 합성의 의미는 has-a, 구현 영역에서 객체 합성의 의미는 is-implemented-in-terms-of!

💡 합성

class Address { ... };

class PhoneNumber { ... };

class Person
{
public:
	...
private:
	string name;
    Address address;
    PhoneNumber voiceNumber;
    PhoneNumber faxNumber;
};
  • 어떤 타입의 객체들이 그와 다른 타입의 객체들을 포함하고 있을 경우 성립하는 관계
    - Person 객체는 string, Adress, PhoneNumber로 이루어짐

  • 레이어링, 포함, 통합, 내장 등으로도 알려져 있음



💡 객체 합성의 의미

📌 has-a(...는...를 가짐)

  • 소프트웨어의 응용 영역에 속하는 객체가 가지는 관계
    - 우리 일상 생활에서 볼 수 있는 사물을 본 뜬 것들
    (사람, 이동수단, 비디오 프레임 등)

📌 is-implemented-in-terms-of(...는...를 써서 구현됨)

  • 소프트웨어의 구현 영역에 속하는 객체가 가지는 관계
    - 순수하게 시스템 구현만을 위한 인공물
    (버퍼, 뮤택스, 탐색 트리 등)


💡 is-a 관계와의 차이점

📌 is-a 와 has-a

  • Person 클래스가 나타내는 관계는 has-a!
    - 사람이 이름의 일종(Person is a Name)이라던지, 사람이 주소의 일종(Person is Address)이라고는 너무 어색하다
    - 사람이 이름을, 주소를 갖는다(Person has a Namem / Address)가 자연스럽다

📌 is-a와 is-implemented-in-terms-of

[ 예시 ]
중복 원소가 없는 집합체를 나타내고 = set
저장 공간도 적게 차지하는 클래스의 템플릿이 필요! = list
...
...
...
set과 list로 구현 해보자!

  • is-a 관계로 만들어 볼까?
template<typename T>
class Set : public list<T>
{
	...
};

- is-a 관계이기 위해서는 list에서 참인것들이 set에서도 모두 참이어야 함, 하지만 set은 중복원소를 가지면 안되지만 list는 중복원소를 갖을 수 있다...

  • is-implemented-in-terms-of 관계로 만들어야 겠네!
template<class T>
class Set
{
public:
	bool member(const T& item) const;
    
    void insert(const T& item);
    void remove(const T& item);
    
    size_t size() const;
    
private:
	list<T> rep;
};

profile
오코완~😤😤

0개의 댓글

관련 채용 정보