PlantUML クラス図 早見表

[PlantUML](https://plantuml.com/ja/)でクラス図を描く際よく使う記法をまとめています。

#目次
1. [フィールド、メソッドの表現](#1-フィールドメソッドの表現)
    1. [可視性の定義](#1-可視性の定義)
    2. [Static、Abstract](#2-staticabstract)
    3. [空のフィールド、メソッドの省略](#3-空のフィールドメソッドの省略)
2. [クラス間の関係](#2-クラス間の関係)
    1. [継承 Extension](#1-継承-extension)
    2. [実装 Implements](#2-実装-implements)
    3. [集約 Aggregation](#3-集約-aggregation)
    4. [構成 Composition](#4-構成-composition)
    5. [依存 Dependency](#5-依存-dependency)
    6. [内部クラス Inner Class](#6-内部クラス-inner-class)
3. [関係のラベル](#3-関係のラベル)
    1. [ラベル、矢印の追加](#1-ラベル矢印の追加)
    2. [多重度](#2-多重度)
4. [パッケージ](#4-パッケージ)

- [参考文献](#参考文献)

# 1. フィールド、メソッドの表現

## 1. 可視性の定義
可視性は以下で表現します。
`- : private`
`# : protected`
`~ : package private`
`+ : public`

```PlantUML
@startuml

class ClassA {
 -fieldA : int
 #fieldB : String
 ~methodA() : void
 +methodB() : String
}

@enduml
```
各可視性は記号で表現されます。

```plantuml
@startuml

class ClassA {
 -fieldA : int
 #fieldB : String
 ~methodA() : void
 +methodB() : String
}

@enduml
```

コマンド  `skinparam classAttributeIconSize 0` で可視性の記号化をオフにできます。
業務で使う場合、記号では伝わらない場合があるのでオフにしておいた方が良いかもしれません。

```PlantUML
@startuml
skinparam classAttributeIconSize 0

class ClassA {
 -fieldA : int
 #fieldB : String
 ~methodA() : void
 +methodB() : String
}

@enduml
```

```plantuml
@startuml
skinparam classAttributeIconSize 0

class ClassA {
 -fieldA : int
 #fieldB : String
 ~methodA() : void
 +methodB() : String
}

@enduml
```

## 2. Static、Abstract
静的、抽象的の表現は `{static}` 、 `{abstract}` 修飾子を使用します。

```PlantUML
@startuml

class ClassA {
 {static} +fieldA : String
 {abstract} +methodA() : void
}

@enduml
```

```plantuml
@startuml

class ClassA {
 {static} +fieldA : String
 {abstract} +methodA() : void
}

@enduml
```

## 3. 空のフィールド、メソッドの省略
コマンド `hide empty members` で空のフィールド、メソッドを省略することができます。
図のサイズを省略できるため気に入っています。
※以降このコマンドを使います。

```PlantUML
@startuml
hide empty members

class ClassA  {
}

class ClassB  {
field
}

class ClassC  {
method()
}

class ClassD  {
field
method()
}

@enduml
```

```plantuml
@startuml
hide empty members

class ClassA  {
}

class ClassB  {
field
}

class ClassC  {
method()
}

class ClassD  {
field
method()
}

@enduml
```

# 2. クラス間の関係
## 1. 継承 Extension
UMLでは、汎化、Generalizationと表現されますが、馴染みのある継承と表現しています。

```PlantUML
@startuml
hide empty members

abstract class AbstractClassA {
}

class ClassA {
}

AbstractClassA <|-- ClassA

@enduml
```

```plantuml
@startuml
hide empty members

abstract class AbstractClassA {
}

class ClassA {
}

AbstractClassA <|-- ClassA

@enduml
```

## 2. 実装 Implements
UMLでは、実現、Realization と表現されますが、馴染みのある実装と表現しています。

```PlantUML
@startuml
hide empty members

Interface InterfaceA {
}

class ClassA {
}

InterfaceA <|.. ClassA

@enduml
```

```plantuml
@startuml
hide empty members

Interface InterfaceA {
}

class ClassA {
}

InterfaceA <|.. ClassA

@enduml
```

## 3. 集約 Aggregation
子が親から独立して存在できる関係を表します。

```PlantUML
@startuml
hide empty members

Class House {
}

class Persion {
}

House o-- Persion

@enduml
```

```plantuml
@startuml
hide empty members

Class House {
}

class Persion {
}

House o-- Persion

@enduml
```

## 4. 構成 Composition
子が親から独立して存在できない関係を表します。一般に強い集約と表現されます。

```PlantUML
@startuml
hide empty members

Class Persion {
}

class Head {
}

Persion *-- Head

@enduml
```

```plantuml
@startuml
hide empty members

Class Persion {
}

class Head {
}

Persion *-- Head

@enduml
```

## 5. 依存 Dependency
一方がもう一方を使用する、または依存している関係を使用関係や依存関係と呼びます。

```PlantUML
@startuml
hide empty members

Class GasStation {
}

class Car {
}

GasStation <.. Car
@enduml
```
```plantuml
@startuml
hide empty members

Class GasStation {
}

class Car {
}

GasStation <.. Car
@enduml
```

## 6. 内部クラス Inner Class
内部クラスは以下のように表します。

```PlantUML
@startuml
hide empty members

Class OuterClass {
}

class InnerClass {
}

OuterClass +-- InnerClass

@enduml
```

```plantuml
@startuml
hide empty members

Class OuterClass {
}

class InnerClass {
}

OuterClass +-- InnerClass

@enduml
```

#3. 関係のラベル
## 1. ラベル、矢印の追加
クラス間の関係に対して `: text` をつけることでラベルを追加することができます。
`: text >`とすると矢印を付けることができます。

```PlantUML
@startuml
hide empty members

Class ClassA {
}

class ClassB {
}

class ClassC {
}

ClassA -- ClassB : text
ClassB -- ClassC : text >

@enduml
```

```plantuml
@startuml
hide empty members

Class ClassA {
}

class ClassB {
}

class ClassC {
}

ClassA -- ClassB : text
ClassB -- ClassC : text >

@enduml
```

## 2. 多重度
多重度は関係の両端に""で記載します。

```PlantUML
@startuml
hide empty members

Class ClassA {
}

class ClassB {
}

ClassA "1..*" -- "*" ClassB

@enduml
```

```plantuml
@startuml
hide empty members

Class ClassA {
}

class ClassB {
}

ClassA "1..*" -- "*" ClassB

@enduml
```

#4. パッケージ
```PlantUML
@startuml
hide empty members

package PackageA {
    Class ClassA {
    }

    package PackageB {
        Class ClassB {
        }
    }
}

@enduml
```

```plantuml
@startuml
hide empty members

package PackageA {
    Class ClassA {
    }

    package PackageB {
        Class ClassB {
        }
    }
}

@enduml
```

# 参考文献
この記事は以下の情報を参考にしました。

- [PlantUML クラス図](https://plantuml.com/ja/class-diagram)
- [PlantUMLでクラス図を作成](https://www.wakuwakubank.com/posts/565-design-uml-class/)
- [デザインパターンとともに学ぶオブジェクト指向のこころ](https://www.maruzen-publishing.co.jp/item/b294729.html)