객체지향 프로그래밍에서 클래스 간의 관계를 설계할 때 연관(Association)과 집합(Aggregation)은 가장 기본적이면서도 자주 혼동되는 개념입니다. 두 관계 모두 "has-a(~을 가진다)" 관계를 표현하지만, 객체 간의 결합 방식과 유연성에서 중요한 차이가 있습니다. 이 글에서는 Java 코드 예제와 함께 두 개념의 차이점을 명확하게 살펴보겠습니다.
연관(Association)이란?
연관은 서로 다른 두 객체 사이의 "has-a" 관계를 의미합니다. 한 클래스가 다른 클래스 타입의 필드를 참조하는 형태로 구현되며, 예를 들어 직원(Employee)은 하나의 통신 주소(Address)를 가질 수 있습니다.
class Employee {
String name;
Address communicationAddress;
}
class Address {
String address;
}
위 예제에서 Employee 클래스는 Address 객체를 멤버 변수로 참조하고 있습니다. 이처럼 연관 관계는 한 객체가 다른 객체를 알고 있으며 사용할 수 있다는 점을 나타냅니다.
집합(Aggregation)이란?
집합은 연관 관계의 확장된 형태로, "has-a +" 관계라고 볼 수 있습니다. 부모 클래스가 자식 객체들의 컬렉션(List 등)을 소유하는 경우를 말하며, 대표적인 예로 하나의 부서(Department)는 여러 명의 직원(Employee)을 가질 수 있습니다.
class Department {
String name;
List<Employee> employees;
}
class Employee {
String name;
}
Department 클래스는 여러 Employee 객체를 List로 관리합니다. 이때 각 직원은 부서에 속하지만 독립적으로 존재할 수도 있어, 전체-부분(part-whole) 관계이면서도 느슨한 결합을 유지한다는 특징이 있습니다.
연관 vs 집합: 핵심 차이점 비교
| 번호 | 구분 | 연관(Association) | 집합(Aggregation) |
|---|---|---|---|
| 1 | 정의 | 서로를 사용하는 두 클래스 간의 "has-a" 관계를 의미합니다. | 한 클래스가 다른 클래스 객체들의 컬렉션을 포함하는 "has-a +" 관계를 의미합니다. |
| 2 | 유연성 | 구조상 유연성이 떨어집니다. | 컬렉션 기반으로 동작하므로 상대적으로 유연합니다. |
| 3 | 링크(Linkage) | 관계를 유지하기 위해 객체 간 링크가 필요합니다. | 객체 간 링크가 반드시 필요하지 않습니다. |
| 4 | UML 표기 | 실선(line)으로 표현합니다. | 전체(부모) 클래스 옆에 마름모(diamond) 기호로 표현합니다. |
정리
연관과 집합 모두 객체 간의 포함 관계를 나타내지만, 단일 객체 참조인지 아니면 객체 컬렉션의 소유인지에 따라 구분됩니다. 설계 시에는 관계의 강도와 객체의 생명주기를 고려해 적절한 관계를 선택하는 것이 좋습니다. 또한 UML 다이어그램에서 연관은 실선으로, 집합은 마름모 기호로 구분되므로 문서화 작업에서도 이 차이를 활용할 수 있습니다.