[UML Distilled] 5장
5장. 클래스 다이어그램 : 고급 개념
키워드
- 심볼이 너무 많으면 사용자가 모든 심볼의 의미를 기억하기가 아주 힘들다.
- UML을 사용할 때는 종종 심볼의 개수를 줄이고 키워드(keyword) 를 사용한다.
책임
- 클래스 다이어그램에서 클래스의 책임을 나타내는 것이 좋을 때가 있다.
- 가장 좋은 방법은 클래스 내부에 주석문으로 나타내는 것이다.

그림 5.1 클래스 다이어그램에서 책임을 나타낸 예
정적 오퍼레이션과 속성
- 정적(static) : 인스턴스가 아닌 클래스에 적용되는 오퍼레이션이나 속성
- 정적 속성은 클래스 다이어그램에서 밑줄이 그어진다.

그림 5.2 정적 오퍼레이션 표기법
집합과 합성
- 집합(aggregation)
- ‘일부분이 되는’ 관계이다.
- 사용하지 않는 것을 권한다.

그림 5.3 집합
- 합성(composition)
- 하나의 클래스는 다른 많은 클래스의 컴포넌트가 될 수 있지만, 하나의 인스턴스는 단 하나의 소유자를 가져야한다.
- 어떤 인스턴스라도 그 소유자로 단 하나의 객체만을 가진다.
- “공유 불가”

그림 5.4 합성
파생 프로퍼티
- 파생 프로퍼티(derived property) 는 다른 값들을 기초로 계산할 수 있는 것이다.
- 소프트웨어 관점에서 몇 가지 다른 방법으로 해석될 수 있다.
- 값들 사이의 제약을 가리키는 것이다.

그림 5.5 기간에 대한 파생 속성의 예
인터페이스와 추상 클래스
- 추상 클래스(abstract class) 란 직접 인스턴스화 될 수 없는 클래스이다.
- 한 개 이상의 추상 오퍼레이션을 가진다.
- 추상 오퍼레이션(abstract operation) 은 구현을 가지고 있지 않다.
- UML에서 추상 클래스나 오퍼레이션을 표시하는 흔한 방법은 이텔릭체로 표시하는 것이다.
- 인터페이스(interface) 는 구현이 없는 클래스이다.
- 클래스는 인터페이스에 대해서 ‘제공하는’ 과 ‘필요로 하는’ 이라는 두 가지 관계를 가지고 있다.
- 클래스가 인터페이스를 대신할 수 있는 경우, 그것은 인터페이스를 제공하는 클래스이다.
- 작동을 하기 위해서 인터페이스의 인스턴스가 필요하다면 그것은 인터페이스를 필요로 하는 클래스이다.

그림 5.6 인터페이스와 추상 클래스를 Java로 나타낸 예
- 그림 5.7에서의 표기법은 막대 사탕(lollipop)으로 불린다.

그림 5.7 공 - 소켓 표기법
읽기 전용과 동결
- {readOnly} 키워드는 클라이언트가 읽을 수만 있고 수정할 수 없는 프로퍼티에 사용한다.
- 어떤 프로퍼티를 수정할 수 없을 때에 그 프로퍼티가 동결(frozen) 되었다고 하며, 불변(immutable) 이라고도 불린다.
참조 객체와 값 객체
- 객체는 고유성(identity) 을 가지고 있다.
- 고유성이 참조 객체에는 중요하지만 값 객체에 대해서는 그렇게 중요하지 않다.
- 참조 객체(reference object) 는 참조나 포인터를 사용한다.
- 만약 하나의 클래스에 대한 참조가 두 개 있고 그것들이 같은지를 알고 싶으면 보통 고유성을 비교한다.
- 값 객체(value object) 란 값을 사용한다.
- 만약 두 개의 날짜가 같은지를 비교하고 싶다면 고유성을 보는 것이 아니라 그것들이 나타내는 값을 본다.
- 값 객체의 값 자체는 불변이어야 한다.
- 만약 다른 객체의 날짜를 예상하지 못한 방법으로 변경할 경우 문제가 발생한다. 이 문제를 별명(aliasing) 이라고 한다.
한정 연관
- 한정 연관(qualified association) 은 관계 배열, 맵, 해쉬, 딕셔너리와 같은 프로그래밍 개념과 동등한 의미이다.

그림 5.8 한정 연관
클래스화와 일반화
- 일반화(generalization) 는 이행적(transitive)이지만 클래스화(classification) 는 그렇지 않다.
- 클래스화 다음에 일반화가 오면 합칠 수 있지만 반대의 경우는 아니다.
- UML에서는 일반화를 표기하기 위해서 일반화 심볼을 사용한다.
- 클래스화를 표현하려면 <<instantiate>> 키워드와 함께 의존을 이용한다.
다중 클래스화와 동적 클래스화
- 클래스화는 객체와 객체의 타입 간의 관계를 뜻한다.
- 단일 클래스화(single classification) 에서는 한 객체가 단일 타입에 속한다.
- 다중 클래스화(multiple classification) 에서는 객체가 반드시 상속 관계일 필요는 없는 몇 개의 타입으로 정의될 수 있다.
- 다중 클래스화는 특정한 타입을 정의하지 않고 한 객체가 여러 가지의 타입일 수 있도록 허용한다.
- 다중 클래스화를 사용할 경우, 어떤 조합이 적법한지에 대해서 확실히 알고 있어야 한다.
- UML 2에서는 각각의 일반화 관계를 일반화 집합(generalization set) 에 넣는 방법으로 이것을 행한다.
- 일반화 집합은 기본적으로 분리형(disjoint)이다. 상위 타입의 어떤 인스턴스라도 해당 집합 내의 하위 타입 중 오직 하나의 인스턴스만이 될 수가 있다.

그림 5.9 다중 클래스화
- 동적 클래스화(dynamic classification) 는 하위 타입 구조 안에서 객체가 클래스를 바꿀 수 있도록 허용하고, 정적 클래스화(static classification) 는 그렇지 않다.
연관 클래스
- 연관 클래스(association class) 는 그림 5.10과 같이 속성, 오퍼레이션 그리고 다른 기능들을 연관에 더할 수 있도록 한다.

그림 5.10 연관 클래스

그림 5.11 연관 클래스를 완전한 클래스로 만든 예
- 연관에 참여하는 두 개의 객체 사이에 오직 하나의 연관 클래스 인스턴스만이 있을 수 있다.

그림 5.12 연관 클래스의 미묘함(Role은 연관 클래스가 아니어야 한다)

그림 5.13 임시 관계를 위해 클래스를 사용한 예

그림 5.14 연관에서 <<temporal>> 키워드를 사용한 예
템플릿(매개변수) 클래스
- 몇 가지 언어는 매개변수 클래스(parameterized class) , 다른 말로 템플릿(template) 의 개념을 가지고 있다.
- 이 개념은 엄격한 타입의 언어(strongly typed language)에서 컬렉션을 사용할 때 가장 유용하다.
- Set와 같은 매개변수 클래스를 사용하는 것을 파생(derivation) 이라 한다.
- <<bind>> 키워드는 정련 관계(refinement relationship)의 스테레오 타입이다.

그림 5.15 템플릿 클래스

그림 5.16 결합 요소(버전 1)

그림 5.17 결합 요소(버전 2)
열거
- 열거(enumeration) 는 몇 가지 심볼 값 외에는 다른 프로퍼티를 갖지 않는 고정된 값 세트를 표현하는데 사용된다.

그림 5.18 열거
활성 클래스
- 활성 클래스(active class) 란, 인스턴스들을 가지고 있으며 인스턴스들이 각각 자신의 제어 스레드를 실행하고 제어하는 클래스를 말한다.

그림 5.19 활성 클래스
가시성
- 가시성(visibility) 을 표현하는 약어는 네 가지가 있다.
- + (public)
- - (private)
- ~ (package)
- # (protected)
- + (public)
Leave a comment