Unified Modeling Language · OMG 표준 · 1997~현재
클래스 하나는 3구역으로 나뉜 직사각형으로 표현된다. 위에서부터 이름 → 필드 → 메서드 순서다.
| 기호 | 의미 | Rust |
|---|---|---|
+ | public (어디서든 접근) | pub fn foo() |
- | private (클래스 내부만) | fn foo() (기본값) |
# | protected (자식 클래스까지) | Rust에 직접 대응 없음 (pub(crate) 근사) |
~ | package (같은 패키지) | pub(crate) |
화살표 종류가 다르면 관계가 다르다. 각 기호를 하나씩 살펴보자.
실선 + 속이 빈 삼각형 화살표. 화살표가 부모를 향한다.
Dog is-a Animal. Dog는 Animal의 모든 특성을 물려받는다.
Rust에서: Rust에는 struct 상속이 없다. 트레이트 상속(trait Dog: Animal)이 이에 가장 가깝다.
점선 + 속이 빈 삼각형 화살표. 상속과 생김새가 비슷하지만 선이 점선이다.
인터페이스(trait)를 구현함을 나타낸다.
Rust에서: impl Flyable for Cat
실선 + 열린 화살표 (V자). "알고 있다" 관계. 한쪽이 다른 쪽을 참조한다.
숫자(다중성)가 붙으면 몇 개를 가리키는지를 나타낸다.
Rust에서: struct Owner { pets: Vec<Arc<Pet>> }
빈 마름모 ◇ = 집합(Aggregation)
Team이 없어도 Player는 다른 Team에 소속될 수 있다. 서로 독립적으로 존재 가능.
struct Team { players: Vec<&Player> }
빌림(borrow) — Player의 수명이 Team과 무관
채워진 마름모 ◆ = 합성(Composition)
House가 파괴되면 Room도 함께 사라진다. 생사를 같이한다.
struct House { rooms: Vec<Room> }
소유(own) — Room의 수명이 House에 종속
| UML 표기 | 의미 | Rust 타입 | 예시 |
|---|---|---|---|
1 | 정확히 1개 | T | 사람 → 뇌 1개 |
0..1 | 없거나 1개 | Option<T> | 사람 → 배우자 (없거나 1명) |
* 또는 0..* | 0개 이상 | Vec<T> | 쇼핑카트 → 아이템들 |
1..* | 1개 이상 | (T, Vec<T>) | 팀 → 최소 1명의 멤버 |
3 | 정확히 3개 | [T; 3] | RGB → 채널 3개 |
시간 흐름에 따른 객체 간 메시지 교환을 표현한다. 위에서 아래로 읽는다. "누가 누구에게 무엇을 요청하고 어떤 응답을 받는가"를 단번에 파악할 수 있다.
객체가 가질 수 있는 상태와, 어떤 이벤트가 발생했을 때 어느 상태로 전이하는지를 나타낸다. Rust의 enum과 직결된다.
위 다이어그램을 Rust enum으로 표현하면:
enum OrderStatus {
Pending,
Confirmed,
Shipped,
Delivered,
Cancelled,
}
impl Order {
fn confirm(&mut self) -> Result<(), &str> {
match self.status {
OrderStatus::Pending => { self.status = OrderStatus::Confirmed; Ok(()) }
_ => Err("cannot confirm"),
}
}
fn cancel(&mut self) -> Result<(), &str> {
match self.status {
OrderStatus::Shipped | OrderStatus::Delivered => Err("too late to cancel"),
_ => { self.status = OrderStatus::Cancelled; Ok(()) }
}
}
}
User가 Order를 여럿 낼 수 있고, Order는 여러 OrderItem을 합성(Composition)으로 포함한다. OrderItem은 Product를 참조한다.
주문 생성 흐름 — Browser → OrderController → PaymentService 순서로 호출된다.
주문 상태 머신. Pending → Confirmed → Shipped → Delivered 가 정상 경로. Cancelled는 Shipped 이전에만 가능.
외울 필요 없다 — 이 표를 북마크해두고 다이어그램 볼 때마다 참고하면 된다.
| 화살표 모양 | 이름 | 뜻 | Rust 대응 |
|---|---|---|---|
| 실선 ─── △ (빈 삼각형) | 상속 | is-a 관계, 부모 쪽을 향함 | trait Child: Parent |
| 점선 ···· △ (빈 삼각형) | 구현 | 인터페이스(trait) 구현 | impl Trait for Type |
| 실선 ─── → (열린 화살표) | 연관 | 참조를 가짐, "알고 있다" | Arc<T> 또는 &T 필드 |
| 실선 ◇── → (빈 마름모) | 집합 | 포함하지만 독립적 생존 | Vec<&T> (빌림) |
| 실선 ◆── → (채워진 마름모) | 합성 | 생사를 같이함, 부모가 소유 | Vec<T> (소유) |
| 점선 ···· → (열린 화살표) | 의존 | 사용하지만 필드 아님 | 함수 파라미터, 로컬 변수 |