가이드라인: 집합
주제
집합은 모델 요소 간의 합성 관계를 모델링하는 데 사용됩니다. 합성 관계의 예에는 여러 가지가 있습니다.
도서관은 책을 가지고 있고, 회사 부서는 직원으로 이루어지며
컴퓨터는 여러 개의 장치로 구성됩니다. 이를 모델링하기 위해 집합(부서)은 구성요소가 되는 부분(직원)에 대해
집합 연관을 가집니다.
집합을 표시하기 위해 빈 다이아몬드가 집합(전체) 옆에 있는 연관 경로의 끝에 첨부됩니다.
예
이 예에서 고객은 주소를 가집니다.
두 개의 클래스가 더 큰 전체의 부분을 표시하므로 집합을 사용합니다. 또한 여러 가지 다른 유형의 것들도 마찬가지로 주소를 가지므로 주소를 별도 클래스로
모델링하기로 선택합니다.

집합 객체는 다른 객체를 함께 보유할 수 있습니다.
집합에 대해 구축된 것보다 더 다양성을 갖는 집합 관계를 공유라고 하며
집합을 파괴한다고 해서 반드시 부분도 파괴되는 것은 아닙니다. 함축적으로, 공유 집합은 그래프 또는 많은 루트가 있는 트리를 형성합니다. 공유 집합은 두 클래스 간에 강력한 관계가 있는 경우에 사용되어
동일한 인스턴스가 두 개의 다른 집합에 관여할 수 있게 합니다.
예
한 사람이 집에 기반을 둔 비즈니스를 가지고 있는 경우를 고려하십시오.
사람과 비즈니스 모두 주소를 가집니다. 실제로 이 주소는 동일한 주소입니다. 주소는 사람 및 비즈니스 모두의 절대 필요한 부분입니다.
그러나 비즈니스는 중단될 수 있고 사람은 바라건대 동일한 주소에 남아 있을 수 있습니다.
이러한 경우 공유 집합을 시작한 후 나중에 비공유 집합으로 전이될 수도 있다는 점을
주지하십시오. 집에 기반을 둔 비즈니스가 성장하고 번창하여 결국
다른 장소로 이사할 수 있습니다. 이 경우, 사람과 비즈니스는 더 이상 동일한 주소를 공유하지 않습니다. 따라서 집합은 더 이상 공유되지 않습니다.

공유 집합의 예
합성은 강력한 소유권을 가지며 부분의 수명이 집합과 일치하는 집합의 형식입니다. 집합 끝의 다양성(예: 주문)은
한 개를 초과할 수 없습니다(공유될 수 없음). 또한 집합은 변경이 불가능합니다. 다시 말해, 일단 구축된 후에는 링크를 변경할 수 없습니다. 함축적으로, 합성 집합은 집합인 루트와 부분인 "분기"가 있는
부분의 "트리"를 형성합니다.
집합과 부분 사이에 강력한 상호 의존 관계를 가지고 있으며 부분이 없으면 집합의 정의가
불완전해지는 경우, "일반" 집합을 넘어 합성 집합을 사용해야 합니다. 아래의 예에서 아무 것도 주문되지 않은 경우(예: 라인 항목)에
주문을 받더라도 이는 이치에 어긋나지 않습니다. 일부 경우에, 이 상호 의존성은 분석 단계와 같이 초기에 식별될 수 있지만(이 예의 경우와 같이)
종종 설계 단계에 이르러서야 이러한 결정을 자신 있게 내릴 수 있게 되는 경우가 있습니다.
아래 표시된 대로 합성을 표시하기 위해 연관 경로의 끝에 속이 채워진 다이아몬드가 첨부됩니다.

합성 집합의 예
예
이 예에서 고객 인터페이스는 여러 개의 다른 클래스로 구성됩니다. 이 예에서 집합의 다양성은 아직 지정되지 않습니다.

고객 인터페이스 객체는 어떤 표시장치, 영수증 프린터,
키패드 및 스피커가 속해 있는지 알고 있습니다.
클래스의 등록 정보는 클래스가 알고 있는 정보입니다. 위에 표시된 고객 클래스의 경우, 고객의 주소를 클래스(표시된 대로)
또는 클래스 속성 세트로 모델링하도록 선택할 수 있습니다. 클래스, 집합 관계 또는 속성 세트를 사용할 것인지에 대한 결정은
다음에 따라 이루어집니다.
- '등록 정보'가 많은 객체에서 참조될 수 있도록 독립된 ID를 가져야 합니까? 그렇다면, 클래스 및 집합을 사용하십시오.
- 많은 클래스가 동일한 '등록 정보'를 가져야 합니까? 그렇다면, 클래스 및 집합을 사용하십시오.
- '등록 정보'가 복잡한 구조 및 자체의 등록 정보를 가집니까?
그렇다면, 클래스(또는 여러 클래스) 및 집합을 사용하십시오.
- 그렇지 않으면, 속성을 사용하십시오.
예
ATM에서 시스템은 현재 고객과 PIN을 계속 추적하고 있어야 하며,
고객 인터페이스가 이에 대해 책임진다고 가정합시다. 이 정보는 클래스의 "등록 정보"로 간주될 수 있습니다. 이는 다음에 표시된 것과 같이 별도 클래스를 사용하여 수행됩니다.

집합을 사용하여 모델링된 객체 등록 정보
고객 인터페이스가 속성을 사용하여 현재 고객 및 고객의 PIN을 추적하도록 하는 대안이
다음과 같이 모델링됩니다.

속성을 사용하여 모델링된 객체 등록 정보
별도 클래스에 속성 또는 집합 연관을 사용할 것인지에 대한 결정은
표시되는 개념 간의 결합 정도에 따라 판별됩니다.
모델링되는 개념이 밀접하게 연결되어 있으면 속성을 사용십시오. 개념이 독자적으로 변경될 것 같으면 집합을 사용하십시오.
집합은 클래스 간에 합성 관계가 있는 경우, 하나의 클래스가 다른 클래스로 구성된 경우,
전체의 컨텍스트 밖에서 "부분"이 불완전한 경우에만 사용되어야 합니다.
주문의 경우를 생각해 보십시오.
주문이 "비어 있고" 주문을 구성하는 요소가 "없는" 상태의
주문을 받는다는 것은 이치에 맞지 않습니다. 모든 집합에 대해 동일한 이치가 적용됩니다.
부서는 직원을 포함해야 하고 가족은 가족 구성원을 포함해야 합니다.
클래스가 다른 클래스가 제공한 컨텍스트 외부에서 독립적인 ID를 가질 수 있는 경우
이들 클래스가 더 큰 전체의 부분이 아니면 연관 관계를 사용해야 합니다. 또한 확실치 않을 때도 연관을 사용하는 것이 더욱 적합합니다.
집합은 일반적으로 명백하므로 집합 선택은 명백하게 설명하는 데 도움을 주기 위해서만 수행됩니다. 이는 모델링을 완성시키는 데 있어 그다지 중요한 문제가 아닙니다.
때때로, 클래스는 클래스 자체로 집합될 수 있습니다. 이는 해당 클래스의 인스턴스가 그 자체로 구성된다는 것이 아니라
클래스의 한 인스턴스가 동일한 클래스의 다른 인스턴스로 구성된 집합이라는 것을 의미합니다. 자체 집합의 경우, 연관에 대한 목적을 구별하기 위해 역할 이름이 필요합니다.
예
제품 클래스를 포함하는 다음과 같은 자체 집합을 고려하십시오.

이 경우에 제품은 다른 제품들로 구성될 수 있습니다.
이 때, 집합된 제품을 서브제품이라고 부릅니다. 연관은 집합에서 서브제품까지만 탐색할 수 있습니다.
예를 들어, 서브제품은 자신이 어떤 제품의 부분인지 모를 수도 있습니다(많은 제품의 부분일 수 있으므로).
|