본문 바로가기
기타/UML

UML(Unified Modeling Language)이란?

by 책 읽는 개발자_테드 2023. 3. 23.
반응형

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을 그리는 도구

https://www.lucidchart.com/

https://plantuml.com/

 

출처

UML 실전에서는 이것만 쓴다.

 

반응형

'기타 > UML' 카테고리의 다른 글

UML을 만드는 순서  (0) 2023.03.24

댓글