UML이란?
· 통합 모델링 언어라는 의미로 소프트웨어 개념을 다이어그램으로 그리기 위해 사용하는 시각적인 표현법
· 용도: 문제 도메인, 소프트웨어 설계 제안, 완성된 소프트웨어 구현에 대한 다이어그램을 그릴 때 사용
UML을 사용해야 하는 이유
1. 다른 사람들과 의사 소통하기
· UML은 소프트웨어 개발자끼리 설계 개념에 대한 의견을 주고받을 때 편리하다. 다이어 그램은 코드의 구조가 어떻게 생겼는지 매우 분명하게 보여 준다.
- 아래 클래스 다이어그램을 보면 LoginServlet이 Servlet 인터페이스를 구현하고, UserDatabase를 사용하는 것을 쉽게 알 수 있다.
<-> 알고리즘 세부 내용을 전달하는 목적에는 UML이 유용하지 않다. 오히려 코드보다 읽기 어렵고, 만들기도 더 어려울 수 있다.
2. 로드맵 만들기
· UML은 대규모 소프트웨어 구조의 로드랩을 만들 때 유용하다.
- 로드맵을 통해 어떤 클래스가 다른 클래스에 의존하는지 파악할 수 있고, 전체 시스템 구조에 대한 참조표로 사용될 수 있다.
3. 백엔드 문서 만들기
· UML 다이어그램은 주의 깊게 생각한 후, 시스템의 핵심 내용을 짚어 기술한 핵심적 다이어그램 몇 개만 그리자.
- 수많은 선과 상자가 어지럽게 널린 미로를 헤매다 길을 잃게 만드는 다이어그램이 최악의 다이어그램이다.
· 문서 작성은 프로젝트 막바지 팀의 마지막 작업으로 하는 것이 좋다. 이렇게하면 팀이 프로젝트를 떠나느 시점의 설계 상태를 정확히 문서에 반영할 수 있다.
다이어그램 유형
· 세 종류의 다이어그램
정적 다이어그램(static diagram) | 클래스, 객체, 데이터 구조와 이것들의 관계를 그림으로 표현. 소프트웨어 요소에서 변하지 않는 논리적 구조를 보여줌. |
동적 다이어그램(dynamic diagram) | 실행 흐름을 그림으로 그리거나 실체의 상태가 어떻게 바뀌는지 그림으로 표현. 소프트웨어 안의 실체가 실행 도중 어떻게 변하는지 보여줌. |
물리적 다이어그램(physical diagram) | 소스 파일, 라이브러리, 바이너리 파일, 데이터 파일 등 물리적 실체와 이것들의 관계를 그림으로 표현. 소프트웨어 실체의 변하지 않는 물리적 구조를 보여줌. |
아래 이진 트리 알고리즘을 바탕으로 구현한 맵을 여러 유형의 다이어그램으로 표현해보자.
public class TreeMap {
TreeMapNode topNode = null;
public void add(Comparable key, Object value) {
if (topNode == null)
topNode = new TreeMapNode(key, value);
else
topNode.add(key, value);
}
public Object get(Comparable key) {
return topNode == null ? null : topNode.find(key);
}
}
class TreeMapNode {
private final static int LESS = 0;
private final static int GREATER = 1;
private Comparable itsKey;
private Object itsValue;
private TreeMapNode nodes[] = new TreeMapNode[2];
public TreeMapNode(Comparable key, Object value) {
itsKey = key;
itsValue = value;
}
public Object find(Comparable key) {
if (key.compareTo(itsKey) == 0) return itsValue;
return findSubNodeForKey(selectSubNode(key), key);
}
private int selectSubNode(Comparable key) {
return (key.compareTo(itsKey) < 0) ? LESS : GREATER;
}
private Object findSubNodeForKey(int node, Comparable key) {
return nodes[node] == null ? null : nodes[node].find(key);
}
public void add(Comparable key, Object value) {
if (key.compareTo(itsKey) == 0)
itsValue = value;
else
addSubNode(selectSubNode(key), key, value);
}
private void addSubNode(int node, Comparable key, Object value) {
if (nodes[node] == null)
nodes[node] = new TreeMapNode(key, value);
else
nodes[node].add(key, value);
}
}
클래스 다이어그램
· 클래스 다이어그램은 프로그램 안의 주요 클래스와 주요 관계를 보여 준다.
· 사각형은 클래스를 나타낸다.
· 화살표는 관계를 나타낸다.
· 아래 다이어그램에서 모든 관계는 연관(association)이다.
▶ 연관은 한쪽 객체가 다른 쪽 객체를 참조하고, 그 참조를 통해 다른 객체의 메서드를 호출하는 것을 나타내는 데이터 관계다.
· 연관 위에 쓴 이름은 참조를 담는 변수의 이름이다.
· 화살표 옆에 숫자는 이 관계를 맺음으로써 생기는 인스턴스의 개수를 나타낸다.
▶ 숫자가 1보다 크면, 컨테이너를 사용한다는 의미다. 컨테이너로 대개 배열을 사용한다.
· 클래스 아이콘은 여러 구획으로 나뉠 수 있다.
▶ 첫 번째 구획에는 클래스 이름을 쓰고, 다른 구획에는 함수와 변수를 쓴다.
- TreeMap 클래스는 add, get이라는 public 메서드가 있다.
- TreeMap은 topNode라는 변수로 TreeMapNode 객체를 참조한다.
- TreeMapNode 클래스는 nodes라는 컨테이너에 다른 TreeMapNode 인스턴스 두 개의 참조를 담아 둔다.
- TreeMapNode 클래스는 itsKey 변수로 Comparable 인터페이스를 구현하는 인스턴스를 참조에 담고, itsValues 변수로 이러한 제한이 없는 아무런 객체든 참조에 담는다.
객체 다이어그램
· 객체 다이어그램은 시스템 실행 중 어느 순간의 객체와 관계를 포착하여 보내준다.
▶ 한 순간 메모리 상태를 스냅사진으로 찍어둔 것
· 객체는 사각형으로 표현된다.
· 콜론(:)을 포함하여 밑줄 글자로 객체가 속한 클래스 이름이 표현된다.
· 객체 사이의 관계는 연결(link)이라 한다. 연결은 위 클래스 다이어그램의 연관에서 유도된다.
▶ 연결마다 nodes 배열의 두원에 이름이 각기 붙어 있다.
시퀸스 다이어그램
· 시퀸스 다이어그램은 시간 순서에 따라 객체 간의 상호 작용을 시각적으로 보여주는 다이어그램이다.
· 메시지를 보내고 받는 순서를 명확히 하는 것이 목적이다.
- 허수아비는 메서드 호출자를 나타낸다.
- 호출자는 TreeMap 객체의 add 메서드를 호출한다.
- topNode 변수가 null일 경우 TreeMap은 응답으로 새로운 TreeMapNode를 생성하고 그것을 할당한다. 변수가 null이 아닌 경우 topNode에 add 메시지를 보낸다.
- 대괄호([ ]) 안의 불린 표현식은 가드(guard)라고 하며, 어떤 경로를 따라가양 할지 알려 준다.
- TreeMapNode 아이콘에 닿은 화살표는 생성을 나타낸다.
- 한쪽 끝에 원이 그려진 작은 화살표는 데이터 토큰이라고 하고, 이 경우 데이터 토큰은 생성자의 인자를 나타낸다.
- TreeMap 아래 긴 사각형은 활성 샂아(activation)이라 부르고, add 메서드가 실행되는 데 시간이 어느정도 걸리는지 보여 준다.
협력 다이어그램
· 객체 간의 상호 작용을 시각적으로 보여주는 도구다. 객체 간의 상호 작용은 객체가 다른 객체와 메시지를 주고받으면서 일어나는 행위를 의미한다.
· 시퀸스 다이어그램과 담긴 정보는 같지만, 서로 목적이 다르다.
· 객체들은 연결이라 부르는 관계로 맺어진다. 어떤 객체가 다른 객체에 메시지를 보낼 수 있다면, 두 객체 사이에 연결이 있다고 말한다.
· 메시지는 작은 화살표로 그리고, 메시지 위에는 메시지 이름과 시퀸스 숫자, 메시지를 보낼 때 적용하는 모든 가드를 적는다.
· 호출의 계층 구조는 시퀸스 숫자의 점(.)을 사용한 구조로 알 수 있다.
- TreeMap.add 함수는 TreeMapNode.add 함수를 호출한다. 메시지 1.1번은 메시지 1번이 호출한 함수에서 처음 보내는 메시지를 나타낸다.
상태 다이어그램
· 객체의 동작 및 상태 전이를 시각적으로 표현하는 도구다. 시스템의 행동 방식을 파악할 때 유용하다.
▶ 예상하지 못한 경우에 시스템이 어떻게 행동해야 하는지 탐색할 기회를 마련해 주기도 한다.
· 화살표는 전이(transition)라고 부른다.
· 전이 화살표에는 전이를 일으키는 이벤트와 전이가 수행하는 행동을 레이블로 단다. 전이가 일어나면 시스템의 상태가 바뀐다.
- 위 기계는 두 가지 상태인 Locked와 Unlocked, 두 가지 이벤트인 pass와 coin이 있다.
- Lock 상태에서 coin 이벤트를 받으면, Unlocked 상태로 가고 Unlock 함수를 호출한다.
- Unlocked 상태에서 pass 이벤트를 받으면, Locked 상태로 가고 Lock 상태로 가고 Lock 함수를 호출한다.
- Unlocked 상태에서 coin 이벤트를 받으면, 그대로 Unlocked 상태에 남아 있으면서 Thankyou 함수를 호출한다.
- Locked 상태에서 pass 이벤트를 받으면, 그대로 Locked 상태에 남아 있으면서 Alarm 함수롤 호출한다.
UML을 그리는 도구
출처
UML 실전에서는 이것만 쓴다.
'기타 > UML' 카테고리의 다른 글
UML을 만드는 순서 (0) | 2023.03.24 |
---|
댓글