정의
UML([UML04])에 따르면 클래스는 내부 구조 및 포트가 있는 기능을 클래스에 제공하는 EncapsulatedClassifier 및 metaclass
클래스의 하위 유형입니다. 컴포넌트도 UML에 의해 클래스의 하위 유형으로 정의됩니다. 따라서 RUP 컨텍스트 내에서는 컴포넌트 및 클래스를 구조화된
클래스라고 합니다.
파트
구조화된 클래스의 인스턴스에는 각 파트에 해당하는 오브젝트 및 오브젝트 세트가 포함됩니다. 포함 구조화된 클래스 인스턴스가 삭제될 때 모든 해당 인스턴스가 삭제됩니다.
아래 예제는 두 가지 가능한 Car 클래스 보기를 표시합니다.
그림 (a)에서 자동차는 클래스 바퀴에 대한 역할 이름 뒤쪽과 컴포지션 연관이 있고 클래스
엔진에 대한 역할 이름 e와 컴포지션 연관이 있는 것으로 표시됩니다. 클래스 엔진의 모든 인스턴스는 수 제한 없이
클래스 바퀴의 인스턴스와 링크될 수 있습니다.
그림 (b)에도 같은 내용이 지정됩니다. 그러나 추가로 그림 (b)에서는 다음이 지정됩니다.
-
뒤쪽 및 e는 클래스 자동차의 내부 구조에 속합니다. 이로 인해 세부사항의 스펙은
바퀴 및 엔진 클래스의 인스턴스에 대해서만 클래스 자동차의 컨텍스트 내에 보관되지만 일반적으로
바퀴(복수) 및 엔진(복수)에 대해서는 보관될 수 없습니다.
-
클래스 자동차의 컨텍스트 내에서 e 역할을 하는 인스턴스는 뒤쪽 역할을 하는 두 개의 인스턴스에만
연결될 수 있습니다. 또한 e 및 뒤쪽 역할을 하는 인스턴스는 클래스 자동차의 동일한 인스턴스의
역할인 경우에만 링크될 수 있습니다.
-
다시 말하면 클래스 바퀴 및 엔진의 인스턴스가 클래스 자동차의 인스턴스 내에서 각각의 역할을 수행하고 있는
경우 추가 제한조건이 해당 인스턴스에 적용됩니다. 이러한 제한조건은 일반적으로 바퀴 및 엔진의 인스턴스에는 적용되지 않습니다. 다른
바퀴(복수) 및 엔진(복수)은 그림 (a)에 지정된 대로 임의로 링크됩니다.
예제: 구조화된 클래스 내부에서 역할을 수행하는 파트
커넥터
커넥터는 구조화된 클래스의 두 파트 간 관계의 인스턴스입니다. 커넥터는 통신을 허용하는 링크입니다. 일반 연관을 사용하거나 프로시저 매개변수, 변수, 글로벌 값 또는 기타 메커니즘과 같은 임시 관계를 사용하여
커넥터를 구현할 수 있습니다.
구조화된 클래스의 내부 "연결(wiring_"은 어셈블리 커넥터 및 위임 커넥터를 사용하여 지정합니다.
-
구조화된 클래스의 구현 내에서 어셈블리 커넥터는 서로 다른 파트의 포트를 연결합니다. 한 구조화된 클래스의 포트에서 보낸 메시지는 다른 구조화된 클래스의 연결 포트에서
수신됩니다. 파트 세트의 포트를 통해 파트 세트를 연결할 수 있습니다. 파트는 다른 파트가 있고 연결된 포트의 제한조건을 충족한다는 점을 제외하고 다른 파트에 대한 정보를 알 필요가 없습니다. 구조화된
클래스 간 통신은 포트에 의해 모델링됩니다.
-
-
위임 커넥터는 구조화된 클래스의 외부 포트를 내부 파트 중 하나의 포트에 연결합니다. 외부 포트가 받은 메시지는 내부 파트의 포트로 전달되고, 내부 포트가 보낸 메시지는 외부
포트로 전달된 후 외부 포트에 연결된 구조화된 클래스에 전달됩니다.
포트
포트는 구조화된 클래스의 구조적 기능입니다. 선언된 인터페이스에 따라 포트를 통과하도록 구조화된 클래스의 외부에서 통신을 강제 실행하면 캡슐화가 증가할 수 있습니다. 이에 따라 해당 구조화된 클래스의 스펙 및
상호연결의 정밀도가 증가합니다.
포트의 필수 및 제공 인터페이스는 해당 상호작용 지점을 통과하는 상호작용에 필요한 모든 것을 지정합니다. 구조화된 클래스의 환경과의 모든 상호작용이 포트를 통해 수행되면 구조화된 클래스의 내부는 환경으로부터 완전히
분리됩니다. 이로 인해 해당 구조화된 클래스의 포트에서 지정한 제한조건을 충족하는 모든 컨텍스트에서 해당 구조화된 클래스를 사용할 수 있습니다.
포트 구현 방법에 대한 가정은 없습니다. 포트는 명시적 오브젝트로 구현될 수도 있고 구현에 명시적으로 나타나지 않는 단순한 가상 개념이 될 수도 있습니다.
포트의 예제는 다음과 같습니다.
예제 1
자동차 및 보트에 의해 사용되는 엔진의 포트
위 그림은 포트 p가 있는 클래스 엔진 및 두 개의 인터페이스를 표시합니다.
-
제공 인터페이스 동력전달계. 이 포트에서 엔진이 제공하는 서비스를 지정합니다(예: 이 포트에 도착한 통신에 의해 액세스 가능한 조작 및 수신).
-
필수 인터페이스 동력. 엔진이 환경에 제공할 것으로 예상하는 서비스를 지정합니다.
포트 p에서 엔진 클래스는 완전 캡슐화되며, 이 클래스는 엔진이 임베드될 환경에 대한 정보 없이 지정될 수 없습니다. 환경이 엔진의 제공 및 필수
인터페이스에 표현된 제한조건을 따르는 경우에만 엔진이 제대로 작동됩니다.
이 경우를 설명하기 위해 두 개의 엔진 클래스 사용이 이 예제에 표시됩니다.
-
자동차 클래스는 축을 사용하여 바퀴 세트에 엔진의 포트 p를 연결합니다.
-
보트 클래스는 선체를 사용하여 추진기에 엔진의 포트 p를 연결합니다.
엔진 및 해당 포트 p에 연결된 파트 간 상호작용이 제공 및 필수 인터페이스에 지정된 제한조건을 따르는 경우에만 차의 엔진 또는 보트의 엔진인지 여부에
관계없이 엔진이 지정된 대로 작동합니다.
또한 엔진에 다른 선언 포트(예: 연료 소비의 포트 f)가 있는 경우에도 자동차의 바퀴 및 보트의 추진기는 계속 포트
p를 통해 엔진에 액세스할 수 있습니다. 포트 f는 사용되는 연료 유형 및 자동차와 보트에 있을 수 있는 연료계 유형에
관계없이 연료계가 됩니다.
예제 2
이 포트 예제는 Java 2 플랫폼의 코어 로깅 기능인 다음 클래스와 인터페이스를 제공하는 패키지인 Java Logging API([JAV03])를 기반으로
합니다.
-
Logger는 응용프로그램이 로깅 호출을 작성하는 기본 엔티티입니다. 로거를 사용하여 특정 시스템이나 응용프로그램 컴포넌트에 대한 메시지를 로그합니다.
-
Level은 로그 메시지의 중요성과 긴급성에 대한 안내를 제공합니다.
-
Filter는 로그 레벨에서 제공되는 제어를 넘어서서 로그된 대상의 세분화된 제어를 제공합니다.
-
Handler는 로거에서 메시지를 가져와서 다양한 대상(메모리, 출력 스트림, 콘솔, 파일 및 소켓)으로 내보냅니다.
-
Formatter는 로그 레코드를 형식화하는 지원을 제공합니다.
해당 클래스 및 인터페이스에는 두 가지 중요한 협업 유형이 관련됩니다. 일부 클래스 및 인터페이스는 로그에 쓰는 데 사용되지만 다른 클래스 및 인터페이스는 로그를 관리하는 데 사용됩니다. 아래 그림에 표시된 로그를
사용하는 클라이언트 및 관리자의 두 가지 서로 다른 협업은 UML 협업으로 모델링되어 있습니다.
-
기록 협업. LogClient 역할은 LogWriter 역할에 연결되어 로그에 씁니다.
-
관리 협업. LogAdministrator 역할은 LogController 역할에 연결되어 로그에 액세스하고 로그
설정을 변경합니다.
로그를 사용하는 클라이언트 및 관리자의 서로 다른 협업
로깅 서비스 및 해당 협업을 모델링하는 한 가지 가능한 UML 2.0 표시는 아래 그림과 같이 포트 및 선언 인터페이스가 있는 컴포넌트를 사용하는 것입니다.
포트로 그룹화된 제공 인터페이스를 사용하여 컴포넌트로 구현되는 Java Logging API 패키지
Java Logging API 스펙에서 일부 로깅 서비스는 클래스로 다른 로깅 서비스는 인터페이스로 구현되었습니다. 이 예제에서는 각 해당 서비스를 컴포넌트 내부에서 파트로 실현될 수 있는 인터페이스로
모델링합니다. 위에서 언급한 기록 및 관리 협업과 관련된 두 가지 서로 다른 유형의 동작은 포트로 논리적으로 그룹화된 인터페이스에 의해 표시될 수
있습니다. 따라서 결과는 다음과 같습니다.
-
LogWriter 포트로 그룹화된 Logger 및 Level 인터페이스. 로그 클라이언트가 해당 인터페이스에
액세스하여 로그에 씁니다.
-
LogController 포트로 그룹화된 Handler, Filter 및
Formatter 인터페이스. 로그 관리자가 해당 인터페이스에 액세스하여 로그에 액세스하고 로그 설정을 변경합니다.
이 모델링 대체는 서로 다른 포트로 인터페이스를 논리적으로 그룹하여 문제가 구분됩니다. 컴포넌트 스펙 및 이 스펙이 외부와 설정하는 상호연결에 대한 추가 정밀도가 있습니다.
모델링
디자인하는 동인 클래스 및 컴포넌트는 연결된 파트의 콜렉션으로 분해되고 다시 추가로 분해될 수 있습니다.
컴포지트 구조 다이어그램을 사용하여 구조화된 클래스의 분해를 표시할 수 있습니다. 예제로 아래 그림은 발권 시스템의 매표소에 대한 컴포지트 구조 다이어그램을 표시합니다. 이 클래스는
세 개의 파트로 분해됩니다.
-
매표원 인터페이스
-
날짜 및 기타 기준에 따라 성능을 검색하는 성능 안내서
-
성능 및 표에 대한 데이터가 포함된 데이터베이스 세트
각 파트는 포트에 의해 올바르게 정의된 인터페이스를 통해 상호작용합니다. 전체 매표소는 포트를 통해 외부와 상호작용합니다. 이 포트의 메시지는 매표원 클래스로 디스패치되지만 매표소 클래스의 내부 구조는 외부
클라이언트에게 표시되지 않습니다.
예제: 발권 시스템의 컴포지트 구조 다이어그램
UML 1.x 표시
구조화된 클래스는 UML 2.0의 새로운 개념입니다.
RUP가 캡슐로 정의하는 대부분은 구조화된 클래스를 표기법으로 사용하여 표시할 수 있습니다(이 주제에 대한 자세한 정보는 중간 산출물: 캡슐 및
중간 산출물 가이드라인: 캡슐 참조).
사용 중인 도구가 UML 1.5만 지원하는 경우 대체 표시도 중간 산출물:
캡슐 및 중간 산출물 가이드라인: 캡슐을 참조하십시오.
자세한 정보는 UML 1.x 및 UML 2.0의 차이점을 참조하십시오.
|