Back-end/C++

22. 03. 28 - 포함 ( Compositon, Aggregation )

giggs 2022. 4. 6. 09:41

 

객체 간에 관계를 맺는 방법 - 상속과 포함

 

 

 

포함

  • 계층구조로 관계를 맺으면 – 상속( 생물학적 관계 X )
  • 어떤 객체가 다른 객체를 멤버로 가지고 있으면 - 포함
  • Composition - 합성 – 포함된 객체가 생명주기를 같이 하는 경우 – 강한 결합 - 포함관계
  • Aggregation – 집합 – 포함된 객체가 생명주기를 달리 하는 경우 – 약한 결합 - 참조 관계

 

 

 


 

 

 

포함 - Compositon  : 사각형의 점

 

 

 

1. Point - 포인터 클래스 만들기

  • 점 ( . )이라는 것을 추상화 작업
  • 2D공간상에 x값 y값 저장하는 부분 필요

 

 

 

 

 

 

2. Rectangle - 사각형 클래스 만들기

  • 4개의 점이 아닌 - 2개의 점으로 넓이를 구한다.
  • 우리가 필요한 선은 점 2개면 된다. - toppt, bottompt

 

 

Rectangle 클래스의 멤버로 Point 클래스의 객체를 가지고 있다.

 

 

 

20번 Line

  • Rectangle 클래스에 Point 객체를 멤버로 가지고 있다. - 포함 ( Composition )
  • Rectangle 객체가 생성될 때 같이 생성되고, 소멸될 때 같이 소멸된다 – 이런 관계를 Compositon 
  • Compositon - 합성 - 포함된 객체가 생명주기를 같이 하는 경우 - 강한 결합 - 포함 관계

 

 

 

 

 

 

다른 사례로 간단히 살펴보면

 

 

 

Human 클래스는 멤버로 Head 객체를 가지고 있다.

 

 

  • human 클래스에 head객체를 멤버로 가지고 있다.
  • human 객체 생성될 때 head 객체 생기고 - 
  • human 객체 소멸할 때 head 객체 같이 소멸한다.

 

 

 

 


 

 

 

포함 - Aggregation  : 자동차와 바퀴

 

 

 

1. Car 클래스 만들기

2. Wheel 클래스 만들기

 

 

 

Car 클래스의 멤버로 Whell* 객체의 포인터형을 가지고있다.

 

 

 

66번 Line

  • Car 클래스에 Wheel 객체의 포인터를 멤버로 가지고 있다. - 참조 ( Aggregation)
  • Car 객체의 생성과 소멸에 관련 없이, Wheel 객체는 생성, 소멸 따로 한다.– 이런 관계를 Aggregation
  • Aggregation – 집합 – 포함된 객체가 생명주기를 달리 하는 경우 – 약한 결합 - 참조 관계

 

 

 


 

 

 

main에서 객체 생성한 뒤 - 생성자와 소멸자 Check

 

 

 

{ } 중괄호를 빠져나올 때 소멸되는 특징을 이용

 

 

 

87번 Line - Rectangle 타입 rect 객체 생성 

  • 객체 생성 시 - Point 타입 2개가 생성되고 - Rectangle 객체 생성
  • 객체 소멸 시 - Point 타입 2개가 소멸되고 - Rectangle 객체 소멸 
  • Rectangle 객체와 Point 객체가 생명주기를 함께한다. - Compositon

 

 

99번 Line - Car 타입 car 객체 생성 

  • 객체 생성 시 - 외부에서 만든 Wheel타입 wheel객체를 참조하여 생성
  • 외부에서 Wheel 객체 만들 때 Wheel생성자 호출
  • 내부에서 Car 객체 생성될 때 - Car 생성자만 생성되고 빠져나오면서 Car 소멸자만 호출
  • 내부의 Car 객체와 상관없이 - Wheel 객체 소멸될 때 Wheel소멸자 호출
  • Car 객체와 Wheel객체가 생명주기를 함께하지 않는다 - Aggregation

 

 

 


 

 

 

+@ 동적 객체일 경우 실습

 

 

 

동적 객체 생성 new / 반납 delete

 

 

 

115번 Line - 사각형 동적 객체 생성 - Rectangle* prect = new Rectangle;

118번 Line - 사각형 동적 객체 반납 - delete prect;

 

124번 Line - Wheel 동적 객체 생성 , 131번 Line - Wheel 반납

125번 Line - Car 동적 객체 생성, 128번 Line - Car 반납

 

 

 

동적 객체를 생성하는 경우에도 

  • Compositon 관계인 사각형의 점은 : 사각형 객체 생성 시 : 포인터 객체 생성자도 호출/ 소멸 시 소멸자 호출
  • Aggregation 관계인 휠과 차는 : 휠 객체 생성 시 휠 생성자만 : 카 객체 생성시 카 생성자만 호출 / 소멸될 때도 각각 호출

 

 

 


 

 

 


review



객체 간 관계를 맺는 관계 포함에 관하여 학습하였다.

포함은 2가지로 구분!


한 클래스의 멤버로 다른 객체를 포함하고 있으면 - Compositon 관계 - 포함
한 클래스의 멤버로 다른 객체의 주소 값을 참조하고 있으면 - Aggregation 관계 - 참조

Composition 관계에서는 객체가 생성되고 소멸될 때 - 생성자와 소멸자 같이 호출
Aggregation 관계에서는 생성과 소멸되는 각자의 순간에 - 생성자 소멸자 호출


포함의 관계를 이용하여 더 다양한 방법으로 생성자를 만들 수 있었다.
만들어진 객체를 멤버로 받음으로써 코드도 더 간단해졌다.

내가 만든 클래스(A)의 멤버로 다른 클래스의 객체(B)가 있는데
나의 클래스(A)의 객체를 생성하려고 하는데
(B)가 반드시 필요한 경우에는 compositon관계로
(B)가 없어도 되거나 변경 가능한 상황에서는 aggregation 관계로


## check : 동적 객체로 생성, 소멸해보는 부분