【Java入門(3)オブジェクト指向:活用編 #2】カプセル化

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は…

Java入門3 オブジェクト指向:活用編 #2
カプセル化

というテーマでお送りします。

彩香
活用編に入って2回目ですね。今回も、頑張ります。
剛留
ガッツリ勉強します。よろしくお願いします。

【1】 カプセル化とは

カプセル化、本来の意味は…

関係の深い属性とその振る舞いを
クラスにまとめること。

をカプセル化といいます。

フィールドを非公開にして…

必要に応じて、公開されたメソッドからのみ
アクセスできるようにします。

これを情報隠蔽といいます。

カプセル化とは
✅ 関係の深い属性とその振る舞いを
  クラスにまとめること。

✅ フィールドを非公開にして
  公開されたメソッドからのみ
  アクセスできるようにする。
 (情報隠蔽)

【2】 アクセサメソッド(イメージ)

次に、アクセサメソッドについて
見ていきましょう。

このアクセサメソッドは

非公開フィールドの値を
設定・取得するメソッド。

のことです。

設定するメソッドを setter といい
取得するメソッドを getter といいます。

アクセサメソッドとは
✅ 非公開フィールドの値を
  設定・取得するメソッド。
 
✅ 設定するメソッドを
  setter という。

✅ 取得するメソッドを
  getter という。

イメージを見ていきましょう。

フィールドは 非公開となっています。
private指定(情報隠蔽)ですね。

そうすると、外部からこのフィールドへは
直接アクセスできません。

ここで、このオブジェクトを
インスタンス化する時に呼び出されるコンストラクタは…

外部から呼び出されて、フィールドの初期化を行えます。

そして、それ以外で、フィールドに値を設定したい
場合には、setter を呼び出すことになります。

属性と操作が、カプセル化されていますね。

また、フィールドの値を取得したい場合には
getter を呼び出します。

すると、この getterがフィールドの値を取得して
戻り値として返すこととなるのです。

属性と操作が カプセル化されています。

この、setter と getter を合わせて
アクセサメソッドといいます。

このイメージで 押さえておきましょう。

また、アクセサメソッドの名称についてですが
一般的に、このように命名します。

getterの場合…

getフィールド名

とします。この時の、フィールド名の先頭を
大文字とします。

そして、setterのについては

setフィールド名

となります。
フィールド名の先頭が、大文字です。

例えば、salesAmt というフィールドがあった場合

getter / setter はそれぞれ…

getSalesAmt / setSalesAmt

となります。

Javaの慣習としての意味合いもありますし…

eclipse 等のツールで自動生成する場合の名称も
この方式になっていること、押さえておきましょう。

アクセサメソッドの名称
✅ getter:getフィールド名
  ※フィールド名の先頭大文字

✅ setter:setフィールド名
  ※フィールド名の先頭大文字

(例)
・フィールド:salesAmt の場合
  getSalesAmt / setSalesAmt

彩香
情報隠蔽って、何だか悪いことを
隠す感じがしてしまいますが…。

大切な情報を隠しておく…という意味なんですね。
理解しました。

剛留
門外不出の秘伝のタレ!
みたいな感じですか…。

アクセサメソッドを 適切に作っておけば
「秘伝のタレ」は守られそうですね…。

【3】 効果

カプセル化の効果について見ていきましょう。

カプセル化の効果(オブジェクト側)
❶不正な操作から保護
❷変更に対する影響範囲の限定

該当のオブジェクトから見ると。
まず、❶不正な操作からの保護 が挙げられます。

例えば人を表すクラスがあって
年齢を表すフィールドがあったとします。

このフィールドは 0以上を設定する必要があります。

この場合に、カプセル化して
アクセスレベルを適切に設定していれば…

setter の中で
チェックを行って不正を知らせる事ができます。

また、❷変更のに対する影響範囲が限られる
という利点もあります。

例えば、フィールド名や型が変更になっても
…利用側の修正は最小限に抑えられます。

殆どの場合、影響の範囲は該当のクラスに
限定できることとなります。

カプセル化の効果(利用する側)
❶公開された操作のみに着目
❷複雑さの隠蔽

また、利用する側の利点として

❶ 公開された操作のみに着目できる
という点が挙げられ、併せて…

❷複雑さが隠蔽されていて
枠組みを限定的に考えやすいという事もいえます。

イメージ的にはこのような感じです。

データ構造が複雑になっていても…

それを情報隠蔽してあれば利用側としては
公開された「操作」に着目してオブジェクトを利用できます。

シンプルに 考えやすいですね。

ここまで、カプセル化の効果を見てきましたが…

正直なところ、この効果については…

プログラムを作り込んでいって
段々と実感できてくる ことと思います。

ですので、最初の段階では…

「そういうものか…。じゃ、やってみよう…。」

という感覚で、進めてみるのが良いかと思います。

彩香
確かに、今のところ何となくですが…分かります。
これに従って、やってみます…。
剛留
そうですね。やってみます!

【4】 注意点

アクセサメソッドの注意点を1点お伝えしておきます。

それは…

公開範囲を適切に設計して
必要に応じてアクセサメソッドを作成する。

ということです。

全てのフィールドに対して
安易にアクセサメソッドを作る事

…は お勧めできません。

非公開、読み取り専用、読み書き可能など…

必要かどうか検討してから
外部に公開することを考えましょう。

アクセサメソッドの注意点
必要に応じて
アクセサメソッドを作成する。

【まとめ】

【1】 カプセル化とは
✅ フィールドを非公開にして
  公開されたメソッドからのみ
  アクセスできるようにする。
  (情報隠蔽)
【2】 アクセサメソッド
✅ 非公開フィールドの値を
  設定・取得するメソッド。
【3】 効果
(オブジェクト側)
❶不正な操作から保護
❷変更に対する影響範囲の限定

(利用する側)
❶公開された操作のみに着目
❷複雑さの隠蔽

【4】 注意点
✅ 必要に応じて
  アクセサメソッドを
  作成する。