시퀀스 다이어그램이란 ?

 상태 다이어그램이 촉발 사건에 따른 단일 객체의 상태변화를 표현한 것이라면, 시퀀스 다이어그램은 어려 객체들이 시간 경과에 따라 객체 상호간 교류 과정을 표현한 것.


구성

- 객체 (Object) : 사각형으로 나타내며 밑줄이 들어가 있다. 

- 메세지 (Message) : 실선 화살표로 그려진다

- 시간 : 진행 상황을 나타내기 위하여 수직선으로 그린다. 


객체 

 시퀀스 다이어그램의 가장 윗 부분에 위치, 왼쪽에서 오른쪽으로 배열한다. 배열 순서는 다이어그램을 간략하게 하는 방향으로 기준을 삼는다. 각 객체로부터 아래로 뻗어가는 점선은 객체의 생명선(lifeline)이라 불린다. 생명선을 따라 좁다란 사각형이 나타나는데, 이 부분을 실행(activation)이라 한다. 즉, 객체가 수행되고 있음을 나타낸다. 사각형의 길이는 오퍼레이션 실행 소요 시간을 나타낸다. 


메시지

한 객체에서 다른 객체로 전송

한 객체의 생명선에서 다른 객체의 생명선으로 이동하는 것으로 표현

객체는 자기 자신에게 메시지를 보낼 수 있다. 


종류

- 단순 (Simple) 메세지 - 한 객체에서 다른 객체로 제어 흐름이 이동하는것. 

- 동기 (synchronous) 메세지 - 메세지 전송 후 수신 객체로 부터 그 메세지를 받았다는 답변이 와야 자신의 작업을 계속 할 수 있음.

- 비동기(asynchronous) 메세지 - 메세지 전송 후 수신 객체로 부터 답신을 기다리지 않고 작업을 계속 진행함. 


표기

시간 

- 시간을 수직 방향으로 표현한다. 

- 시간의 흐름은 위에서 아래로 흐른다.

예제) State Diagram의 GUI 시스템 예에서 GUI가 다른 객체들과 어떻게 교류를 하고 시간에 따라 작동을 하는지 알아보자. 


1. GUI는 키 입력을 운영체제에 알린다. 

2. 운영체제는 CPU에게 그 사실을 알린다. 

3. 운영체제는 GUI를 갱신한다. 

4. CPU는 비디오 카드에게 GUI 갱신에 필요한 명령을 내린다.

5. 비디오 카드는 모니터로 메시지를 전송한다.

6. 모니터는 화면에 Alpha Numberic 문자를 표시하고, 사용자에게 피드백을 제공한다. 

다음은 USECASE Diagram에서 Sequence Diagram으로 접근한 예.

USECASE 다이어그램에서 나온 "음료수 사기"의 예를 시퀀스 다이어그램에 적용한다. 


객체를 골라내면

- 프론트 : 음료수 자판기가 고객과 대화하는 유일한 인터페이스, 판매기 앞판에 있음

- 금전 등록기 : 돈을 체크하고 등록함.

- 디스펜서 : 음료수를 따르고 내어줌


처리과정을 작성해보면 다음과 같다. 


1. 소비자가 자판기의 프론트 앞에서서 투입구에 돈을 넣는다 (Insert)

2. 소비자가 마실 음료수를 고른다. (Select)

3. 돈이 금전 등록기에 들어간다. (Send)

4. 등록기는 선택된 음료가 디스펜서에 들어 있는지를 체크한다. 

5. 선택된 소다가 준비되어 있고, 등록기는 현금 잔고를 갱신한다. 

6. 등록기는 디스펜서를 사용하여 소다를 자동 판매기의 프론트로 보낸다.


이 예는 "음료수 사기" 쓰임새에서 단지 한개의 시나리오 (즉, 하나의 인스턴스에 대하여 그려지기 때문에, 이 다이어그램을 인스턴스 시퀀스 다이어그램 이라고 불린다. 

예제) "음료수 사기" 쓰임새에서 우린느 또 다른 시나리오를 가정할 수 있다. 선택된 음료수가 다 떨어진 경우 또는 소비자가 넣은 돈이 음료수 값과 맞지 않을 때, 이런 모든 경우를 하나의 시퀀스 다이어그램에 표현하고자 할 때 일반 시퀀스 다이어그램을 그리면 된다. 다음은 '액수에 맞지 않는 경우' 의 시나리오 이다.


1. 등록기는 소비자가 투입한 돈의 액수(input)가 음료수의 값(Price)와 맞는지 체크한다. 

2. 만일 액수가 음료수 값보다 많으면, 등록기는 차액을 계산하고 그 만큼의 현금 잔고가 있는지 체크를 한다. 

3. 만일 차액 만큼 현금이 잔고 (Cash reserve)에 남아 있다면, 등록기는 거스름돈(change)을 내어주고 나머지 동작은 그 전과 똑같이 진행한다.

4. 만일 차액 만큼의 현금이 잔고에 남아 있지 않으면, 등록기는 소비자가 투입한 돈을 그대로 돌려주고 "잔액이 부족합니다." 란 메세지를 표시한다.  

5. 만일 소비자가 투입한 돈의 액수가 음료수값보다 적으며, 등록기는 아무것도 하지 않고 돈이 더 들어올때 까지 대기한다. 


* 조건문을 표현하기 위해서는 대괄호 [ ] 안에 조건을 써주고, 이것을 메세지 화살표 위에 놓으면 된다.


▶ '액수가 맞지 않는 경우' 의 시나리오

예) "선택된 음료수가 떨어진 경우"의 시나리오


1.  소비자가 다 팔린 브랜드의 음료수를 선택한 후, 음료수 자판기는 "다팔렸음" 메세지를 표시한다.

2.  음료수 자판기는 다른 브랜드를 선택하라는 메세지를 표시한다. 

3. 이 때 소비자는 투입한 돈을 돌려 받을 수 있는 버튼 누를 선택권을 가진다.

4.  만일 소비자가 현재 자판기에 남아있는 음료의 브랜드를 선택(Selection in Stock), 하게 된다면 투입한 돈이 맞았을 경우 모든 과정이 시나리오 대로 진행된다. 그렇지 않다면, 음료수 자판기는 "액수에 맞지 않는 경우" 시나리오 대로 진행한다. 

5.  만일 소비자가 또 고른 음료수의 브랜드가 품절 상태라면, 현재 남아 있는 음료의 브랜드를 소비자가 선택하던지 돈을 돌려 받는 버튼을 누를때 까지 전 과정을 반복한다.


▶ "액수가 맞지 않는 경우" 시나리오와 "선택된 음료가 떨어진 경우"의 시나리오가 모두 추가된 상태의 자판기 Sequence Diagram

시퀀스 내에서 객체 생성

- 기존의 객체 표현 방법처럼, 이름이 붙은 사각형으로 표현

- 보통의 객체처럼 시퀀스 다이어그램의 위에 두지 않는다.

- 생성된 객체는 이것이 생성된 시간과 대응이 되는 위치에 놓는다. 


이 객체를 생성한 메세지는 "create()"라는 레이블이 붙으며, 여기서 ()는 오퍼레이션을 의미한다. → <<create>> 스테레오 타입을 사용할 수도 있다. 


* while 문의 표현

 조건의 표현인 [ ] 왼쪽에 '*"를 붙인다. 

Recursion 나타내기

객체가 자기 자신을 호출하는 구조의 오퍼레이션을 가지는 경우가 있는데, 이러한 오퍼레이션을 Recursion 이라고 한다. 


예제) 어떤 시스템에 계산기 객체가 포함되어 있다고 하자. 이 객체의 오퍼레이션 중 하나가 이자(interest)를 계산하는 것이라고 가정하고, 지난 기간을 모두 종합한 복리(compound interest)를 계산하기 위해 이 계산기 객체의 오퍼레이션은 각 기간의 복리를 사용하여 계속 자신을 호출해야 한다. 이것을 다음 Sequence Diagram으로 표현하면 다음과 같다. 


표현

 실행 사각형에다가 작은 사각형을 그리고, 오퍼레이션을 나타내는 메시지 화살표를 실행 사각형에서 작은 사각형 쪽으로 향하도록 그린다.