객체지향 프로그래밍(OOP)에서 클래스 간의 관계를 설계할 때 자주 혼동되는 개념이 바로 연관(Association)과 집합(Aggregation)입니다. 이 글에서는 두 개념의 정의와 특징, 그리고 핵심적인 차이점을 알기 쉽게 정리해 드립니다.
연관(Association)이란?
연관은 흔히 공통의 목적을 가진 사람들의 조직으로 비유할 수 있으며, 일정한 형식적 구조를 갖추고 있다는 의미도 포함합니다. 객체지향 관점에서 보면, 두 객체 사이에 어떤 활동이나 상호작용을 나타내는 이진 관계(binary relationship)를 표현하는 것입니다.
쉬운 예로, 건강한 음식을 섭취하는 습관은 단순히 건강한 체중뿐 아니라 좋은 피부, 모발, 활력, 활동성 등 여러 요소와 서로 연결되어 있는 것을 들 수 있습니다.
- 연관은 두 클래스 사이의 관계로, 한 클래스가 다른 클래스를 사용하는 형태입니다.
- 본질적으로 유연하지 않은(flexible하지 않은) 특성을 가집니다.
- 객체들 사이에 어떤 링크 또는 관계가 존재함을 나타냅니다.
- '~를 가지고 있다(has a)' 관계로 표현될 수 있습니다.
- 클래스의 구성 요소들은 선분(line segment)으로 연결하여 표현합니다.
집합(Aggregation)이란?
집합은 연관의 한 특수한 형태로, 전체(whole)와 부분(part)의 관계를 명확히 나타냅니다. 즉, 여러 개별 요소들이 하나의 그룹으로 함께 저장되는 '모음(collection)'의 성격을 가집니다.
- '~를 가지고 있다(has a)' 관계이자 '전체-부분(whole-part)' 관계로 표현됩니다.
- 서로 구별되는 부분들로 이루어진 그룹으로 이해할 수 있습니다.
- 예를 들어, 한 명의 교사가 여러 아이들로 구성된 그룹을 가르치는 경우가 대표적입니다.
- 본질적으로 유연한(flexible) 특성을 가집니다.
- 객체 간 전체-부분 관계를 포함하는 특수한 종류의 연관입니다.
- 다이어그램에서 조립(전체) 클래스 쪽에 마름모(diamond) 기호를 사용하여 표현합니다.
핵심 차이점 요약
정리하면, 연관은 두 클래스가 서로를 참조하며 사용하는 일반적인 관계인 반면, 집합은 연관 중에서도 하나의 객체가 다른 객체들을 '부분'으로 소유하는 전체-부분 관계를 의미합니다. UML 다이어그램에서는 집합 관계를 마름모 기호로 구분하여 표현하므로, 설계 시 두 개념을 정확히 구분하여 적용하는 것이 중요합니다.