魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

UML2.4(3) -クラス図-

投稿日:
修正日:
タグ:

クラス図

クラス図とは、クラス同士の静的な関係を表現した図である。オブジェクト図が処理の流れのある瞬間の関係を表しているのに対し,クラス図は処理の流れ全体を通した関係を示している。クラス図で表現する関係は以下の通りである。

  • 汎化
  • 実現
  • 関連
    • 誘導可能性
    • 集約
    • コンポジション
  • 依存
名称意味
クラス
  • 属性
  • 操作
classA
  • + varA
  • - varB
  • # varC
  • ~ varD
  • + funcA()
  • - funcB()
  • # funcC()
  • ~ funcD()
クラス
オブジェクトの共通部分を抜き出して抽象化したもの。クラスを実体化させたもののことをオブジェクトまたはインスタンスという。クラス図では、クラスはクラスやそのインスタンスを表すのに使用される。
属性
クラスが持つ性質のこと。
操作
クラスが持つ振る舞いのこと。アクセッサ(ゲッタ/セッタ)やコンストラクタの記述は省略される場合がある。
可視性
UMLアクセス指定子(Java)意味
+public全てのクラスからアクセス可能
-private自分のクラスからだけアクセス可能
#protected自分のクラスと継承クラスからのみアクセス可能
~同一パッケージ内からアクセス可能(package)
ローカル可視性
メソッド内だけで繋がること。
属性可視性
オブジェクトが存在している間繋がる長期的な関係のこと。
パラメータ可視性
メソッドの引数として受け取った際だけに繋がる一時的な関係のこと。

インタフェース
Javaのインタフェースを表現する場合、クラス名を<<Interface>>のようにステレオタイプ(<<type>>)で表現。
操作や属性の型を表現する場合、:で区切って右辺に記述する。
  • + 山田太郎 : 人
  • - var : int
  • + func() : boolean
  • + func(arg1 : int) : boolean
初期値
初期値は次のように=を使って表す。
  • + りんごの数 : 非負数 = 5
集約集合-要素の関係。例えば"A has a B"の時,AはBを集約するという意味となる。関連の一種で,JavaではAの属性としてBがある場合にこの記号で表す。
コンポジション集約の中でも強い関係のこと。 例えば"A is part of B"の時,コンポジションで表す。Javaでは,集合クラスのインスタンスが消滅すると、要素クラスのインスタンスも消滅するような関係の時にコンポジションで表現する。
関連
2つのクラスのインスタンス間に長期的な繋がりがあること。Javaでは属性として相手のオブジェクトを持つような場合に関連とする。集約やコンポジションがどちらのクラスの属性なのか明示しているのに対して,関連はどちらかの属性である場合や,それぞれ対等な関係の場合に関連で表現する。
誘導可能性関連がある2つのクラスのインスタンスで一方のクラスがもう一方のクラスを参照(メッセージを送信)できるか否か。参照できる場合は矢印、できない場合は✕印、未定義の場合はそのどちらでもない。Javaで使用する場合,例えば"A has a B"の関係で,かつCがBを属性として保持しなければならない場合で,概念的にはCとBが集約関係でない場合は,誘導可能性で"C→B"のように表現する。これにより,開発者はどちらのクラスの属性かを判断できる。
関連端(ロール)名 属性を関連で表現した場合,属性名や可視性は関連端名で表現する。
多重度 あるクラスの複数のインスタンスと別のクラスのインスタンスに関連がある時、それをまとめることができる。数は次のように表現する。
11
*0以上
1..31以上3以下の範囲
2..*2以上
例えばJavaで配列やコレクションを使用する際に多重度でまとめて表現できる。
依存 2つのクラスが一時的な関係がある時に依存で表現する。Javaでは,引数として一時的にそのクラスを利用するような場合やローカル変数で利用する場合に依存で表現する。例えばクラスAのあるメソッドがクラスBを引数として使用する場合に,"A→B"の方向で記述する。
汎化抽象-具象の関係(class)。 Javaでは"class B extends A"の時,"A→B"の方向で記述する。
実現抽象-具象の関係(interface)。Javaでは"class B implements A"の時,"A→B"の方向で記述する。

以下のコードは記事『UML2.4(2) -オブジェクト図-』 と同じものである。

import java.util.ArrayList;

class Guest {
  /*- 属性 -*/
  private ApplicationForm memAddAF;

  /*- 操作 -*/
  public Guest(){
    memAddAF = new ApplicationForm("鈴木太郎", "ZZZZZ", 012345, "XXX");
  }
  public ApplicationForm getMemAddAF(){return memAddAF;}
}


class ApplicationForm {
  /*- 属性 -*/
  public String name;
  public String address;
  public int tel;
  public String work;

  /*- 操作 -*/
  public ApplicationForm(String name, String address, int tel, String work){
    this.name = name;
    this.address = address;
    this.tel = tel;
    this.work = work;
  }
}


class Receptionist {
  /*- 属性 -*/

  /*- 操作 -*/
  public void postApplicationForm(ApplicationForm memAddAF){
    // 受付処理
  }
}

class Sample {
  /*- 属性 -*/

  /*- 操作 -*/
  /** エントリポイント */
  public static void main(String args[]){
    Guest suzuki = new Guest();
    Receptionist receptionist = new Receptionist();
    receptionist.postApplicationForm(suzuki.getMemAddAF());
  }
}

これをクラス図で抽象的に表現すると次のようになる。

一覧