시작하기

설정

Class diagram

https://plantuml.com/ko/class-diagram

  • 일반화generalization: --|>

  • 실체화Realization: ..|>

  • 의존dependency: ..>

  • 연관association: --

  • 직접 연관directed association: -→

  • 집합aggregation, 집합 연관: o--, o-→

  • 합성composition, 복합 연관: *--, *-→

Generalization

  • 일반화, 상속 구조

  • "is a kine of" 관계

  • overriding되면 서브 클래스에 해당 함수/필드를 정의

@startuml
hide empty field
hide empty method

class User {
  +isHead(): Boolean
}
class HeadUser {
  +isHead(): Boolean
}
class AdminUser

User <|-- HeadUser
User <|-- AdminUser
@enduml
class User {
  fun isHead(): Boolean = false
}
class HeadUser: User() {
  override fun isHead(): Boolean = true
}
class AdminUser: User()

Realization

  • interface에 있는 명세를 오버라이딩하여 구현하는 것

  • "can do this" 관계

  • 두 가지 표현법이 존재함

스테레오 타입으로 정의
@startuml
hide empty field
hide empty method

class User
interface Changeable {
  +changeNickName(nickName: String): Unit
}
class HeadUser {
  +changeNickName(nickName: String): Unit
}

User <|-- HeadUser
Changeable <|.. HeadUser
@enduml
circle 형태로 정의
@startuml
hide empty field
hide empty method

class User
circle Changeable
class HeadUser {
  +changeNickName(nickName: String): Unit
}

User <|-- HeadUser
Changeable -- HeadUser
@enduml

Dependency

  • 클래스간 참조가 일어나는 것 중 하나

  • 메서드 내에서 대상 클래스의 객체를 생성하거나 사용, 리턴 받아 사용하는 것을 말함

  • 이 참조는 해당 클래스와의 관계를 계속 유지하지 않음

@startuml
hide empty field
hide empty method

class User
interface Changeable {
  +changeNickName(nickName: String): Unit
}
class HeadUser {
  +changeNickName(nickName: String): Unit
  +<b>createSchedule(): Schedule
  +<b>useSchedule(schedule: Schedule): Unit
}
class Schedule

User <|-- HeadUser
Changeable <|.. HeadUser
HeadUser .[dashed,thickness=2].> Schedule
@enduml
class HeadUser: User, Changeable {
  override fun changeNickName(nickName: String): Unit { ... }

  fun createSchedule(): Schedule {
    return Schedule() // 객체 생성 및 반환
  }

  fun useSchedule(schedule: Schedule): Unit {
    // 객체를 매개변수로 받아서 사용
  }
}

Association

  • 일반적인 연관은 실선으로 연결

  • Directed Association은 실선 후 끝에 화살표 추가

  • Composition은 전체와 부분이 강력한 연관 관계를 맺으며, 전체와 부분이 같은 생명 주기를 갖음

  • 독립적인 객체가 서로 상호작용하기 위해 맴버로 참조해야할 경우

  • ex) Car와 Engine의 관계

Association vs. Composition vs. Aggregation

jNyV5

Aggregation

  • 집합

  • Shared Aggregation

  • Aggregation은 전체와 부분의 연관 관계를 맺지만, 그러나 동일한 생명 주기를 갖지는 않음

  • 다른 어떤 것으로부터 빌린 객체가 존재. 전체가 죽어도 빌린 객체(부분)은 살 수 있음

    • ex) Person, Address 관계

  • 전체가 부분을 포함(has-a)하는 경우. 약한 관계

@startuml
hide empty field
hide empty method

class Person
class Address

Person o-- Address
@enduml
class Person {
  private val address: Address

  constructor(address: Address) {
    this.address = address
  }
}

Composition

  • Composite Aggregation 이라고도 함

  • 강한 집합을 의미

  • 전체와 부분이 같은 생명주기를 갖음

  • 객체를 소유하고 그 생명주기에 대한 책임을 갖는 경우. 전체가 죽으면 부분도 죽음

  • ex) Car-Engine, House-Room

@startuml
hide empty field
hide empty method

class Person
class Brain
class Heart
class Legs

Person *-- Brain
Person *-- Heart
Person *-- Legs
@enduml
class Person {
  private val brain: Brain = Brain()
  private val heart: Heart = Heart()
  private val legs: Legs = Legs()
}

Example

글꼴 지정

@startuml
skinparam defaultFontName "NanumGothic"

@enduml
@startuml
center footer © NAVER FINANCIAL Corp. All Rights Reserved.

@enduml

외부 puml 파일 참조하기

@startuml "name"
A -> B
B --> A
@enduml

다이어그램 가운데 정렬하기

@startuml
A -> B
@enduml

group 배경 투명하게 하기

AS-IS
@startuml
box "actor1" #lightblue
  participant A
  participant B
end box
participant C

A -> B
group group1
  B -> C
  C --> B
end group
@enduml
TO-BE
@startuml
box "actor1" #lightblue
  participant A
  participant B
end box
participant C

A -> B
group #transparent group1
  B -> C
  C --> B
end group
@enduml
Note

2022-02-10, 새로운 스타일 적용되면서 기본 투명으로 적용된 것 같음. ref

메모 넣기

@startuml
skinparam rectangle<<desc>> {
    backgroundColor Transparent
    borderColor Transparent
    titleFontColor Red
    stereotypeFontColor Transparent
}

folder folder2 {
    folder folder3 [
        text bla bla
    ]
    artifact art2 [
        more text
    ]
    rectangle f2<<desc>> [
        Here you can have some explanation with
        ====
        --Markdown-- //formatting// ~~elements~~
    ]

    folder3 -[hidden]- f2
}
@enduml
@startuml

folder folder2 {
    folder folder3 [
        text bla bla
    ]
    artifact art2 [
        more text
    ]

    label "간략한 내용을 남겨높는다" as simple_label
    folder3 -[hidden]down- simple_label
}
@enduml

Trick

PlantUML tricks

alt 에서 activate 이어지는 듯한 느낌 만들기

@startuml

A -> B: choice
activate B
alt case1
  ...
  B -> B: proc
  B --> A: res
  deactivate B
else
  B -[hidden]-> B
  activate B
  ...
  B -> B: proc
  B -> C: api
  activate C
  c --> B: res
  deactivate C
  B --> A: res
  deactivate B
end
@enduml

Examples

References