개발자 끄적끄적
순차 다이어그램 본문
<순차 다이어그램>
- 순차 다이어그램은 서비스를 제공하기 위한 객체 간의 상호 작용(메시지 송수신)을 모델링한다
- 클래스 다이어그램이 시스템의 정적 구조를 나타내는 대표적인 모델인 반면에 순차 다이어그램은 시스템의 동적 흐름을 나타내는 대표적인 모델이다
- 순차 다이어그램은 목표 서비스를 제공하기 위해 필요한 객체를 정의하고, 객체간의 메시지 송수신 관계를 시간 순서에 따라 정의함으로써 서비스를 제공하는 과정을 묘사하는 모델이다
- 순차 다이어그램에서 객체는 가장 윗부분에 표현이 되고, 왼쪽에서 오른쪽으로 객체들을 나열한다
- [객체명 : 클래스명] 형식을 이용하여 표기하며 이중 어느 한쪽을 생략하여 표기할 수 있다.
- 객체는 박스로 표현하며 밑줄은 생략가능하다.(UML2.X버전)
- 인스턴스이름 : 클래스명
<메시지 표현>
- [시퀀스 번호][가드] : 리턴 값 = 메시지 이름[[인자리스트]]
- 메시지 이름을 제고외하고는 모두 생략가능
- 시퀀스 번호는 순차 다이어그램에서 굳이 기술할 필요가 없다
- 가드[guard]는 메시지가 송신되기 위해 만족해야 하는 조건
- 점선 화살표는 리턴 메시지를 표현
- 리턴 메시지는 메시지가 종료되었음을 표현하고 반드시 표기하여야 하는 것은 아니다. 리턴 메시지는 반환 값을 추가로 기록할 수도 있으며 반드시 활성 구간의 마지막 부분에서 나오게 표시
<인터렉션 오퍼레이터(interection operator)>
- opt : 특정 조건을 만족하는 경우에만 상호작용을 수행한다
- alt : 여러 상호작용들 중에서 조건을 만족하는 상호작용만 수행한다. 상호작용들은 점선으로 분리한다
- par : 동시에 실행되는 상호작용을 표현한다. 상호작용들은 점선으로 분리한다
- ref : 다른 다이어그램을 참조할 때 사용한다
<순차 다이어그램 작성>
public class A1{
public void doA1 {
A2 a2 = new A2();
a2.doSomething1(this);
doIt();
}
private void doIt(){
...
}
public void doThat(){
...
}
}
public class A2{
public void doSomething1(A1 a1){
A3 a3 = new A3();
a3.doSomething2();
a1.doThat();
}
}
public class A3{
public void doSomething2(){
...
}
}
<패키지 다이어그램>
- 관련 있는 요소들을 묶는 수단이 필요하다.
UML에서는 패키지를 사용하여 클래스들을 그룹화 할 수 있다
- 패키지는 클래스와 같은 여러 모델 요소들을 그룹화 시킬 수 있는 수단이다
- 패키지 내에 다른 패키지를 포함할 수 있다
- 모든 구성요소는 단지 하나의 패키지에만 포함될 수 있다
- 각 패키지는 하나의 네임 스페이스(name space)를 구성한다.
이 의미는 두 개의 모델 요소가 각기 다른 패키지에 속한다고 할 때 이들이 동일한 이름을 갖는 것을 허용한다는 것을 뜻한다
- 패키지를 제거하면 패키지 내의 모델 요소도 함께 사라진다
<패키지 관계>
- 패키지들 사이에는 의존관계(dependency relation)가 존재한다.
의존 관계는 점선 화살표(-->)로 나타낸다
- 만약 패키지 A가 패키지 B와 의존관계에 있을 때에는 A에 포함된 클래스가 B에 포함된 클래스들을 이용한다는 의미이다
즉, A의 어떤 클래스가 B의 클래스의 객체에 메시지를 보내거나 메소드의 인자로 사용할 때 또는 A의 클래스의 데이터 부분으로써 B의 클래스를 이용할 때 생긴다
- 의존관계가 의미하는 것은(Client --> Server)
- Client 패키지를 Server 패키지 없이 단독적으로 재사용할 수 없다
- Server 패키지에 변화가 발생하면 Client 패키지에 영향을 미칠 수 있다
<Import>
- 다른 패키지에 있는 public 클래스를 사용하기 위해서는 Import를 해야한다
- ex) Restaurant(+dinner) --> <<import>> --> Food::Desert(+Cookie)
<Java Code>
package foo.desert;
public class Cookie{
public Cookie() { ... }
private void decorate { ... }
}
*Cookie 클래스는 food.dessert 패키지에 속한다
import food.dessert.*;
package restaurant;
public class Dinner{
public void makeDinner{
Cookie c = new Cookie();
c.decorate();
}
*food.dessert.의 패키지에 있는 public 클래스들을 사용
*Dinner 클래스의 makeDinner에서 지역변수로 참조하기 때문에 연관관계가 아닌 의존관계로 모델링
'소프트웨어공학' 카테고리의 다른 글
응집도 (0) | 2024.04.16 |
---|---|
클래스 다이어그램(Class Diagram) (0) | 2024.04.11 |
Usecase Diagram (1) | 2024.04.03 |