일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Trie
- 그래프
- MYSQL
- 이진탐색
- String
- Dijkstra
- SQL
- union find
- 스토어드 프로시저
- two pointer
- Stored Procedure
- binary search
- Two Points
- Brute Force
- DP
- 다익스트라
- Hash
- Today
- Total
codingfarm
개요 본문
UML이란 Unified Modeling Language 의 줄임말로써 소프트웨어 개념을 다이어그램으로 표현하기 위한 프로그램 설계도이다.
즉, 모델링언어이다.
- UML의 사용목적은 문제 도메인, 소프트웨어 설계 제안, 이미 완성된 소프트웨어 구현에 대한 다이어그램 그리기에 있다.
- 이러한 서로 다른 세 가지 차원을 각각 개념(conceptual), 명세(specification), 구현(Implementation) 이라 구분한다.
- 여기서는 주로 명세와 구현에 대해 다룬다.
가령 개는 포유류 이다. 라는 문장을 UML 다이어 그램으로 표현하면 아래와 같다.
위 그림은 Animal과 Dog 2개의 존재가 일반화(generalization) 관계로 연결되었음을 묘사한다.
Animal은 Dog의 일반화이다.
Dog는 Animal의 특이 케이스(special case) 이다.
더 추론할것 없이, 이것이 이 다이어그램이 의미하는 전부이다.
다이어그램을 코드로 표현하면 아래와 같다.
public class Animal {}
public class Dog extends Animal {}
위코드는 Animal과 Dog가 상속(inheritance) 관계의 클래스임을 정의한다.
다이어그램 타입(Diagram Types)
아래는 UML에서 주로쓰이는 다이어그램을 볼 수 있다.
UML은 3개의 주된 주된 종류의 다이어그램을 가지고 있다.
1. 정적 다이어그램(static diagram)
$\bullet$ 클래스와 오브젝트, 데이터구조를 묘사함으로써 소프트웨어 요소의 변화없는 논리적인 구조 및 그들 사이의 관계에 대해 설명한다.
2. 동적 다이어그램(dynamic diagram)
$\bullet$ 실행의 흐름을 묘사함으로써 소프트웨어들이 실행하는 동안 어떻게 변화 하는지를 보여준다.
3. 물리적 다이어그램(physical diagram)
$\bullet$ 소스파일과 라이브러리, 파이너리파일, 데이터파일 등 이것들의 관계와 실체를 묘사함으로써 소프트웨어의 변하지 않는 물리적인 구조를 보여준다.
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);
}
}
- 위 코드는 map 기반의 간단한 바이너리 트리 알고리즘이다.
Class Diagram
위의 클래스 다이어그램은 주요 클래스(major class)와 프로그램상에서의 관계를 보여준다.
$TreeMap$ 클래스가 $add$와 $get$이라는 public method가 있음을 보여주며 $topNode$라는 이름의 변수로 $TreeMapNode$를 reference하고 있음을 보여준다.
$TreeMapNode$는 2개의 다른 $TreeMapNode$ instance를 nodes라는 이름의 컨테이너를 통해 참조하고있으며 $itsKey$와 $itsValue$라는 이름의 2개의 다른 인스턴스를 참조하고있다.
$itsKey$ 변수는 비교가능한(Comparable) 인터페이스를 실행하는 몇몇의 인터페이스를 참조한다.
$itsValue$ 변수는 몇몇의 오브젝트를 참조한다.
클래스 다이어그램의 미묘한 차이에 대해 배워보기에 앞서, 우리가 알아야할 몇몇의 사실들이 있다.
$\bullet$ 사각형은 클래스를, 화살표는 관계를 나타낸다.
$\bullet$ 다이어그램에서 모든 관계는 오브젝트가 소유한 레퍼런스, 메서드에 연관이 있다.
$\bullet$ 관계도에 나오는 이름은 참조를 위한 변수명이다.
$\bullet$ 화살표 끝에있는 숫자는 전통적으로 참조된 인스턴스의 갯수를 알려준다. 보통 참조된 숫자가 1개 초과이고 array와 같은 container가 쓰였다면 사용된다.
$\bullet$ <<interface>> 기호는 비교가능한 인터페이스임을 의미한다.
$\bullet$ 대부분의 표기법은 선택사항이다.
연결관계가 어떻게 인스턴스 변수에 대응하는지에 주목하라.
가령 $TreeMap$에서 $TreeMapNode$로의 관계는 $topNode$라는 이름으로 이루어져있다. 코드를 보면 $TreeMap$클래스에 $topNode$변수가 있음과 일치함을 알 수 있다.
Object Diagrams
위는 오브젝트 다이어그램이다. 오브젝트들의 집합과 시스템이 실행되는 순간의 관계를 보여준다. 이는 메모리의 스냅샵으로 볼 수 있다.
이들의 이름이 아래에 적혀있기 때문에 각 네모칸은 오브젝트라 볼 수 있다. 콜론(:)이후에 나오는 이름은 오브젝트가 속한 클래스 명이다.
각 오브젝트의 아래칸에 $itsKey$변수가 있음에 주목하라.
오브젝트사이의 관계는 링크(link)라고 불린다. 링크는 $nodes$배열에서 두 배열 셀에 대해 이름 붙여짐에 주목하라.
Sequence Diagrams
- 위 그림은 시퀀스 다이어그램(Sequence Diagram) 이다.
- 이는 TreeMap.add 함수가 어떻게 실행되는지를 설명한다.
- 왼쪽의 stick figure는 알수없는 호출자를 의미한다. 이 호출자는 $TreeMap$ 오브젝트 상의 $add$ 메서드의 호출을 원한다.
- 만약 $topNode$변수가 $null$이면 $TreeMap$은 새로운 $TreeMapNode$를 창조하고 $topNode$에 할당한다.
- $topNode$변수가 $null$이 아니면 $TreeMap$은 $add$메시지를 기존에 있던 $topNode$ 객체에 보낸다.
- 대괄호안의 bool식은 guards라 불린다.
- 이들은 어떤경로(화살표)가 선택될지를 보여준다.
- $TreeMapNode$ 아이콘에서 종료되는 메시지 화살표는 구성을 나타낸다.
- 동그라미가 포함된 작은 화살표는 data tokens 라고 불린다. 위의 예에서는 매개변수를 구성하는데 쓰인다.
- $TreeMap$ 아래에 있는 길쭉하고 작은 사각형은 activation이라 불리며 얼마나 긴 시간동안 $add$메서드가 실행되는지를 나타낸다.
Collaboration Diagrams
- 위 그림은 $treeNode$가 $null$이 아닐때 $TreeMap.add$를 묘사하는 Collaboration Diagram이다.
- 이는 Sequence diagram와 똑같은 정보를 나타낸다.
- 그러나 Sequence Diagram이 메시지의 순서를 명확히 하는 반면에, Collaboration diagram은 오브젝트간의 관계를 명확히 나타낸다.
- 오브젝트들은 link라 불리는 관계에 의해 연결되어젔다.
- 링크는 오브젝트가 메시지를 다른 오브젝트로 어디서든지 보낼수 있음을 나타낸다. 메시지들은 이름,순서번호 그리고 적용된 guards 를 통해서 표식된다.
- sequence number의 dot structure는 계층(hierarchy)을 나타낸다(상속은 아니다).
- $TreeMap.add$ 함수가 $TreeMapNode.add$를 호출하면 message 1(1: add(key,value))에 의해 호출된 함수에 의해서 message 1.1(1.1 : add(key,value))은 첫번째로 호출되는 함수임을 나타낸다.
State Diagrams
uml은 FSM(Finite State Machine)에 관한 매우 복합적인 주의사항을 가진다. 아래 그림은 그 표기법의 가장흔한 부분집합을 보여준다.
위 그림은 지하철 회전식 개찰구에 대한 state machine을 보여준다. 여기에는 $Locked$와 $Unlocked$라는 이름을 가진 2개의 상태가 주어진다. 2개의 $events$는 아마도 machine에게 보내질것이다. $coin$ 이벤트는 사용자가 회전식 개찰구에 동전을 넣었음을 의미한다. $pass$이벤트는 사용자가 회전식 개찰구를 통과함을 의미한다.
화살표는 $trasitions$라고 불린다. 그들은 trigger의 변화와 변화를 수행하는 $action$에 대한 $event$와 함께 표식된다. 변화가 트리거 되었을때 시스템 상태가 변화한다.
결론적으로 위의 이미지는 아래와 같이 정리할 수 있다.
$\bullet$ $Locked$상태에 있을때 $coin$이벤트가 발생하면, $Unlocked$상태로 변화하고 $Unlock$함수를 호출한다.
$\bullet$ $Unlocked$ 상태에 있을때 $pass$ 이벤트가 발생하면, $Locked$상태로 변화하고 $Lock$ 함수를 호출한다.
$\bullet$ $Unlocked$ 상태에 있을때 $coin$ 이벤트가 발생하면, $Unlocked$상태로 변화하고 $Thankyou$함수를 호출한다.
$\bullet$ $Locked$ 상태에 있을때 $pass$ 이벤트가 발생하면, $Locked$상태로 변화하고 $Alarm$함수를 호출한다.
이러한 다이어그램들은 시스템 작동 방식의 파악(figuring out the way a system behaves)에 매우 유용하다. 이들은 우리에게 예상할수 없는 시스템을 탐색할 기회를 준다
'소프트웨어 공학 > uml' 카테고리의 다른 글
2. 다이어그램으로 작업하기 (0) | 2021.06.20 |
---|---|
클래스 다이어그램 개요 (0) | 2020.07.10 |