[OOP] Association vs Aggregation vs Composition

저에게 있어서 객체지향의 요소 중에 헷갈리는 개념들 있습니다.

연관, 집합, 구성인데요.

검색 중에 좋은 자료를 찾아서 올려봅니다.

사실 집합(Aggregation)과 구성(Composition)은 Association의 종류라고 보면 됩니다.

  • Aggregation: weak Has-a of Association
  • Composition: Strong Has-a of Association

Screen Shot 2013-10-22 at 1.43.54 PM

 

코드로 간단히 살펴보면 다음과 같을 것입니다.

만약 자동차를 가지고 예를 들어 보자. 그럼 자동차 클래스를 집합과 구성으로 예를 들어 볼 것이다.

다음은 엔진 클래스이다.

  1. @interface Engine : NSObject
  2. - (instanceType)initWithCapacity:(NSInteger)capa
  3.                  andSerialNumber:(NSInteger)serialNum;
  4. @end
  5.  
  6. @implementation Engine
  7. {
  8.     NSInteger _engineCapacity;
  9.     NSInteger _engineSerialNumber;
  10. }
  11.  
  12. - (instanceType)initWithCapacity:(NSInteger)capa
  13.                  andSerialNumber:(NSInteger)serialNum
  14. {
  15.     [super init];
  16.     _engineCapacity = capa;
  17.     _engineSerialNumber = serialNum;
  18.     return self;
  19. }
  20. @end

Aggregation의 예이다.

  1. #import "Engine.h"
  2.  
  3. @interface Car : NSObject
  4. - (instanceType)initWithMake:(NSString *)make
  5.                     withYear:(NSInteger)year
  6.                    andEngine:(Engine*)engine;
  7. @end
  8.  
  9. @implementation Car
  10. {
  11.     NSString *_make;
  12.     NSInteger _year;
  13.     Engine _engine;
  14. }
  15.  
  16. - (instanceType)initWithMake:(NSString *)make
  17.                     withYear:(NSInteger)year
  18.                    andEngine:(Engine*)engine
  19. {
  20.     [super init];
  21.     _make = make;
  22.     _year = year;
  23.     _engine = engine;
  24.  
  25.     return self;
  26. }
  27. @end

이것은 구성(Composition)의 예이다.

  1. #import "Engine.h"
  2.  
  3. @interface Car : NSObject
  4. - (instanceType)initWithMake:(NSString *)make
  5.                     withYear:(NSInteger)year
  6.            andEngineCapacity:(NSInteger)engineCapa
  7.        andEngineSerialNumber:(NSInteger)engineSerialNum;
  8. @end
  9.  
  10. @implementation Car
  11. {
  12.     NSString *_make;
  13.     NSInteger _year;
  14.     Engine *_engine;
  15. }
  16.  
  17. - (instanceType)initWithMake:(NSString *)make
  18.                     withYear:(NSInteger)year
  19.            andEngineCapacity:(NSInteger)engineCapa
  20.        andEngineSerialNumber:(NSInteger)engineSerialNum
  21. {
  22.     [super init];
  23.     _make = make;
  24.     _year = year;
  25.     _engine = [[Engine alloc] initWithCapacity:engineCapa
  26.                                andSerialNumber:engineSerialNum];
  27.  
  28.     return self;
  29. }
  30. @end

 

출처: http://guruzon.com/1/oop-concepts/inheritance-and-composition/aggregation-vs-composition-vs-association-difference-comparison-between

Update 2015.12.15

20151215_UML_Notations

우리는 소프트웨어 설계를 할 때 의존도를 낮추어야 한다. 위 이미지는 UML 다이어그램에서 사용하는 노테이션 설명과 함께 약한 커플링에서 타이트한 커플링을 보여주는 그림을 직접 그려보았다. 첫번째 표에서 연관(Association)을 사용한다(‘uses a’)라는 개념으로 기술하고 있다. 하지만 집합과 컴포지션은 연관안에 속해있으며, 구지 분별하여 표현하자면, 연관은 ‘Has a’, 집합은 ‘Owns a’, 그리고 컴포지션은 ‘part of’으로 구분을 짓는 것이 이해하는 것에도 암기하는 것에도 도움이 될 것 같다는 생각을 한다.