クラス図の基本構成要素
文脈に応じて、クラス図のクラスは、主要なオブジェクト、アプリケーション内の相互作用、またはプログラミング対象のクラスを表すことができます。「UMLにおけるクラス図とは?」という問いに答えるには、まずその基本的な構成を理解する必要があります。
- クラス:システム内でオブジェクトを作成し、動作を実装するためのテンプレート。UMLにおいて、クラスは共通の構造と動作を共有するオブジェクトまたはオブジェクトのセットを表します。クラス名、その属性、およびその操作の行を含む長方形で表されます。クラス図でクラスを描く場合、最上行のみの記入が必須であり、より詳細な情報を提供したい場合、他の行は任意となります。
- シグナル:アクティブオブジェクト間の単方向かつ非同期の通信を表す記号。
- データ型:データ値を定義する分類子。データ型は、プリミティブ型と列挙型の両方をモデリングできます。
- パッケージ:図の中の関連する分類子を整理するために設計された図形。大きなタブ付きの長方形の図形で表されます。
- インターフェース:一連のまとまった動作を定義する操作シグネチャや属性定義のコレクション。インターフェースはクラスに似ていますが、クラスはその型のインスタンスを持つことができるのに対し、インターフェースはそれを実装するクラスが少なくとも1つ必要である点が異なります。
- 列挙型:ユーザー定義のデータ型の表現。列挙型には、列挙型の値を表す識別子のグループが含まれます。
- オブジェクト:1つまたは複数のクラスのインスタンス。具体的なインスタンスまたは典型的なインスタンスを表すために、オブジェクトをクラス図に追加できます。
- 成果物(アーティファクト):ドキュメント、データベース、実行可能ファイル、ソフトウェアコンポーネントなど、ソフトウェアシステム内の具体的なエンティティを表すモデル要素。
クラス内のセクション
標準的なクラスは、次の3つのセクションで構成されています:
上部セクション
クラスの名前が含まれます。分類子について話しているかオブジェクトについて話しているかに関わらず、このセクションは常に必須です。クラス名は以下を満たす必要があります:
- 大文字で始まること。
- 太字で書かれていること。
- 上部セクションの中央に配置されていること。
- 説明的であること。
中央セクション
クラスの属性が含まれます。このセクションを使用して、クラスの性質を記述します。これは、クラスの特定のインスタンスを記述する場合にのみ必須となります。
下部セクション
クラスの操作(メソッド)が含まれます。リスト形式で表示され、各操作がそれぞれの行を占めます。操作は、クラスがデータとどのように相互作用するかを記述します。下部2つのセクションのテキストは、通常、左揃えで配置され、最初の文字は小文字で入力されます。
メンバーのアクセス修飾子
すべてのクラスは、アクセス修飾子(可視性)に応じて異なるアクセスレベルを持ちます。対応する記号を伴うアクセスレベルは以下の通りです:
- 公開(+)
- 非公開(-)
- 保護(#)
- パッケージ(~)
- 派生(/)
- 静的(下線)
メンバーのスコープ
メンバーのスコープには、分類子とインスタンスの2つがあります。
分類子は静的(static)として認識されることが多く、属性値はすべてのインスタンスで同じままであり、メソッドの呼び出しはインスタンスの状態に影響を与えません。対照的に、インスタンスにはインスタンスの状態を変更できるメソッドが含まれており、属性値はインスタンスごとに異なる場合があります。分類子を示すするには、その名前に下線を引きます。インスタンスを示すには、テキストをそのままにします。
相互作用
「相互作用」という用語は、クラス図やオブジェクト図に存在し得るさまざまな関係やリンクを指します。最も一般的な相互作用には、以下のようなものがあります:
継承:子クラスまたはサブクラスが親クラスまたはスーパークラスの機能を引き継ぐプロセスであり、汎化とも呼ばれます。スーパークラスを指す、閉じた矢印を持つ直線の連結線でシンボル化されます。

この例では、オブジェクト「Car」は、自身のクラスの特定の属性(モデルタイプ、ドアの数、自動車メーカー)やメソッド(Radio()、windshieldWiper()、ac/heat())に加えて、親クラス(「Vehicle」)のすべての属性(速度、乗客数、燃料)とメソッド(go()、stop()、changeDirection())を継承します。クラス図における継承は、閉じた白抜きの矢印を持つ実線を使用して示されます。
双方向関連:2つのクラス間のデフォルトの関係。両方のクラスが互いと、相手との関係を認識しています。この関連は、2つのクラス間の直線によって表されます。

上の例では、CarクラスとRoadTripクラスが相互に関連しています。線の片方の端では、Carが多重度「0..1」の「assignedCar」という関連を持つため、RoadTripのインスタンスが存在する場合、それに関連付けられたCarのインスタンスが1つ存在するか、または全く存在しないかのいずれかになります。この場合、RoadTripに複数のCarインスタンスを関連付けられることを示すために、多重度「0..*」を持つ別のCaravanクラスが必要になります。1つのCarインスタンスは複数の「getRoadTrip」関連を持つことができる(つまり、1台の車で複数のロードトリップに行くことができる)ため、多重度は「0..*」に設定されます。
単方向関連:2つのクラス間のやや一般的ではない関係。一方のクラスがもう一方のクラスを認識し、それと相互作用します。単方向関連は、認識しているクラスから認識されているクラスを指す、開いた矢印を持つ直線の連結線でモデリングされます。

例として、アリゾナ州をロードトリップしているときに自動速度取締機(オービス)に遭遇し、運転状況が記録されることがありますが、郵便で通知を受け取るまでそのことを知ることはありません。画像には描かれていませんが、この場合、多重度はオービスを通過する回数に応じて「0..*」になります。