Has-a

데이터베이스 설계, 객체 지향 프로그래밍 및 설계에서 has-a, has_a 또는 has a는 하나의 객체(종종 구성된 객체, 또는 부분/구성원/멤버 객체라고 함)가 다른 객체(복합형이라고 함)에 "속하며"(다른 객체의 부분 또는 멤버임) 소유권 규칙에 따라 동작하는 구성 관계이다. 간단히 말해, 객체 간의 has-a 관계는 객체의 멤버 필드라고 불린다. 여러 has-a 관계가 결합하여 소유 계층 구조를 형성한다.

관련 개념
"Has-a"는 분류 계층 구조(서브타이핑)를 구성하는 is-a(is_a 또는 is a) 관계와 대조된다.

객체와 그 하위 객체에 대한 가장 논리적인 관계가 항상 명확하게 has-a 또는 is-a인 것은 아니다. 이러한 결정에 대한 혼란으로 인해 이러한 메타언어적 용어의 생성이 필요해졌다. has-a 관계의 좋은 예는 C++ STL의 컨테이너이다.

관계를 요약하면 다음과 같다.

 분류 계층 구조를 정의하는 타입(클래스) 간의 상위어-하위어(슈퍼타입-서브타입) 관계:
 상속 관계의 경우: 하위어(서브타입, 서브클래스)는 상위어(슈퍼타입, 슈퍼클래스)와 타입-오브(is-a) 관계를 갖는다.
 소유 계층 구조를 정의하는 타입(클래스) 간의 전체어-부분어(전체/개체/컨테이너-부분/구성원/멤버) 관계:
 애그리게이션(즉, 소유권 없음) 관계의 경우:
 전체어(전체)는 부분어(부분)와 has-a 관계를 갖는다.
 컴포지션(즉, 소유권 있음) 관계의 경우:
 부분어(구성원)는 전체어(개체)와 부분-오브 관계를 갖는다.
 컨테인먼트See also Containment (computer programming). 관계의 경우:
 부분어(멤버)는 전체어(컨테이너)와 멤버-오브 관계를 갖는다.
 타입(클래스)과 객체(인스턴스) 간의 개념-객체(타입-토큰) 관계:
 토큰(객체)은 타입(클래스)과 인스턴스-오브 관계를 갖는다.

예시
 개체-관계 모델 
 right |섬네일|개체-관계 모델 
데이터베이스에서 has-a 관계는 일반적으로 개체-관계 모델로 표현된다. 오른쪽 다이어그램에서 볼 수 있듯이 계정은 여러 캐릭터를 가질 수 있다. 이는 계정이 캐릭터와 "has-a" 관계를 갖는다는 것을 보여준다.

 UML 클래스 다이어그램 
right |섬네일|UML 클래스 다이어그램컴포지션 및 애그리게이션
객체 지향 프로그래밍에서 이 관계는 UML 클래스 다이어그램으로 표현될 수 있다. 이 has-a 관계는 컴포지션으로도 알려져 있다. 오른쪽 클래스 다이어그램에서 볼 수 있듯이 자동차는 기화기를 "가지고" 있거나, 자동차는 기화기로 "구성되어" 있다. 다이아몬드가 검은색으로 채워져 있으면 컴포지션을 의미한다. 즉, 다이아몬드에 가장 가까운 쪽에 있는 객체가 다른 객체로 구성되거나 다른 객체를 포함한다. 반면 흰색 다이아몬드는 애그리게이션을 의미하는데, 이는 다이아몬드에 가장 가까운 객체가 다른 객체를 가질 수 있거나 소유할 수 있음을 의미한다.

 C++ 
섬네일|자동차, 섀시 및 타이어 객체
실세계를 모델링할 때 컴포지션과 애그리게이션을 구별하는 또 다른 방법은 포함된 객체의 상대적 수명을 고려하는 것이다. 예를 들어, 자동차 객체가 섀시 객체를 포함하는 경우, 섀시는 자동차의 수명 동안 교체될 가능성이 낮다. 섀시는 자동차 자체와 동일한 수명을 가질 것이다. 따라서 관계는 컴포지션이다. 반면에 자동차 객체가 타이어 객체 세트를 포함하는 경우, 이 타이어 객체들은 마모되어 여러 번 교체될 수 있다. 또는 자동차가 사용할 수 없게 되면 일부 타이어는 회수되어 다른 자동차에 할당될 수 있다. 어떤 경우든 타이어 객체는 자동차 객체와 다른 수명을 갖는다. 따라서 관계는 애그리게이션이다.

위에서 설명한 관계를 구현하기 위해 C++ 소프트웨어 클래스를 만들 경우, 자동차 객체는 데이터 멤버에 완전한 섀시 객체를 포함할 것이다. 이 섀시 객체는 자동차 클래스의 생성자에서 인스턴스화되거나(또는 데이터 멤버의 데이터 타입으로 정의되고 속성은 생성자에서 할당됨) 자동차 클래스의 완전히 포함된 데이터 멤버이므로, 자동차 클래스 객체가 삭제되면 섀시 객체도 더 이상 존재하지 않을 것이다.

반면에 타이어 객체를 가리키는 자동차 클래스 데이터 멤버는 C++ 포인터일 가능성이 높다. 타이어 객체는 외부에서 인스턴스화 및 삭제될 수 있으며, 심지어 다른 자동차 객체의 데이터 멤버에 할당될 수도 있다. 타이어 객체는 자동차 객체가 삭제되는 시점과 독립적인 수명을 가질 것이다.

 같이 보기 
 객체 구성
 Has-a
 전체론
 부분론
 Is-a
 상위어 (및 슈퍼타입)
 하위어 (및 서브타입)

내용주

분류:객체 지향 프로그래밍
분류:관계대수