컴포지션(Composition)이란?
컴포지션은 객체 간의 강한 소유 관계를 나타내는 개념입니다. 컴포지션 관계에서는 부모 객체가 삭제되면 그 안에 포함된 자식 객체도 함께 소멸됩니다. 즉, 자식 객체는 부모 객체 없이는 독립적으로 존재할 수 없습니다.
컴포지션은 집계(Aggregation)의 특수한 형태로, 두 객체 사이에 '부분(part-of)' 관계를 형성한다는 점이 특징입니다.
가장 대표적인 예로 자동차와 엔진을 들 수 있습니다. 자동차(Car)는 엔진(Engine)을 가지고 있으며, 자동차가 폐차되어 파괴되면 그 안의 엔진 역시 함께 파괴됩니다.
public class Engine {
. . .
}
public class Car {
Engine eng = new Engine();
.......
}위 코드에서 볼 수 있듯이, Car 클래스 내부에서 Engine 객체를 직접 생성(new)하고 있습니다. 이처럼 자식 객체의 생명주기를 부모 객체가 완전히 통제하는 것이 컴포지션의 핵심입니다.
집계(Aggregation)란?
집계는 C#에서 객체들 사이의 방향성 있는 관계를 나타냅니다. 컴포지션과 달리 자식 객체는 부모 객체와 독립적으로 존재할 수 있으며, 필요에 따라 여러 객체와 공유될 수도 있습니다.
대표적인 예로 직원(Employee)과 주소(Address)의 관계를 들 수 있습니다.
한 명의 직원은 하나의 부서(Department)에 속하지만, 하나의 부서에는 여러 명의 직원이 속할 수 있습니다. 마찬가지로 주소 정보 역시 직원 객체가 사라지더라도 독립적으로 계속 존재할 수 있습니다.
예제 코드
public class Address {
. . .
}
public class Employee {
private Address addr;
public Employee(Address addr) {
this.addr = addr;
}
. . .
}위 예제에서 Employee 클래스는 생성자를 통해 외부에서 전달받은 Address 객체를 참조로 보관합니다. Address 객체는 Employee 객체가 삭제되더라도 다른 곳에서 계속 사용할 수 있으므로, 이것이 바로 약한 결합의 집계 관계입니다.
컴포지션 vs 집계 한눈에 비교하기
| 구분 | 컴포지션(Composition) | 집계(Aggregation) |
|---|---|---|
| 결합 강도 | 강한 결합 | 약한 결합 |
| 생명주기 | 부모 객체와 함께 소멸 | 부모와 독립적으로 존재 |
| 객체 생성 | 클래스 내부에서 직접 생성 | 외부에서 전달받아 참조 |
| 예시 | 자동차 - 엔진 | 직원 - 주소 |
두 개념 모두 객체 지향 설계에서 중요한 관계 표현 방식입니다. 자식 객체가 부모에 종속적인 경우에는 컴포지션을, 독립적으로 재사용 가능한 경우에는 집계를 사용하는 것이 좋은 설계 습관입니다.