クラス図

統一モデリング言語 (UML)における**クラス図**（クラスず、英: class diagram）とは、クラス、属性、クラス間の関係からシステムの構造を記述する**静的な構造図**である。

クラス図とソースコードの同期が可能なUMLモデリングツールも存在する。

## クラス

ソフトウェアシステムにおけるクラスは、中にクラス名の記述された四角で表現する。クラスはドメイン等、ソフトウェア要素ではない要素であってもよい。例えば、車のタイヤ、化学物質の一種、料理の材料などである。

クラス名の下に*[[属性]]*（*[[プロパティ]]*）の区画を設けることができる。どの*属性*も最低でも名前を記述せねばならず、オプションとしてその型、初期値、その他の特性を記述することができる。

さらにその下に、クラスの*操作*（*[[メソッド (計算機科学)|メソッド]]*）の区画を設けることができる。どの*操作*も最低でも名前を記述せねばならず、オプションとしてその引数や戻り値を記述することができる。

他の区画を定義してもよい。例えば、保存する義務や必要条件、制限などである。

属性や操作に対し以下の可視性を付けることができる。

*" + "は*public*
*" # "は*protected*
*" - "は*private*
*" ~ "は*package*（パッケージ内で可視）

また、クラス図でクラス変数やクラスメソッドを表現するには、区画内の項目に下線を引けばよい。

## 関係

**関係**は、クラス図とオブジェクト図に見られる、以下に示すような論理的な連結の種類を総称する用語である。

### インスタンスレベルの関係

#### 関連とリンク

*リンク* は、基本的なオブジェクト間の関係である。オブジェクト図では、オブジェクトを表す長方形を実線でつなぐことでリンクを表す。
なお、ここで言うオブジェクトはプログラミング言語でのオブジェクトに限られない。

2つ（以上）のクラスのそれぞれのインスタンス間にリンクがありうる場合、これらのクラスに*関連* (association) があると言う。
2つのクラスに関連があることは、クラスを表す長方形を実線で結ぶことで表される。3者以上の関連を表す記法もある。
関連を表す線の端に、ロール名と呼ばれる、関連先の役割を表す名前を記すことができる。

関連の線を矢印（開いた矢印）とすることで、誘導可能性 (navigability) を表現することができる。

#### 集約
300px|thumb|2つのクラス間の集約を表すクラス図

*集約* (aggregation) は、関連の一種であり、"has-a" の関係を表す。

インスタンス間のリンクとしては、「部分」に相当するオブジェクトと「全体」に相当するオブジェクトの結びつきである。
「部分」側のインスタンスが複数の「全体」インスタンスに共有される場合、後述のコンポジションには該当せず、「集約」とされる。UML規格書では shared aggregation とも表記されている。

「全体」インスタンスが破棄されても、「部分」インスタンスが破棄されるとは限らない。

図では、クラスを結ぶ関連の線を書き、「全体」側の端に中抜きの菱形を付けることで表現する。

全体-部分の関係の例として、例えば「車とエンジン」の関係を挙げることができる。これは集約またはコンポジションとしてモデル化されうる。

#### コンポジション

*コンポジション* は、集約と同じく関連の一種であり、"has-a" の関係を表すが、集約よりも結びつきが強い。

コンポジションは、「集約」より制約が強く、「部分」側のインスタンスが共有されない。すなわち、「部分」インスタンスに対して結びついている「全体」インスタンスが同時には多くとも1個である。
両インスタンスのライフサイクルに強い関係があり、「全体」インスタンスが破棄される際には「部分」インスタンスもすべて破棄されることが普通である（必ずではない）。

表記は、「集約」と類似しているが、「全体」側の端に付ける菱形を黒塗りにする。

コンポジションでは、前述した制約（共有不可）により、全体側インスタンスの多重度は 0..1 か 1 となる。

### クラスレベルの関係

#### 汎化・特化
200px|right

*汎化*とは、一方のクラス（*スーパークラス*）がもう一方（*サブクラス*）に対してより一般的であると考えられることを表す。これはサブクラスのインスタンスがスーパークラスのインスタンスでもあることを意味している。
*特化*は、汎化の逆である。つまり、サブタイプはスーパータイプを特化したものである。

UMLでは、スーパークラス側に中抜きの三角を記述する事で表現する。

汎化・特化の関係は、"*[[is-a]]*"の関係としても知られる。

「継承」は、特化と関係はあるが同じではない。

汎化・特化の関係において、スーパータイプは"*親*"、"*[[スーパークラス (計算機科学)|スーパークラス]]*"、"*基底クラス*"、"*基底タイプ*"、"基本型"としても知られる。
サブタイプは"*子*"、"*[[サブクラス (計算機科学)|サブクラス]]*"、"*派生クラス*"、"*派生タイプ*"、"*[[派生型]]*"としても知られる。

この関係が生物の個体の親子関係とは類似していないことに注意。

汎化/特化の関係例として、例えば「貨物自動車は車の一種」という関係を挙げるとする。貨物自動車は車から特化され、車は貨物自動車から汎化されたといえる。

#### 実現

*実現*とは、一方のクラスがもう一方（インターフェースや仕様）の実装となっていることを表す。例えば、インターフェースとそれの実装となっているクラスの関係である。

UMLでは、インターフェース側に中抜きの三角を記述し破線を引く事で表現する。

### 一般的な関係

#### 依存
モデルの要素間に、片方を変更すればもう片方に変更が生じる依存が存在する。
「依存」には幾つかの名前付けされた種類がある。
依存はインスタンス間、クラス間、インスタンス-クラス間にあり得る。

図では、依存する側からされる側への破線矢印で表現する。
破線上に、ステレオタイプと呼ばれる、テキストをギュメ (« ») で囲んだものを付けて、依存の種類を記すことができる。

### 多重度

関連の関係は、関連するクラスの一方がもう一方を参照していることを意味する。

UMLでは、それらのインスタンスにおける*多重度*をクラス間の両端に記述することができる。多重度とは、その関連に参加するオブジェクトの数を示すものである。

## 関連項目
* オブジェクト指向モデリング
* ドメインモデル

## 外部リンク
*UML Reference Card
*Object Relationships
*Model Notation
*Introduction to UML 2 Class Diagrams
*UML 2 Class Diagram Guidelines
*UML Class Diagram
*UML Overview
*Umbrello manual
*ClassDraw Manual
*dotnetcoders.com
*javaworld.com
*objectmentor.com
*phppatterns.com php and uml class diagrams
*uml2php.com examples
*Class Diagrams for Java Programmers
*Understanding UML Class Relationships