UMLクラス図の書き方と例

クラス

UMLのクラス図では、クラスをクラスアイコンで表現します。次にクラスアイコンの書式を示します。

<<ステレオタイプ>>
パッケージ::クラス
{プロパティリスト}
可視性 属性:型 = 初期値
可視性 操作(引数名:引数の型, ...):戻り値の型

クラスアイコンは名前区画、属性区画、操作区画の3つの区画(コンパートメント)に分かれている。属性区画と操作区画は省略することができる。

クラス名およびパッケージ名は太文字で表記します。抽象(アブストラクト)クラスやオペレーションは斜体(イタリック)で表記します。

ステレオタイプには以下のようなものがあります。

ステレオタイプ 意味
interface インタフェース

プロパティリストには次のようなものがあります。

プロパティリスト 意味
abstract 抽象クラス

可視性

可視性(visibility)には次のいずれかの記号を使用する。

可視性を表すUMLの記号
記号 Javaの修飾子 意味
+ public すべてのクラスからアクセス可能
# protected サブクラスまたは同一パッケージのクラスからのみアクセス可能
~ 指定なし 同一パッケージのクラスからのみアクセス可能
- private そのクラス自身からのみアクセス可能

属性区画

static属性は下線を引く。

操作区画

抽象操作は斜体で表わす。static操作は下線を引く。

Javaのソースプログラムと、UMLにおけるクラス図の例を次に示す。

class HelloWorld {
  private static final String MESSAGE = "Hello world!";
  public static void main(String[] args) {
      System.out.println(MESSAGE);
  }
}
HelloWorld
-MESSAGE:String = "Hello world!"
+main(args:String[]):void

UMLクラス図の継承

汎化はクラス間で属性や操作、関連を引き継ぐ。これは、JavaやC++の継承に相当する。UMLでは、実線に三角形を付けた矢印で表す。矢印の向きは、継承先から継承元への方向である。

汎化
Figure 1. 汎化

Javaのソースコードで表すと、次のようになる。

class SubClass extends SuperClass {
  // things to do
}

実装 (realization)

実装又は実現は操作のインタフェースを引き継ぐ。これは、Javaのインタフェース実装に相当する。UMLでは、破線に三角形を付けた矢印で表す。矢印の向きは、継承先から継承元への方向である。

実装
Figure 2. 実装

Javaのソースコードで表すと、次のようになる。

class ImplementClass implements Interface {
  // things to do
}

UMLクラス図の依存

依存は、あるモデル要素が他のモデル要素を必要としている関係を表している。依存関係には、意味的なものと構造的なものとがある。相手の変更によって影響を受ける関係であり、引数などで一時的に使用するクラスや、イベント通知などを表現するときに使用する。

UMLクラス図の集約

集約関連の一種で、「全体-一部(has-a)」関係を表す。UMLでは、集約は実線で表し、「全体」側の終端に白抜きの菱形を付ける。

コンポジション (composition)

コンポジション関連の一種で、より強い集約を表す。「全体」側オブジェクトが消滅する際に、「一部」側オブジェクトも消滅する。また、一度作られた関連は変化しない。UMLでは、集約は実線で表し、「全体」側の終端に黒塗りの菱形を付ける。

UMLクラス図の関連

クラス間に、参照や実態の保持などの関係があることを表す。線の両端に矢印を付けることができ、矢印がある場合は、その方向のみに関連があることを表す。これを誘導可能性 (navigability) と言い、矢印の無い関連は、誘導可能性が未知であるか、双方向であることを意味する。

ロール名 (role name)

関連の端に書かれる、関連先の役割を表す名前である。

UMLクラス図の多重度

関連の端に書かれ、関連の限られたオブジェクト間の数的関係を表す。具体的な数の他に、"0...n" や "*"(共に0以上)、"1...n"(1以上)、"2...4"(2から4)のように任意の数を設定できる。

クラス図の多重度で使われる記号
記号 説明
* 上限なし
ordered 順序付けができる/順序付けが存在する
unordered 順序付けができない/順序付けが存在しない(デフォルト)
unique ユニークである(デフォルト)
nonunique ユニークでない

多重度の書き方の例を以下に示す。

多重度
Figure 3. 多重度

CustomerはひとつのPurchaseを持つ。順序はなく、ユニークである。

多重度

Customerは0またはひとつ以上のPurchaseを持つ。順序はなく、ユニークである。

多重度

Customerは0またはひとつのPurchaseを持つ。順序はなく、ユニークである。

多重度

Customerはひとつ以上のPurchaseを持つ。順序があり、ユニークである。

多重度

Customerは3つから5つのPurchaseを持つ。順序があり、ユニークでない。

制約 (Constraint)

制約(Constraint)は、条件または制限である。

{ constraint }
constraint

日本語又は擬似プログラム言語で制約を記述する。

Queueクラスの属性sizeは0以上であるという制約をUMLで記述する例を示す。

属性に付けた制約

Customerクラスは、PersonクラスあるいはCorporationクラスのどちらか一方だけと関連を持つという制約をUMLで記述する例を示す。

属性に付けた制約

参考文献

OMG (2017) OMG Unified Modeling Language