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) |
|---|---|---|
| 관계의 강도 | 강한 결합 (강한 소유) | 느슨한 결합 (약한 소유) |
| 생명 주기 | 자식은 부모에 종속됨 | 자식이 독립적으로 존재 가능 |
| 객체 생성 | 부모 내부에서 직접 생성 | 외부에서 생성 후 전달 |
| 예시 | 자동차와 엔진 | 직원과 주소, 부서와 직원 |
정리
구성과 집계의 차이를 한 문장으로 요약하면 다음과 같습니다. 구성은 부모가 사라지면 자식도 사라지는 강한 관계이고, 집계는 전체와 부분이 연관되어 있지만 각각 독립적으로 존재할 수 있는 느슨한 관계입니다. 설계 시 객체 간의 의존성과 생명 주기를 고려하여 적절한 관계를 선택하는 것이 좋은 객체 지향 설계의 핵심입니다.