객체가 메시지를 통해 어떻게 상호작용하는지를 보여주는 다이어그램 →동적 객체 모델링
동등하지만, 다른 초점을 가지고 있음
public class A {
B myB;
// 기타 코드
public void doOne() {
myB.doTwo();
myB.doThree();
}
}
:Register
에서 :Sale
로의 링크 또는 탐색 경로가 있으며, 이 경로를 따라 makePayment
메시지와 같은 메시지가 흐를 수 있다.msg1
메시지가 :Register
객체로 전달된다.msg2
, msg3
, msg4
메시지가 :Register
객체에서 :Sale
객체로 순서대로 전달된다.msg5
메시지가 :Sale
객체에서 :Register
객체로 반환된다.public class Register {
Sale mySale;
public void msg2() {
mySale.processMsg2();
}
public void msg3() {
mySale.processMsg3();
}
public void msg4() {
mySale.processMsg4();
}
public void receiveMsg5() {
// 메시지 처리 로직
}
}
public class Sale {
public void processMsg2() {
// 메시지 처리 로직
}
public void processMsg3() {
// 메시지 처리 로직
}
public void processMsg4() {
// 메시지 처리 로직
}
public void sendMsg5(Register register) {
register.receiveMsg5();
}
}
create
라는 메시지를 사용함(일부는 new
로 표시)
UML 태그 값 {new}
를 라이프라인 상자에 추가하여 생성을 강조할 수 있다.
덜 명확한 메시지 이름을 사용하는 경우, 메시지를 <<create>>
와 같은 UML 스테레오타입으로 주석을 달아서 명확하게 할 수 있다.:Register
객체가 create(cashier)
메시지를 :Sale
객체로 보낸다.:Register
객체가 create(cashier)
메시지를 :Sale {new}
객체로 보낸다.:Register
객체가 «create» 1: make(cashier)
메시지를 :Sale
객체로 보낸다.
→ 명확하지 않은 생성 메시지 이름이 사용된 경우, 메시지에 스테레오타입을 사용하여 명확하게 할 수 있다.msg1
메시지가 :A
객체로 전달된다.1: msg2
메시지가 :A
객체에서 :B
객체로 전달된다.1.1: msg3
메시지가 :B
객체에서 :C
객체로 전달된다.:Foo
객체가 message1
메시지를 보낸다.1 [color = red] : calculate
메시지가 조건에 따라 :Bar
객체로 전달된다.1a [test1] : msg2
와 1b [not test1] : msg4
는 상호 배타적 경로다.test1
조건이 참이면 msg2
가 전송되고, 거짓이면 msg4
가 전송된다.msg2
는 msg3
로, msg4
는 msg5
로 이어진다.1 * [i = 1..n]
과 같은 형태로 표현된다.
여기서 i
는 1..n
은 반복 범위를 나타낸다.lineItems
컬렉션의 각 요소를 반복하고 있음을 나타낸다.:Sale
객체는 1 * [i = 1..n] : st = getSubtotal
메시지를 통해 lineItems[i]
에서 SalesLineItem
객체를 가져온다.lineItems
컬렉션의 많은 SalesLineItem
객체 중 하나의 인스턴스를 나타낸다.lineItems[i]
는 많은 SalesLineItems
컬렉션에서 하나의 요소를 선택하는 표현이다. i
값은 메시지 절에서 온다.t = getTotal
메시지가 :Sale
객체로 전달된다.1 * : st = getSubtotal
메시지가 :Sale
객체에서 lineItems[i] : SalesLineItem
객체로 전달된다.doX
메시지가 :Foo
객체로부터 발생한다.1: locs = getAvailableLocales
메시지가 정적 메서드 호출을 나타내며, 이는 Calendar
메타클래스에 전달된다.authorize
메소드가 :Register
객체로부터 :Payment
객체로 전달된다.
:Payment
는 추상 슈퍼클래스 역할의 객체이다ClockStarter
객체가 Clock
객체의 run
메소드를 ClockStarter
는 Clock
의 응답을 기다리지 않고 바로 다음 작업을 수행할 수 있다.
ClockStarter
객체가 System
클래스의 runFinalization
메소드를 ClockStarter
는 System
의 응답을 받을 때까지 대기한다.
Clock
객체는 lineItems[i]
, 그룹에서 하나의 객체 선택Sale
객체가 getTotal
메소드를 호출하여 총합을 계산한다.lineItems
컬렉션의 각 요소에 대해 getSubtotal
메소드를 호출하여 소계를 구한다.[ i < lineItems.size ]
는 컬렉션의 크기만큼 루프를 수행하도록 한다.SalesLineItem
객체 중 하나의 인스턴스를 나타냄
lineItems[i]
는 여러 SalesLineItem
컬렉션에서 하나의 요소를 선택하는 표현식; 'i' 값은 루프 프레임의 조건에서 동일한 'i' 값을 나타냄
액션 박스는 임의의 언어 구문을 포함할 수 있음 (이 경우 'i' 증가)
적용되는 생명선 위에 배치됨:Foo
객체는 doX
메소드를 호출한다.doX
메소드 내에서 Calendar
클래스의 getAvailableLocales
정적 메소드를 호출한다.getAvailableLocales
메소드는 locale 배열을 반환하며, 이 배열은 Foo
객체 내에서 사용된다.Register
객체는 doX
메소드를 호출하여 Payment
추상 클래스의 authorize
메소드를 호출한다.Payment
의 서브클래스인 CreditPayment
나 DebitPayment
에서 실제로 실행된다.authorize
메소드를 고유하게 구현하여 각기 다른 방식으로 처리한다.ClockStarter
는 startClock
메소드를 호출하여 Clock
객체를 생성한다.Clock
객체는 생성된 후 run
메소드를 호출하며, 이는 비동기 호출로 표시된다.Clock
객체는 System
클래스의 runFinalization
메소드를 호출한다.Thread
객체와 start
메시지를 생략하여 단순화하였다.Clock
생성과 run
메시지가 비동기 호출을 의미한다.