보키_기록용

[UML 실전에서는 이것만 쓴다 :: 4장] 시퀀스 다이어그램 본문

공부/UML

[UML 실전에서는 이것만 쓴다 :: 4장] 시퀀스 다이어그램

bokki0117 2022. 10. 30. 21:46

기본 개념

시퀀스 다이어그램 기본 개념

  • 표기
    • 협력에 참여하는 객체와 클래스는 맨 위에 그린다. 객체는 이름 아래 밑줄이 있어서 클래스와 구분된다.
    • Actor : 익명의 객체. 협력 과정에 들어오고 나가는 모든 메시지의 시작점이자 마지막점. 모든 시퀀스 다이어그램이 익명 액터를 갖지는 않지만, 가지는 경우가 많다.
    • 인자(Argument) : 메세지 이름 뒤 괄호 안에 적거나, 데이터 토큰(반대쪽 끝에 원이 그려진 작은 화살표)아래에 적는다.
    • 시간이 아래쪽으로 흐르니까 메세지는 아래쪽에 있을수록 나중에 보낸 것이다.
    • 활성상자(Activation) : 꼭 그리지 않아도 되는 선택사항이다. 어떤 함수가 실행되는 시간을 나타낸다.

 

  • 생성과 소멸

객체 생성(왼쪽의 시퀀스 다이어그램을 코드로 나타내면 오른쪽이 된다)

 

public class ShapeFactory
{
	public Spape makeSquare()
    {
    	return new Sqare();
    }
}

 

 

 

  • 생성 : 이름이 붙지 않은 메세지의 화살표 끝이 객체의 생명선이 아니라 생성될 객체를 가리킨다.

 

public class TreeMap
{
	private TreeNode topNode;
    public void clear()
    {
    	topNode = null;
    }
}

 

  • 소멸 : 자바에서 객체는 명시적으로 소멸되지 않으며, 가비지 컬렉터가 대신 객체를 소멸시킨다. 가비지 컬렉터에 소멸하고싶은 객체를 명시적으로 말하고 싶은 경우 X자를 가리키는 메시지 화살표를 쓴다.

 

  • 단순한 반복

  • 반복할 메세지 주위에 상자를 그려서 표현할 수 있다. 
  • 반복 조건은 대괄호로 둘러싸서 상자 안쪽에 적는다. 보통 상자의 오른쪽 아래에 적는다.

※ 유용하긴 하지만, 시퀀스 다이어그램은 객체 사이의 연결을 드러내기 위해 사용해야지, 알고리즘의 세부사항을 자세하게 보여 주기 위해 사용해서는 안 된다.

 

  • 사례와 시나리오
    • 수많은 객체와 메세지로 가득 찬 복잡한 다이어그램을 그리지 말 것. 
    • 핵심만 집어서 더 작은 시퀀스 다이어그램을 여러 개 그리는 법을 익혀라.
    • UML 다이어그램에서는 차이점보다 공통점이 중요하다. 공통점에 초점을 맞춰라.

 

고급 개념

  • 반복과 조건

  • 반복 표현문(recurrence expression) : 대활호 안 경계 표현식(guard expression)이 거짓인 동안 반복해서 이 메세지를 보내라. *[ while id = idList.next() ]
  • 활성 상자가 겹쳐져 있는 것은 같은 객체 안에서 함수 두 개가 실행 중임을 의미한다.
  • [payday]는 if 문장이다. 둘째 활성상자는 이 경계조건([payday])가 참일 겨우에만 제어 흐름을 넘겨받는다. 따라서 isPayday가 참일 경우에만 calculatePay, calculateDeductions, sendPayment가 실행된다.

알고리즘을 UML로 그리는 것은 아무리 잘한다고 해도 거추장스럽기만하다. '어떤 알고리즘을 표현할 때는 코드 자체가 훨씬 좋다.'

 

  • 시간이 걸리는 메세지들

  • 보통 메세지를 보내는 시간을 고려하지 않는다. 이런 경우 선을 수평으로 그린다. 하지만, 시간이 걸리는 메세지의 경우 각도가 있는 선을 그려서 표현한다.
  • 경쟁조건(race condition) : 비동기적으로 작동하는 두 존재가 동시에 실행할 수 없는 함수를 호출할 때 생긴다.
  • 소프트웨어 시스템에서 경쟁조건을 찾아내고 디버깅하는 일은 무척 어려울 수 있으므로, 이런 종류의 다이어그램이 도움이 될 수 있다.

 

  • 비동기 메세지 

  • 동기 메세지(synchronous messege) : 어떤 객체에 메세지를 보낼 때 메세지를 받은 객체가 수행을 마칠 때까지는 제어를 되찾지 못하는 방식으로 작동하는 메세지.
  • 비동기 메세지(asynchronous messege) : 메세지를 보내는 객체가 메세지를 보낸 후 즉시 제어를 다시 받고, 메세지를 받는 객체가 다른 스레드의 제어 흐름에서 실행되는 메세지.
  • 위쪽의 메세지가 UML 2.0에서 비동기 메세지를 나타내는 방식이지만, 이 책에서는 옛날 방식인 아래쪽 메세지를 선호한다.
  • 일반적으로, 자신이 호출해서 이루려는 작업이 완전히 수행되기 전에 호출한 함수가 먼저 반환할 것이라고 예상할 수 있을 때 그 메세지를 비동기적이라고 표현한다.

 

  • 다중 스레드

  • 비동기 메세지를 쓴다는 말은 곧 제어 흐름에서 다중 스레드를 사용한다는 뜻이다.
  • 스레드 식별자(이름) : 메세지 이름 앞에 T1같은 식별자를 쓰고 콜론(:)을 찍어놓는다.
  • 스레드 식별자가 반드시 코드에서 쓰이는 이름과 대응할 필요는 없다. 스레드 식별자는 다이어그램을 위해서 붙이는 것이다.

 

  • 활동적인 객체

  • 활동적인 객체(active object) : 독립된 내부 스레드를 가진 객체. 두꺼운 외곽선으로 그린다.
  • 자신만의 스레드를 만들고 제어하는 객체는 모두 활동적인 객체다. 
  • 활동적인 객체의 메서드에 대해서는 특별한 제한이 없다. 그 객체의 스레드에서 돌아가도되고, 그 메서드를 호출하는 스레드에서 돌아가도 된다.

 

  • 인터페이스에 메세지 보내기

interface Logger {
	void logMessage(String msg);
}

public class AsynchronousLogger
	implement Logger {
    ...
}

이 애플리케이션은 Logger  인터페이스에 메세지를 보내는데, 객체의 실제 타입이 AsynchronousLogger 클래스라는 것은 모른다. 이를 시퀀스 다이어그램으로 표현하려면 (왼쪽)

여기서 그 타입이 구현한 인터페이스로 메세지를 보낸다고 명확히 말하고 싶은 경우, 생명선 위에 인터페이스 막대 사탕을 그려서 이 경우를 표현한다. (오른쪽)

 

결론

  • 시퀀스 다이어그램은 객체지향 애플리케이션에서 메세지 흐름에 대해 다른 사람과 의사 소통하기 위한 강력한 방법이다.
  • 시퀀스 다이어그램을 남용하거나 과용하기 쉽다. 
  • 시퀀스 다이어그램은 너무 많은 것보다 너무 적은 것이 좋다.
Comments