Javaなどのオブジェクト指向言語ではクラスという表現が利用されますが、クラス間の関係性を理解するためにはクラス図が用いられることも少なくありません。
本記事では、Javaプログラミング学習者向けにクラス図やUMLとは何なのかといった基本的な内容から、実際にどのように記述されるのかまでご紹介していきます。
クラス図とは
クラス図は、クラス間の関連性や継承関係などシステムを構成するための構造を表記したダイアグラムのことを指します。
クラス図とUML
クラス図を説明する上で、まずUML(Unified Modeling Language)の存在を理解する必要があります。
UMLは主にオブジェクト指向でシステムを設計する際、ソフトウェアの機能や構造を表現するための記述法を意味します。
本記事内でご紹介する「クラス図」を含む、いくつかのダイアグラムによって構成されます。
UMLで記載されるダイアグラム一例
ではUMLでどのようなダイアグラムが記載されるのかというと下記の一覧が例として挙げられます。
- クラス図: クラス間の関係性を表現
- パッケージ図: パッケージ間の関係性を表現
- シーケンス図: オブジェクト間の処理の流れを表現
- アクティビティ図: システムの制御処理の流れ
- ユースケース図: システムの機能と利用者の関係を表現
- コンポーネント図: システムを構成するモジュールやコードの構造を表現
クラス図の書き方
クラス図は大きく3つ区画に分けられる方法が一般的で「クラス名」「属性(プロパティ)」「操作(メソッド)」に分かれます。
クラス図のサンプル
上記画像がクラス図のサンプルです。
太線で3つの区画に分かれていることをご確認頂けるかと思います。
クラス名
クラス図において必ず記入しなくてはいけないのが、クラス名です。
サンプルの画像では「クラス1」や「クラス2」の部分がクラス名に該当します。
ただクラス名だけを記述しているクラス図ではそのクラスが何の機能を持っているのか分からないため、「属性」または「操作」どちらかまたは両方がセットで記入されるのが一般的です。
属性(プロパティ)
属性項目には、クラスが保持するプロパティ名やデータ型などを記述します。
サンプル画像に記載されている「+」「-」などはアクセス修飾子を意味しています。
操作(メソッド)
操作項目には、メソッド名と戻り値のデータ型を記述します。
属性と同じくアクセス修飾子がセットで記述されるのが一般的です。
アクセス修飾子
クラス図の項目や属性で記述されていたアクセス修飾子を表現する記号について一覧で確認しておきましょう。
- +: public(他のクラスから参照可能)
- -: private(自クラスからのみ参照可能)
- #: protected(自クラスとサブクラスからのみ参照可能)
多重度
クラス間の関連が何対何であるのかを記述するのが多重度の役割です。
サンプルの画像で「n..m」などを記述している部分が該当します。
実際のクラス図では「1..10」や「0, 1」などの表記が用いられます。
- n..m: n以上m以下
- n..*: n以上
- n, m: nまたはm
Javaのサンプルコードでクラス図を確認しよう
では実際にサンプルコードとクラス図を具体例で確認していきましょう。
クラス名のクラス図とサンプルコード
まずはクラス名を「User」と決めて、クラス図とサンプルコードを作成していきます。
クラス図
クラス図は、クラス名を決めた段階では画像のようにシンプルな1つの箱が表示されるだけです。
サンプルコード
サンプルコードは下記のように記述出来ます。
public class User { }
現時点では、クラス名が「User」の大枠が作成されただけで中身が記述されていない状態です。
属性のクラス図とサンプルコード
次に作成した「User」クラスに対して、属性を追加したクラス図とサンプルコードを確認してみましょう。
クラス図
「name」と「age」の属性をクラス図に追加しました。
ここから読み取れるのは、「アクセス修飾子がpublicのString型でnameという属性が定義される」こと、「アクセス修飾子がprivateのint型でageという属性が定義される」ことが分かります。
サンプルのため属性毎にpublicとprivateを設定しており違和感がありますが、カプセル化の概念から基本的に属性はprivateで定義されます。
サンプルコード
次にクラス図をサンプルコードに落とし込むと下記のようなコードになります。
public class User { public String name; private int age; }
「アクセス修飾子」「データ型」「プロパティ名」をクラス図の通り定義しており、これでクラスが値を保持する箱が完成したことになります。
操作のクラス図とサンプルコード
次は操作(メソッド)を加えたクラス図とサンプルコードを確認していきましょう。
これで1つのクラスとしては完成することになります。
クラス図
age属性のセッター・ゲッターとして「setAge」「getAge」加えて「reply」というメソッドを追加しました。
setAgeメソッドでは戻り値はなく、getAgeメソッドではint型、replyメソッドではString型の値が返却されることが分かります。
サンプルコード
上記のクラス図を同じようにサンプルコードとして落とし込んでみましょう。
public class User { public String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String reply() { return "こんにちは" + name + "です。"; } }
これでUserクラスの機能が揃いました。
他クラスのクラス図とサンプルコード
Javaのようなシステム開発では複数のクラスが関連してシステムを構築していくため、それぞれのクラスの関係性を示して上げる必要があります。
クラス図
Shopクラスが追加され、ユーザー名と顧客名で関係性を示しています。
サンプルコード
実際にShopクラスのサンプルコードも確認しておきましょう。
public class Shop { private String name; private String customer; public void enter() { // 処理内容 } public void out() { // 処理内容 } }
一見するとShopクラスのcustomer属性とUserクラスのname属性が関連していることが分かりにくいですが、クラス図を用いることにより、関連性が把握しやすくなっています。
さいごに: Javaのシステム設計にはクラス図を活用しよう
本記事では、Javaのシステム設計に用いられるクラス図について、サンプルを用いながらご紹介してきました。
実際の業務でクラス図までしっかりと整備されているプロジェクトというのはそれほど多くないのも事実です。
しかし自分でシステム設計を行う際など、クラス図を記述出来ることで頭の整理もしやすくなるため、ぜひ記述方法を覚えてJavaのプログラム設計に役立ててみてください。
アクセス修飾子に関しては後述します。