Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

codingfarm

개요 본문

소프트웨어 공학/uml

개요

scarecrow1992 2020. 4. 25. 19:50

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

TreeMap.add 메서드

  • 위 그림은 시퀀스 다이어그램(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

topNode가 null이 아닐 경우

  • 위 그림은 $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
Comments