[Effective C++] #38 객체 합성, private 영역, "has-a" ,"is-implemented-in-terms-of"

2022. 2. 9. 17:50· 언어/Effective C++
목차
  1. [Effective C++] #38 객체 합성, private 영역

[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" 관계를 갖는 "합성"으로 표현합니다.

 

[Effective C++] #32_public 상속

[Effective C++] #32_Public 상속 Scott Meyers의 "Effective C++" 를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 6장 '상속 그리고 객체 지향 설계', 항목 32 "Public 상속..

webddevys.tistory.com

 

객체 합성 != 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
  1. [Effective C++] #38 객체 합성, private 영역
'언어/Effective C++' 카테고리의 다른 글
  • [Effective C++] #40 다중 상속
  • [Effective C++] #39 private 상속
  • [Effective C++] #37 가상 함수, 기본 매개변수
  • [Effective C++] #36 비 가상 함수의 상속, 바인딩
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • dfs
  • 디자인 패턴
  • BFS
  • unreal
  • programmers
  • BOJ
  • stl
  • DP
  • 최단 경로
  • 개발
  • 그래프
  • Unreal Blueprint
  • Effective C++
  • C++
  • 정렬
  • 기술 질문
  • 알고리즘
  • 우선순위 큐
  • set
  • 트리

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[Effective C++] #38 객체 합성, private 영역, "has-a" ,"is-implemented-in-terms-of"
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.