객체지향 프로그래밍에서 클래스와 객체 사이의 관계를 올바르게 설계하는 것은 유지보수성 높은 코드를 작성하는 데 매우 중요합니다. C#에서는 객체 간 관계를 표현하는 대표적인 방법으로 연관(Association), 합성(Composition), 집합(Aggregation) 세 가지가 있습니다. 이번 글에서는 각 개념의 차이점과 예제를 통해 쉽게 이해해 보겠습니다.
C#에서의 연관(Association)
연관(Association)은 C#에서 두 객체 사이의 관계를 정의하는 가장 일반적인 방식입니다. 객체 간에는 다음과 같은 다양한 형태의 관계가 성립할 수 있습니다.
- 일대일(One-to-One)
- 일대다(One-to-Many)
- 다대일(Many-to-One)
- 다대다(Many-to-Many)
예를 들어, 한 명의 직원(Employee)은 여러 개의 프로젝트(Project)에 참여할 수 있고, 반대로 하나의 프로젝트 역시 여러 명의 직원을 가질 수 있습니다. 이처럼 서로 독립적으로 존재하면서도 상호 참조하는 관계가 바로 연관입니다.
C#에서의 합성(Composition)
합성(Composition)은 집합(Aggregation)의 특수한 형태로, 전체와 부분 간의 '부분(part-of)' 관계를 나타냅니다. 합성 관계의 가장 큰 특징은 생명주기가 함께한다는 점입니다.
즉, 부모 객체가 삭제되면 그 안에 포함된 자식 객체도 함께 소멸합니다. 자식 객체는 부모 없이 독립적으로 존재할 수 없습니다.
대표적인 예로 자동차(Car)와 엔진(Engine)을 들 수 있습니다. 자동차는 엔진을 포함하며, 만약 자동차가 폐차되어 파괴되면 엔진 역시 더 이상 의미가 없어져 함께 사라집니다.
C#에서의 집합(Aggregation)
집합(Aggregation)은 C#에서 객체들 사이의 직접적인 관계를 의미하며, '전체-부분' 구조를 가지지만 합성과 달리 생명주기가 독립적입니다. 전체 객체가 사라져도 부분 객체는 계속 존재할 수 있습니다.
대표적인 예로 직원(Employee)과 부서(Department)의 관계를 들 수 있습니다.
- 한 명의 직원은 하나의 부서에 소속됩니다.
- 하나의 부서에는 여러 명의 직원이 속할 수 있습니다.
이때 부서가 해체되더라도 직원은 사라지지 않고 다른 부서로 이동하거나 독립적으로 존재할 수 있습니다. 이것이 합성과 집합의 핵심적인 차이입니다.
세 가지 관계 비교 요약
| 구분 | 연관(Association) | 집합(Aggregation) | 합성(Composition) |
|---|---|---|---|
| 관계의 성격 | 객체 간 일반적인 참조 | 전체-부분 (느슨한 결합) | 전체-부분 (강한 결합) |
| 생명주기 | 독립적 | 독립적 | 부모에 종속 |
| 예시 | 직원 ↔ 프로젝트 | 부서 → 직원 | 자동차 → 엔진 |
마무리
연관, 집합, 합성은 모두 객체 간의 관계를 표현하지만, 결합의 강도와 생명주기 의존성에서 차이가 있습니다. 설계 단계에서 이러한 관계를 명확히 구분하면 코드의 응집도를 높이고 결합도를 낮춰 더 견고한 애플리케이션을 만들 수 있습니다. 실제 프로젝트에서 각 상황에 맞는 적절한 관계를 선택해 활용해 보시기 바랍니다.