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

C# 연관(Association), 합성(Composition), 집합(Aggregation) 개념 완벽 정리

객체지향 프로그래밍에서 클래스와 객체 사이의 관계를 올바르게 설계하는 것은 유지보수성 높은 코드를 작성하는 데 매우 중요합니다. 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)
관계의 성격객체 간 일반적인 참조전체-부분 (느슨한 결합)전체-부분 (강한 결합)
생명주기독립적독립적부모에 종속
예시직원 ↔ 프로젝트부서 → 직원자동차 → 엔진

마무리

연관, 집합, 합성은 모두 객체 간의 관계를 표현하지만, 결합의 강도와 생명주기 의존성에서 차이가 있습니다. 설계 단계에서 이러한 관계를 명확히 구분하면 코드의 응집도를 높이고 결합도를 낮춰 더 견고한 애플리케이션을 만들 수 있습니다. 실제 프로젝트에서 각 상황에 맞는 적절한 관계를 선택해 활용해 보시기 바랍니다.