가이드라인: 연관
연관은 오브젝트 사이의 구조적 관계를 표시합니다. 이 가이드라인은 이 관계를 사용하는 방법을 설명합니다.
관계
기본 설명

연관

연관은 서로 다른 클래스에 있는 오브젝트 사이의 구조적 관계를 표시합니다. 일정 지속 기간에 존재하는 둘 이상의 클래스에 있는 인스턴스 사이의 연결을 표시합니다. 예를 들어 오퍼레이션의 지속 기간 중에만 존재하는 임시 링크와는 반대됩니다. 임시 링크의 경우 대신 협업을 사용하여 모델링할 수 있습니다. 이때 링크는 특별히 제한된 컨텍스트에만 있습니다.

연관을 사용하여 오브젝트가 다른 오브젝트에 대해 아는지 표시할 수 있습니다. 때때로 오브젝트는 상호작용(예: 서로 메시지 송신)할 수 있도록 서로에 대한 참조를 보유할 수 있습니다. 따라서 연관이 시퀀스 다이어그램 또는 커뮤니케이션 다이어그램의 상호작용 패턴을 따르는 경우가 있습니다.

연관 이름

대부분의 연관은 2진(정확히 두 클래스 사이에 있음)이고 클래스 기호의 쌍을 연결하는 단색 경로로 표시됩니다. 연관에 이름이 있거나 연관 역할에 이름이 있을 수 있습니다. 역할 이름은 자세한 정보를 제공하므로 역할 이름이 선호됩니다. 역할 중 하나만 이름을 지정할 수 있는 경우 오브젝트에서 시작되어 역할 이름이 연관된 항목으로 이어진 단방향인 연관이면 여전히 연관 이름보다 역할 이름이 선호됩니다.

대부분 역할에 이름을 지정할 충분한 정보가 수집되기 전에 분석 중 연관 이름을 지정합니다. 연관 이름을 사용하는 경우 관계의 목적을 반영하고 동사 형태의 문장으로 구성되어야 합니다. 연관 이름은 연관 경로 또는 이 주변에 위치합니다.

예제

ATM에서 현금 등록기현금 지급기가 지급하는 현금을 제공합니다. 현금 지급기에서 잔고를 지급할 수 있으려면 현금 등록기 오브젝트에 대한 참조를 보관해야 합니다. 마찬가지로 현금 등록기에 잔고가 부족한 경우 현금 지급기 오브젝트에 이 사실을 알려야 합니다. 따라서 현금 등록기현금 지급기에 대한 참조를 보관해야 합니다. 연관으로 이 참조를 모델링합니다.

연관 이름 예제

현금 지급기현금 등록기 사이의 연관 이름은 화폐 가치 제공이라고 합니다.

연관 이름을 잘못 선택하면 혼동 및 오해가 나타날 수 있습니다. 다음 예제에서는 좋은 이름과 잘못된 이름 지정을 설명합니다. 첫 번째 다이어그램에서는 연관 이름을 사용합니다. 동사 형태의 문장을 사용하여 구문상으로는 정확하지만 관계에 대한 정보를 많이 제공하지 못합니다. 두 번째 다이어그램에서는 역할 이름을 사용합니다. 이 이름은 연관에서 참여의 특성에 대해 많은 내용을 제공합니다.

함께 표시된 텍스트에서 설명되는 다이어그램

연관 및 역할 이름의 좋은 사용법 및 잘못된 사용법에 대한 예제입니다.

역할

연관의 각 끝은 클래스가 연관에서 수행하는 내용을 지정하는 역할에 해당합니다. 각 역할에는 이름이 있어야 하며 클래스에서 역할 이름은 고유해야 합니다. 역할 이름은 연관 오브젝트와 관련하여 연관된 오브젝트의 역할을 표시하는 명사여야 합니다. 예를 들어 과정 선택과 연관하여 교사의 적합한 역할 이름은 강사입니다. 클래스 사이에 관계에 대해 정보를 추가하지 않으므로 "가짐(has)" 및 "포함(contains)"과 같은 이름은 사용하지 마십시오.

연관 이름 및 역할 이름의 사용은 서로 배타적임에 유의하십시오. 연관 이름 역할 이름을 동시에 사용할 수 없습니다. 역할 이름은 연관 이름보다 선호됩니다. 단, 역할 이름을 올바르게 지정하는 데 정보가 충분하지 않은 경우는 예외입니다. 분석에서 이 경우가 종종 나타납니다. 디자인에서는 항상 역할 이름을 사용해야 합니다. 좋은 역할 이름이 없다는 것은 모델이 불완전하거나 잘못 구성되었음을 의미합니다.

역할 이름은 연관 선의 끝 옆에 위치합니다.

예제

주문 입력 시스템에서 클래스 사이의 관계를 고려하십시오. 고객은 두 종류의 서로 다른 주소를 갖고 있습니다. 청구소를 보낼 하나의 주소와 주문을 보내는 여러 주소가 이에 해당합니다. 그 결과, 아래 표시된 대로 Customer 및 Address 사이에 2개의 연관이 있습니다. 고객의 연관된 주소에서 수행하는 역할로 연관 레이블이 지정됩니다.

연관 예제

역할 이름 및 다중성을 표시하는 Customer, AddressOrder 사이의 연관입니다.

다중성

각 역할에서 해당 클래스의 다중성, 즉, 다른 클래스의 오브젝트 하나와 연관시킬 수 있는 클래스의 오브젝트 수를 지정할 수 있습니다. 다중성은 역할에서 텍스트 표현식으로 표시됩니다. 표현식은 정수 범위의 쉼표로 구분한 목록입니다. 범위는 정수(하한 값), 두 개의 마침표 및 정수(상한 값)의 순서대로 표시됩니다. 단일 정수가 올바른 범위이며 '*' 기호는 "많음"을 표시합니다. 즉, 오브젝트 수가 제한되지 않습니다. '*' 기호는 단독으로 사용할 경우 '0..*'와 같습니다. 즉, 0을 포함하는 임의 숫자입니다. 이 숫자가 기본값입니다. 선택적 스칼라 역할은 다중성 0..1로 표시됩니다.

예제

이전 예제에서 다중성은 주문 및 고객, 고객 및 주소 사이의 연관에서 표시되었습니다. 다이어그램을 해석하면 주문에는 연관된 고객이 있지만(다중성은 고객 끝에서 1..1로 표시) 고객은 주문을 가지고 있지 않습니다(다중성은 주문 끝에서 0..*로 표시). 또한 고객은 하나의 청구 주소를 가지고 있지만 운송 주소는 하나 이상입니다. 산만한 표기를 정리하기 위해 다중성을 생략하는 경우 1..1로 가정할 수도 있습니다.

탐색성

역할에서 탐색성 특성은 연관을 사용하여 연관 클래스에서 대상 클래스까지 탐색할 수 있음을 표시합니다. 이 조건은 여러 방법으로 구현될 수 있습니다. 직접적인 오브젝트 참조, 연관 배열, 해시 테이블 또는 한 오브젝트에서 다른 오브젝트를 참조할 수 있는 기타 구현 기법이 있습니다. 탐색성은 한 쪽 화살촉이 개방된 화살표로 표시됩니다. 대상 클래스(탐색 대상임) 옆의 연관 선의 대상 끝에 있습니다. 탐색성 특성의 기본값은 true입니다.

예제

주문 입력 예제에서 OrderCustomer 사이의 연관은 모든 방향으로 탐색 가능합니다. Order는 해당 Order를 배치할 Customer를 확인해야 하며 Customer를 배치된 Order를 알아야 합니다. 화살촉이 표시되지 않으면 연관은 두 방향으로 모두 탐색 가능하다고 가정됩니다.

CustomerAddress 사이의 연관에서 Customer는 해당 Address를 알아야 하지만 Address는 이 주소와 연관된 Customer(또는 많은 항목이 주소를 가지고 있으므로 기타 클래스)를 알지 못합니다. 그 결과 연관의 Customer 끝에 있는 탐색성 특성은 꺼집니다. 결과로 다음과 같은 다이어그램을 표시할 수 있습니다.

연관에 대한 탐색성 예제

갱신된 주문 입력 시스템 클래스로, 연관의 탐색성을 표시합니다.

자체 연관

때때로 자체 연관된 클래스가 있습니다. 해당 클래스의 인스턴스가 자체로 구성되었다는 의미는 아닙니다. 클래스가 연관인 경우 하나의 인스턴스가 동일한 클래스의 다른 인스턴스로 구성되었음을 의미합니다. 자체 연관에서 연관을 위해 구별하는 경우 역할 이름이 중요합니다.

예제

다음과 같은 Employee 클래스와 관련된 자체 연관을 고려하십시오.

자체 집계 예제

이 경우 직원은 다른 직원과 연관되었을 수 있습니다. 연관된 경우 이들은 관리자이고 다른 직원은 인력 구성원입니다. 직원이 관리자를 알고 있고 관리자가 직원을 알고 있으므로 연관은 양방향으로 탐색 가능합니다.

다중 연관

클래스 사이에 두 개의 연관이 표시되면 오브젝트가 두 번 관련되었음을 의미합니다. 지정된 오브젝트는 각 연관을 통해 다른 오브젝트와 링크될 수 있습니다. 각 연관은 독립적이며 역할 이름으로 구별됩니다. 위에서 표시된 대로 고객은 동일한 클래스의 다른 인스턴스와 연관되었을 수 있습니다. 이때 각각의 역할 이름을 서로 다릅니다.

역할 순서 지정

연관의 다중성이 둘 이상인 경우 연관된 인스턴스를 정렬할 수 있습니다. 역할에서 정렬된 특성은 연관에 참여한 인스턴스가 정렬되었음을 표시합니다. 기본적으로는 정렬되지 않은 세트입니다. 모델에서는 순서를 유지보수하는 방법을 지정하지 않습니다. 정렬된 연관을 갱신하는 조작에서는 갱신된 요소를 삽입할 위치를 지정해야 합니다.

링크

연관의 개별 인스턴스를 링크라고 합니다. 따라서 링크는 인스턴스 사이의 관계입니다. 메시지는 링크에서 송신될 수 있습니다. 링크는 오브젝트 사이에서 참조 및 집계를 표시할 수 있습니다. 자세한 정보는 기법: 커뮤니케이션 다이어그램을 참조하십시오.

연관 클래스

연관 클래스는 클래스 특성(예: 속성, 오퍼레이션 및 연관)도 포함하는 연관입니다. 연관에서 연관의 속성, 오퍼레이션 및 연관을 보유하는 클래스 기호까지 점선으로 표시됩니다. 속성, 오퍼레이션 및 연관은 원래 연관에 적용됩니다. 연관의 각 링크에는 표시된 특성이 있습니다. 연관 클래스는 다수 대 다수 관계 조정 시 가장 일반적으로 사용됩니다(아래 예제 참조). 이론적으로 클래스 및 연관 이름은 동일해야 하지만 필요한 경우 별도의 이름이 허용됩니다. 하향 연관 클래스는 연관의 속성만 포함합니다. 이 경우 서로 별개라는 점을 강조하지 않기 위해 연관 클래스 이름을 생략할 수 있습니다.

예제

이전의 직원 예제를 확장하여 직원(인력-구성원)이 다른 직원(관리자)을 위해 일하는 상황을 고려하십시오. 관리자는 인력 구성원을 정기적으로 평가하여 특정 기간에 구성원의 성능을 반영합니다.

칭찬은 관리자 또는 인력 구성원 단독의 속성일 수 없습니다. 하지만 아래 표시된 대로, 연관 자체와 정보를 연관시킬 수 있습니다.

연관 클래스 예제

Appraisal 연관 클래스는 연관과 관련된 정보를 캡처합니다.

규정된 연관

규정자는 추가로 다른 인스턴스와 연관된 인스턴스 세트를 제한 및 정의할 때 사용됩니다. 오브젝트 및 규정자 값은 복합 키를 구성하여 연관에서 오브젝트의 고유한 세트를 식별합니다. 일반적으로 규정은 반대 역할의 다중성을 줄입니다. 기본 다중성은 지정된 규정자 값 및 첫 번째 클래스와 연관된, 관련 클래스의 인스턴스 수를 표시합니다. 규정자는 규정 클래스에 첨부된 연관 끝에 있는 작은 상자로 표시됩니다 .규정자는 클래스가 아닌 연관의 파트입니다. 규정자 상자는 여러 규정자 값을 포함할 수 있습니다. 이때 규정은 전체 값 목록에 기반합니다. 규정된 연관은 연관 속성이 변형된 양식입니다.

예제

Line ItemProduct 사이의 연관을 정제하는 다음 상황을 고려하십시오. Line Item에는 주문한 Product와 연관되어 있습니다. 각 품목은 하나의 유일한 제품만 참조하지만 제품은 많은 품목에서 주문될 수 있습니다. ProductCode 규정자와의 연관을 규정하면 추가로 각 제품에 고유한 제품 코드를 지정하고 이 제품 코드를 사용하여 Line ItemProduct와 연관되었음을 표시할 수 있습니다.

규정된 연관

Line ItemProduct 사이의 연관에는 ProductCode 규정자가 있습니다.

N-ary 연관

N-ary 연관은 클래스 세 개 이상에서의 연관입니다. 여기서 단일 클래스가 두 번 이상 나타날 수도 있습니다. N-ary 연관은 하나의 연관 경로가 각 참여 클래스로 이어진, 커다란 다이아몬드 모양으로 표시됩니다. 이 모양은 연관의 전통적인 엔티티-관계 모델 기호입니다. 실제 모델에서는 연관 집합이기 때문에 더 압축하여 다이아몬드가 없는 2진 양식으로 표시됩니다. N-ary 연관은 거의 나타나지 않으며 클래스로 승격시켜 모델링할 수도 있습니다. N-ary 연관에도 연관 클래스가 있을 수 있습니다. 다이아몬드에서 클래스 기호까지 점선을 그려 표시됩니다. 역할에는 역할 이름이 있지만 다중성은 더 복잡하고 후보 키를 나열하여 다중성이 가장 잘 지정되었습니다. 이 경우 다중성은 다른 N-1 오브젝트의 지정된 튜플에 해당하는 여러 인스턴스를 표시합니다. 규정된 연관 또는 연관 클래스를 사용하면 대부분의 N-ary 연관을 사용하지 않아도 됩니다. 또한 참여 오브젝트의 지정된 튜플에서 하나의 링크만 나타날 수 있도록 지정한 제한조건을 유실한 경우에도 원래 클래스로 바꿀 수 있습니다.