Published 2023. 3. 24. 11:41

서브클래스, 서브타입, 클래스들간의 각종 관계 등에 대해 정리해보고자 시리즈물로 준비했다.

나는 이 부분에 대해 전혀 모르기 때문에 간단한 정리가 될 것이다. 

1. 타입과 클래스들의 관계 그리고 리스코프 치환원칙

2.  Aggregation 과 Composition 개념

3. Subtype 과 Subclass


Aggregation 과 Composition

Composition 은 Java 개발을 하면서 “상속 대신 컴포지션을 사용하라” 라는 말로 수도 없이 많이 들어온 용어다. 그리고 알게모르게 대부분의 자바 개발자들은 Composition 을 사용하고 있으니 익숙하다..고 생각했다.

그런데 이펙티브 자바 스터디를 진행하는 과정에서 누가 화두를 꺼냈다.

Aggregation 과 Composition 의 차이는 뭔가요? 나는 몰라요….

그런데 팀원 한 분이 말씀해주신 Aggregation 이라는 용어의 정의를 듣고 나니 이 둘의 차이점이 뭔지 헷갈리게 되었다.

뿐만 아니라 이 용어 그대로 UML 에서 도 사용되고 있고 DDD 에서도 나온다고 하고~ 이 Composition 이 저 Composition 인지… 그 Composition 인지.. ㅋㅋㅋ 헷갈려.. 나는 헷갈려서 정리 해 보기로 했다~

UML 에서의 Composition 과 DDD 에서의 Composition

UML 과 DDD 모두 소프트웨어 디자인을 위한 것들이지만

UML 은 다양한 곳에서 시스템을 시각화 하기 위해 범용적으로 사용 되는 언어(?) 인 반면, DDD 는 비즈니스 도메인을 이해하고 이러한 이해를 바탕으로 디자인 하는 것에 초점을 두고 있다.

따라서 비슷한 듯.. 다른..것..같다

( DDD 에 대해서는 한 번도 공부해 보지 않았기에 잘 모르겠다..)

근데 개념으로만 보면 그냥 완전 같아보인다. DDD 를 학습하기 전까지는 비슷하게 생각하고 있어도 좋을 것 같다.

그래서 일단 UML 에서 인스턴스들 사이의 관계에 대해서라도 정리해 보았다.

UML 에서의 Assocation, Aggregation, Composition

참조한 내용이 오래된 내용이라 현재 UML 에도 맞는지는 잘 모르겠다

  • ✅ UML “Association” 은 클래스들 사이의 구조적인 연결 관계를 표현한다.
    • 마틴 파울러는 UML 의 Association 을 “어떤 한 인스턴스 가 다른 인스턴스 에게 메시지를 보낼 수 있는 능력을 나타낸다” 라고 표현했다. 객체지향 에서는 “어떤 객체가 다른 객체의 함수를 호출 하는 것” 을 “메시지를 보내는 것” 으로 표현하고는 하는데 그 메시지로 받아들여도 될 것 같다.
      • 따라서 참조인스턴스 변수, 함수의 인수, 지역변수 모두 해당 클래스 객체와 Association 관계를 갖는 것으로 볼 수 있다.
    • 어떤 관계 던 Association 이라고 표현할 수 있다(영어 뜻도 그러니..). Association 자체는 양방향이다.

Aggregation, Composition 모두 Association 의 일종이다.

Aggreagtion 과 Composition 모두 “whole-part” 관계를 표현하기 위해 사용된다.

하지만 “관계의 결합도 정도” 와 “lifecycle” 에서 차이가 존재한다.

  • ✅ Aggregation
    • Association 의 특별한 한 형태다.
    • 인스턴스들끼리 cyclic aggregation 관계를 가질 수 없다. 즉, 얘는 단방향.
    • 두 인스턴스 사이에 비교적 약한 결합 도를 가짐
    • 객체 사이에 “has-a 관계” 를 갖는다.
      • has 를 보고 당연히 ownership 이 있다고 생각했는데 “ownership 이 없다. ownership 이 있다면 뭐가 다른지는 Composition 에서 알 수 있다.
      • A 와 B 사이에 “A has a B “ 라는 Aggregation 관계가 존재한다고 해 보자. 이 때 A 가 삭제된다고 하더라도 B 에는 영향을 주지 않는다.
  • ✅ Composition
    • Aggregation 중 특별한 한 형태다.
    • 두 인스턴스 사이에 비교적 강한 결합 도를 가짐
    • 객체 사이에 part-of 관계를 갖는다.
    • ownership 이 있는 집합 관계다. 부모-자식으로 표현하면 자식의 lifetime 이 부모에 의해 컨트롤된다.
      • 즉, whole 이 직접적으로 part 를 생성하고 파괴할 능력을 가질 수도 있고다른 다른 whole 에게 part 를 전달해서 그 다른 whole 에서 이를 책임지게 될 수도 있다. ( 직접 생성하지 않았더라도, 참조를 전달받아서 그 참조 객체의 lifetime 을 통제할 수도 있다 )
      • A 와 B 사이에 “B is part of A” 라는 Composition 관계가 존재한다고 해 보자. 이 때 A 가 삭제되면 B 도 함께 삭제된다.

이렇게 보면 어느정도 Aggregation 과 Composition 의 차이가 눈에 들어온다.

 

 

위의 정의에 따라 내가 이해한 내용으로 예시를 들어보겠다.

 

 

우리 서버에서 배송지 주소를 관리한다고 해 보자.

  • 사용자가 없더라도 , 우리 서버에서 관리하고 있는 주소 데이터가 있을 것이다
    • Aggregation
  • 사용자가 따로 등록하여, “특정한 사용자에 대한” 주소로서 관리되는 데이터
    • Composition

 

 

자주 보이는 예시로는 이런것도 있다

  • Car - Wheel 의 관계
    • 바퀴 그 자체로도 독립적으로 존재할 수 있다. 바퀴가 끼워져 있던 차가 폐차 되더라도 바퀴는 차에서 떼인채로 독립적으로 존재할 수 있다.
  • 집 - 거실 의 관계
    • 집이 존재하지 않는데 어떻게 거실이라는 공간이 존재할 수 있나? 거실은 집과 독립적으로 존재할 수 없다.

Java 에서의 Association

UML 에서의 Association 처럼 생각 하면 되는 것 같다. 두 클래스 사이에 생성되는 관계로 각 클래스를 통해 생성된 객체들 사이에 형성되는 관계다.

따라서 여기서도 Aggregation, Composition 관계가 존재하고 Composition 은 Aggregation 에 포함되는 관계다.

상속보다는 Composition 을 사용하라는 OOP 원칙에서 Composition 은 사실 Aggregation 의 의미에 가깝다고 생각된다. ( whole-part 관계 의 객체를 사용하라는 것으로 생각 되어짐 ) 왜냐하면 기능을 확장하거나 추가적인 기능을 사용하기 위해 해당 기능을 제공하는 다른 객체를 참조로서 갖고 있으면서 사용하는 것인데, 여기에는 ownership 관계의 여부까지는 포함되지 않은 것 같기 때문이다.

 

참조

마틴파울러가정의하는Assocation-Aggregation-Composition

 

Association Vs. Aggregation - Is there a difference.

> > >> >> * Composition, which is exactly like Aggregation except that the >> >> lifetime of the 'part' is controlled by the 'whole'. This control >> >> may be direct or transitive. That is, the 'whole' may take direct >> >> responsibility for creating or

groups.google.com

Aggregation 과 Composition

 

Difference Between Aggregation and Composition in UML

Learn the Difference between Aggregation and Composition in UML with Definitions, Key Statistics, Examples, and the best use cases for each.

www.guru99.com

 

복사했습니다!