Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 컴포지션(Composition)과 집계(Aggregation)의 차이 완벽 정리

컴포지션(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)
결합 강도강한 결합약한 결합
생명주기부모 객체와 함께 소멸부모와 독립적으로 존재
객체 생성클래스 내부에서 직접 생성외부에서 전달받아 참조
예시자동차 - 엔진직원 - 주소

두 개념 모두 객체 지향 설계에서 중요한 관계 표현 방식입니다. 자식 객체가 부모에 종속적인 경우에는 컴포지션을, 독립적으로 재사용 가능한 경우에는 집계를 사용하는 것이 좋은 설계 습관입니다.