「Java言語」の「カプセル化」の仕組み
今回は「カプセル化」について学んでいきたいと思います。
「クラスのフィールド」を勝手に変更されないようにするための仕組みですが、以前にも学んで完全に忘れてしまったので、また学びなおしていきたいと思います。
2年も経つと覚えたこともほとんど忘れていますね・・・
「カプセル化」の仕組み
「箱(Box)」のクラスを作って、「カプセル化」について学んでいきたいと思います。
「Box」クラスは、
public class Box { public int money = 100000; }
のように作りました。
「money」フィールドに「100,000円」入っているという想定です。
「Box」クラスの「インスタンス」を作ると、「money」フィールドの値を自由に書き換えることができます。
例えば、
Box box = new Box(); box.money = -1000;
のように、「マイナス」の値も変数に入れることができてしまいます。
そこで、「マイナスの値」などの入ってはいけない値を入れないようにするために「メソッド」のみから値を入れられるようにします。
先ほど、「Box」クラスに作成した「money」フィールドを
private int money = 100000;
のようにアクセスタイプを「public」から「private」に変更します。
このように変更することで、「クラス内のメソッド」からしか「money」フィールドにアクセスができないようになります。
もしこの状態で、先ほどのように「クラス外」からアクセスしようとすると、
Exception in thread "main" java.lang.Error: Unresolved compilation problem: フィールド Box.money は不可視です
のようなエラーが発生し、「クラス外」からは、「フィールドの値」を読み取ることも変更することもできなくなります。
セッター
「フィールド」に「値」を設定するメソッドのことを「セッター」と言います。
「セッター」を学び始めたあたりから別のプログラミング言語で学んだことを少しずつ思い出してきました。
「セッター」の中に「値をチェックする処理」を作ることで、「マイナスの値」を「フィールド」に入れないようにすることができます。
例えば、
public void setMoney(int money) { if( money >= 0) { this.money = money; } }
このように「if文」で「引数の値」が「0以上」かどうかをチェックし、「0以上」の場合のみ「フィールド」に値を設定すれば、「フィールド」には「マイナスの値」は入らないようになります。
「セッター」が「カプセルの外殻」のような働きをして、「カプセルの中身(「フィールドの値」)」を守るという仕組みです。
ゲッター
「フィールドの値」は、「private」で作っているので、このままでは「フィールドの値」を読み出すことができません。
そこで、「ゲッター」よ呼ばれる「読み出し専用のメソッド」を作ります。
public int getMoney() { return this.money; }
このメソッドを実行するプログラムは、
System.out.println(box.getMoney());
のようになります。
「カプセル化」が無いと、「フィールドの値」を他のクラスから自由に書き換えられてしまうのは困るので、なぜ「カプセル化」が必要なのかが理解できた気がします。
といっても、まだ自分でもプログラムが書けるほど理解ができていないので、継続して勉強していきたいと思います。