이 글은 Unified Modeling Language(UML)에서 사용되었던 필수 다이어그램에 관한 기술자료 시리즈입니다. 시퀀스 다이어그램에 대해 설명했던 이전 기술자료에서는, UML 1.4 스팩에서OMG의 Adopted 2.0 Draft Specification of UML (UML 2)로 초점을 이동했습니다. 이 글에서는 UML 2에 도입된 새로운 다이어그램 카테고리인 Structure Diagram에 대해 설명합니다. 본 시리즈의 목적은 표기법 요소들과 이들의 의미를 설명하는 것이므로, 이 글에서는 주로 클래스 다이어그램에 초점을 맞춥니다. 이렇게 하는 이유는 곧 명확해 질 것입니다. 후속 기술자료에서는 Structure 카테고리에 포함된 기타 다이어그램을 설명합니다.
이 글을 읽는 독자들에게 다시 한번 당부하고 싶은 것은 UML 표기법 요소들에 관한 것이고, 이 글은 모델링에 대한 최상의 접근 방식에 대한 가이드나 첫 번째로 모델링 되어야 할 것을 결정하는 방법에 대해서는 설명하지 않습니다. 이 글의 목표이자 본 시리즈의 목표는 표기법 엘리먼트에 대한 기본적인 지식, 즉 신택스와 의미를 설명하는 것입니다. 이러한 지식을 기반으로 여러분은 다이어그램을 읽고 알맞은 표기법 요소들을 사용하여 자신만의 다이어그램을 만들 수 있습니다.
여러분은 객체 지향 디자인에 대한 기본적인 지식이 있을 것으로 간주하겠습니다. OO 개념에 대한 설명이 필요하다면http://java.sun.com/docs/books/tutorial/java/concepts/에서 객체 지향 프로그래밍을 다룬 Sun의 튜토리얼을 보시기 바랍니다. "What Is a Class?" 와 "What Is Inheritance?" 섹션에서는 이 글을 읽을 때 도움이 될 만한 정보들이 있습니다. 또한 David Taylor의 Object-Oriented Technologies: A Manager's Guide 역시 객체 지향 디자인을 잘 설명하고 있습니다.
앞서 언급했던 것처럼, 클래스 다이어그램의 목표는 시스템 내에서 모델링 되는 유형을 보여주는 것이다. 대부분의 UML 모델에서는 다음과 같은 유형들이 있다.
그림 1: Flight 클래스에 대한 클래스 다이어그램
name : attribute type |
flightNumber : Integer |
이 Flight 클래스 예제에서, 애트리뷰트 유형 정보와 함께 클래스의 애트리뷰트를 기술할 수 있다. (표 1)
표 1: 애트리뷰트 유형 정보를 가진 Flight 클래스의 애트리뷰트 이름
name : attribute type = default value |
balance : Dollars = 0 |
애트리뷰트에 대한 기본 값을 보여주는 것은 선택적이다. 그림 2는 기본 값이 0인, balance라고 하는 애트리뷰트를 가진 Bank Account 클래스를 보여준다.
그림 2: 기본 값이 0 달러인 balance 애트리뷰트의 값을 보여주는 Bank Account 클래스 다이어그램
클래스 연산 리스트
클래스의 연산은 클래스 다이어그램의 세 번째(가장 밑에 있는) 부분에 나타난다. 이것 역시 선택적이다. 애트리뷰트와 마찬가지로, 클래스의 연산은 리스트 포맷으로 디스플레이 되고, 각 라인마다 연산이 있다. 연산은 다음과 같은 표기법을 사용하여 문서화 된다.
name(parameter list) : type of value returned |
Flight 클래스의 연산은 아래 표 2로도 매핑 될 수 있다.
표 2: 그림 2를 표로 나타낸 Flight 클래스의 연산
그림 3을 보면 delayFlight 연산이 Minutes 유형의 인풋 매개변수 numberOfMinutes를 갖고 있다는 것을 알 수 있다. 하지만 delayFlight 연산에는 리턴 값이 없다.
1 하나의 연산이 매개변수를 갖고 있을 때, 매개변수들은 연산의 괄호 안에 놓이게 된다. 각 매개변수는 "parameter name : parameter type" 포맷을 사용한다.
그림 3: Flight 클래스 연산 매개변수들에는 "in" 표시가 포함된다.
연산의 매개변수들을 문서화 할 때, 매개변수가 연산의 인풋인지 또는 아웃풋인지를 보여주기 위해 선택적인 인디케이터를 사용할 수도 있다. 이러한 선택적인 인디케이터는 그림 3의 연산 부분에 나타난 것처럼 "in" 또는 "out"으로 나타난다. 일반적으로, 이러한 인디케이터는 Fortran 같은 오래된 프로그래밍 언어가 사용되지 않는 한 불필요하다. 하지만, C++과 자바에서, 모든 매개변수들은 "in" 매개변수들이고, "in"은 UML 스팩에 따라 매개변수의 기본 유형이기 때문에 대부분의 사람들은 인풋/아웃풋 인디케이터를 생략한다.
상속(Inheritance)
객체 지향 디자인의 가장 중요한 개념인 상속(inheritance)은 하나의 클래스(자식 클래스)가 또 다른 클래스(슈퍼 클래스)의 동일한 기능을 상속받을 수 있고 고유의 새로운 기능을 추가할 수 있다는 것을 의미한다. (기술적인 비유법은 아니지만, 필자는 어머니의 음악적 재능을 물려받았고, 우리 가족 중에서 전자 기타를 연주할 수 있는 사람은 필자뿐이다.) 클래스 다이어그램에 상속을 모델링 하려면, 속이 투명한 화살표(또는 삼각형)가 슈퍼 클래스를 향하도록 하여 자식 클래스(작동을 상속받는 클래스)로부터 직선이 그려진다. Bank Account 유형을 생각해 보자. 그림 4는 CheckingAccount와 SavingsAccount가 BankAccount 클래스에서 상속을 받는 모습이다.
그림 4: 투명 삼각형 모양의 화살표가 슈퍼 클래스를 가리키면서 직선으로 상속이 표시된다.
그림 4에서, 상속 관계는 각 하위 클래스 마다 개별 라인으로 그려지는데, 이것은 IBM Rational Rose와 IBM Rational XDE에서 사용되는 방식이다. 하지만, 트리 표기법(tree notation)으로 상속을 그리는 방법도 있다. 그림 4처럼 두 개 이상의 자식 클래스들이 있을 때 트리 표기법을 사용할 수 있다. 나무 가지처럼 상속 라인들이 합쳐지는 경우는 예외이다. 그림 5는 그림 4의 상속을 트리 표기법으로 다시 그린 것이다.
Figure 5: 트리 표기법을 사용한 상속
추상
클래스와
연산
주의력이
깊은
독자라면
그림 4와 5의
다이어그램이 BankAccount 클래스
이름과 withdrawal 연산에
이탤릭
체를
사용하고
있음을
알아챘을
것이다. BankAccount 클래스는
추상
클래스이고, withdrawal 메소드는
추상
연산이라는
것을
나타내는
것이다. 다시
말해서, BankAccount 클래스는 withdrawal의
추상
연산을
제공하고 CheckingAccount와 SavingsAccount의
두
개의
자식
클래스들은
각각의
연산
버전을
구현한다.
하지만, 슈퍼 클래스(부모 클래스)는 추상 클래스일 필요가 없다. 일반적으로 표준 클래스가 슈퍼 클래스가 된다.
제휴(Association)
시스템을
모델링
할
때, 특정
객체들은
서로
연관될
것이고, 이러한
관계들이
명확하게
모델링
되어야
한다. 다섯
가지
제휴
유형들이
있다. 이
섹션에서는
두
가지
유형-양방향(bi-directional) 제휴와
일방향(uni-directional) 제휴를
설명하고, 나머지
세
가지
제휴
유형들은 기초를
넘어서 섹션에서
설명하도록
하겠다. 각각의
제휴
유형을
사용할
시기까지는
이
섹션에서는
설명하지
않겠다. 각
제휴
유형의
목표에
초점을
맞춰, 클래스
다이어그램에
제휴를
그리는
방법을
설명하도록
하겠다.
양방향 (표준) 제휴
제휴는
두
클래스들간
연결이다. 제휴는
언제나
양방향(bi-directional)으로
간주된다. 다시
말해서, 일부
다른
유형으로
수정하지
않는
한, 두
개의
클래스들이
서로를
인식하고
있고
그
관계를
알고
있다는
의미이다. 그림 6은 Flight 클래스와 Plane 클래스
간
표준
제휴
유형이다.
그림 6: Flight 클래스와 Plane 클래스간 양방향 제휴 예제
양방향 제휴는 두 클래스들 간 일직선으로 표시된다. 각 라인의 양 끝에 역할과 값을 표시한다. 그림 6은 Flight이 특정 Plane과 연결되어 있고, Flight 클래스는 이러한 관계를 알고 있다는 것을 보여준다. Plane은 이 제휴 관계에서 "assignedPlane"의 역할을 담당하고 있다. Plane 클래스 옆에 있는 역할 이름이 이를 말해주고 있다. Plane 옆에 있는 Multiplicity 값 0..1은 Flight의 인스턴스가 있을 때, Plane의 한 인스턴스가 이것과 연결되었거나, 어떤 Plane도 이것과 연결되지 않았다(비행기가 아직 지정되지 않았을 경우)는 것을 의미한다. 그림 6에서는 Plane이 Flight 클래스와의 제휴 관계를 인식하고 있음을 보여준다. 이러한 제휴 관계에서, Flight은 "assignedFlights"의 역할을 맡는다. 그림 6의 다이어그램은 Plane 인스턴스가 어떤 비행 스케줄과도 제휴될 수 없거나(새로운 비행기일 경우) 또는 많은 비행 스케줄(이 비행기가 지난 5년 동안 사용 중일 경우)과 연결될 수 있다는 것을 나타낸다.
표 3에는 Multiplicity 값들과 이것의 의미를 정리했다.
표 3: Multiplicity 값과 인디케이터
일방향
제휴
일방향
제휴에서는, 두
개의
클래스들은
관련이
있지만, 단
하나의
클래스만
그
관계를
인식하고
있다. 그림 7은
일방향
제휴의
예제이다.
그림 7: 일방향 제휴 예제: OverdrawnAccountsReport 클래스는 BankAccount 클래스에 대해 알고 있지만, BankAccount 클래스는 제휴 관계에 대해 모른다.
일방향 제휴는 알려진 클래스를 가리키는 개방된 화살표(상속을 나타내는데 사용되었던 닫힌 또는 삼각형 화살표가 아니다.)가 있는 직선으로 그려진다. 표준 제휴와 마찬가지로, 일방향 제휴에는 역할 이름과 Multiplicity 값이 포함되지만, 표준 양방향 제휴와는 달리, 일방향 제휴에는 알려진 클래스에만 역할 이름과 Multiplicity 값이 포함된다. 그림 7의 예제를 보면, OverdrawnAccountsReport는 BankAccount 클래스에 대해 알고 있고 BankAccount 클래스는 "overdrawnAccounts"의 역할을 수행한다. 하지만, 표준 제휴와는 달리, BankAccount 클래스는 이것이 OverdrawnAccountsReport와 제휴되어 있다는 사실을 모른다. 2
패키지
대형
시스템
또는
비즈니스의
큰
유형을
모델링
한다면, 모델에
다양한 Classifier가
있을
것이다. 이
모든
클래스들을
관리하기란
매우
어렵다. 따라서, UML은
패키지(package)라고
하는
요소를
제공한다. 패키지는
모델러가
모델의 Classifier를
네임스페이스로
구성할
수
있도록
하는데, 이는
일종의
파일링
시스템의
폴더와
같은
것이다. 시스템을
다중
패키지들로
나무면
시스템은
더욱
이해하기
쉽고, 특히
각
패키지가
시스템의
특정
부분을
나타낼
때
더욱
그렇다. 3
- 큰 직사각형 안에 패키지의 멤버들을 보여주기로 결정했다면, 모든 멤버들 4 은 직사각형 안에 놓여야 한다. 또한 패키지의 이름은 패키지의 작은 직사각형에 놓여야 한다. (그림 8)
- 모델러가 큰 직사각형 밖에 패키지의 멤버들을 보여주기로 결정했다면, 다이어그램에 나타날 모든 멤버들은 직사각형 밖에 놓여야 한다. 어떤 Classifier들이 패키지에 속했는지를 보여주려면, 각 Classifier부터 패키지에 붙은 원 안에 플러스 부호가 있는 원으로 선을 그어야 한다. (그림 9)
그림 8: 패키지의 직사각형 바운더리 안에 멤버들을 보여주는 패키지 엘리먼트 예제
그림 9: 연결된 선들을 통해 멤버쉽을 보여주는 패키지 엘리먼트 예제
클래스와 인터페이스는 다르다. 클래스는 그 유형의 실제 인스턴스를 가질 수 있지만, 인터페이스는 이를 실행할 적어도 한 개의 클래스를 가져야 한다. UML 2에서, 인터페이스는 클래스 모델링 요소를 특화 한 것으로 간주한다. 따라서, 인터페이스는 클래스처럼 그려지지만, 직사각형의 맨 위 부분에는 "«interface»" 라는 텍스트가 붙는다. 그림 10 5
그림 10: Professor와 Student 클래스들이 Person 인터페이스를 구현하는 클래스 다이어그램 예제
기타
제휴
유형들
앞서
양방향
제휴와
일방향
제휴를
설명했다. 이제는
나머지
세
가지
제휴
유형들을
설명하도록
하겠다.
그림 11: 제휴 클래스 MileageCredit 추가하기
기본 애그리게이션과 Composition Aggregation을 자세히 살펴보도록 하자.
그림 15: 애트리뷰트와 연산의 가시성을 보여주는 BankAccount 클래스
지금까지 기본적인 내용과 고급 주제들을 다루었다. 이제 UML 1.x에 추가된 새로운 표기법에 대해 알아보자.
인스턴스의 표기법은 클래스와 같지만, 맨 위 부분에 클래스 이름 대신, 이름에는 밑줄이 생긴다.
Instance Name : Class Name |
Donald : Person |
그림 16: Plane 클래스의 인스턴스 예제 (관심 있는 애트리뷰트 값들만 보인다.)
그림 17: 클래스 대신 인스턴스를 사용하는 그림 6의 예제
그림 18: 각자 다른 역할을 가진 그림 14의 클래스를 보여주는 클래스 다이어그램
그림 19: 객체들 간 관계만 보여주는 클래스 다이어그램
다음 시리즈는 "UML 기초:" 컴포넌트 다이어그램이다.
UML의 기초: Unified Modeling Language 소개 (한글)
UML의 기초: Part II: The activity diagram
UML의 기초: Part III: The class diagram
Donald Bell은 IBM Global Services의 IT 전문가이고, 웹 기반 기술 애플리케이션 분야에서 고객을 지원하고 있다. (bellds@us.ibm.com)
출처 : http://www.ibm.com/developerworks/kr/library/sep04/bell/index.html
'SW개발' 카테고리의 다른 글
[안드로이드 버전 정보] (0) | 2011.10.10 |
---|---|
[Jar파일에서 Class쉽게 찾기] (0) | 2011.09.27 |
[안드로이드]SQLite Client Tool (2) | 2011.09.16 |
[안드로이드 로그 보는 툴] (0) | 2011.09.02 |
[VI 명령어] (0) | 2011.08.29 |
Unified Modeling Language (UML) (0) | 2011.08.26 |
[Source Insight]편하게 주석달기2 (0) | 2011.04.27 |
Clear Case 를 Source Insight와 Beyond Compare와 연동하기 (0) | 2011.04.26 |
강력한 무료 압축 프로그램 7zip (0) | 2011.04.26 |
Trace32. Image view (0) | 2011.04.26 |