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

C#에서 구성(Composition)과 집계(Aggregation)의 차이점 완벽 정리

C#에서 구성과 집계란 무엇인가?

C#의 객체 지향 프로그래밍에서 구성(Composition)집계(Aggregation)는 모두 클래스 간의 '소유(has-a)' 관계를 표현하는 방식입니다. 두 개념은 비슷해 보이지만, 객체 간의 결합 강도와 생명 주기 의존성에서 중요한 차이가 있습니다.

구성(Composition): 강한 소유 관계

구성은 집계의 특수한 형태로, 전체와 부분 사이의 'part-of'(부분-전체) 관계를 나타냅니다. 구성 관계에서 가장 중요한 특징은 다음과 같습니다.

  • 부모 객체가 삭제되면 자식 객체도 함께 소멸합니다.
  • 자식 객체는 부모 객체 없이 독립적으로 존재할 수 없습니다.

대표적인 예로 자동차(Car)와 엔진(Engine)의 관계를 들 수 있습니다. 자동차는 엔진을 가지고 있으며, 만약 자동차가 폐차되어 파괴된다면 그 엔진 역시 더 이상 존재할 이유가 없습니다.

public class Engine {
    // 엔진 관련 코드
}

public class Car {
    // Car 객체가 생성될 때 Engine 객체도 함께 생성됨
    Engine eng = new Engine();
}

위 코드에서 Engine 객체는 Car 클래스 내부에서 직접 생성됩니다. 즉, 엔진의 생명 주기가 자동차에 완전히 종속되어 있으므로 이것이 바로 구성 관계입니다.

집계(Aggregation): 느슨한 연관 관계

집계는 C#에서 객체들 사이의 방향성 있는 관계를 의미합니다. 구성과 달리, 전체 객체가 삭제되더라도 부분 객체는 독립적으로 존재할 수 있습니다.

대표적인 예로 직원(Employee)과 주소(Address)의 관계를 들 수 있습니다. 또한 조직 구조에서 살펴보면, 한 명의 직원은 하나의 부서(Department)에만 속하지만, 하나의 부서에는 여러 명의 직원이 속할 수 있습니다.

public class Address {
    // 주소 관련 코드
}

public class Employee {
    private Address addr;

    public Employee(Address addr) {
        this.addr = addr;
    }
}

위 코드에서 Address 객체는 생성자를 통해 외부에서 전달받습니다. 직원 객체가 삭제되더라도 주소 정보 자체는 다른 곳에서 계속 사용될 수 있으므로, 이것이 바로 집계 관계입니다.

핵심 차이점 비교

구분구성(Composition)집계(Aggregation)
관계의 강도강한 결합 (강한 소유)느슨한 결합 (약한 소유)
생명 주기자식은 부모에 종속됨자식이 독립적으로 존재 가능
객체 생성부모 내부에서 직접 생성외부에서 생성 후 전달
예시자동차와 엔진직원과 주소, 부서와 직원

정리

구성과 집계의 차이를 한 문장으로 요약하면 다음과 같습니다. 구성은 부모가 사라지면 자식도 사라지는 강한 관계이고, 집계는 전체와 부분이 연관되어 있지만 각각 독립적으로 존재할 수 있는 느슨한 관계입니다. 설계 시 객체 간의 의존성과 생명 주기를 고려하여 적절한 관계를 선택하는 것이 좋은 객체 지향 설계의 핵심입니다.