カプセル化
情報隠蔽をすることによって、「このオブジェクトの中身がいったいどういうことをやっているのかは知らないが、頼んだことは実行してくれる」ということを実現できます。
これを「カプセル化」といいます。
従来の手続き型言語などとの最大の違いは、このカプセル化ができることです。
オブジェクトは「機能」と「データ」をカプセル化した独立した部品で、メッセージを送りあうことによって相互に動作します。
クラスのフィールドは、基本的にはprivateにします。
そのため、クラス外から利用したいときにはアクセスするためのメソッドが必要です。
ポイント!カプセル化を実現するには
一般的には、1つのフィールドに対して2つのメソッドを用意します。
- ゲッター(getter)メソッド 値を参照するためのメソッド
- セッター(setter)メソッド 値を変更するためのメソッド
【カプセル化されたクラスを使う】
public class MyScore{ private int MotherLanguage_Score; //国語のテストの点数 private int English_Score; //英語のテストの点数 private int Mathematics_Score; //数学のテストの点数 public void setMotherLanguage_Score(int mother_s){ MotherLanguage_Score = mother_s; } public void setEnglish_Score(int en_s){ English_Score = en_s; } public void setMathematics_Score(int math_s){ Mathematics_Score = math_s; } public int getMotherLanguage_Score(){ return MotherLanguage_Score; } public int getEnglish_Score(){ return English_Score; } public int getMathematics_Score(){ return Mathematics_Score; } }
public class UseMyScore { public static void main(String[] args) { int MotherLanguage_Score; int English_Score; int Mathematics_Score; MyScore tanaka = new MyScore(); tanaka.setMotherLanguage_Score(80); System.out.println("田中さんの国語の成績を登録しました"); MotherLanguage_Score = tanaka.getMotherLanguage_Score(); System.out.println("田中さんの国語の成績は" + MotherLanguage_Score + "点です" ); System.out.println(); tanaka.setEnglish_Score(100); System.out.println("田中さんの英語の成績を登録しました"); English_Score = tanaka.getEnglish_Score(); System.out.println("田中さんの英語の成績は" + English_Score + "点です" ); System.out.println(); tanaka.setMathematics_Score(60); System.out.println("田中さんの数学の成績を登録しました"); Mathematics_Score = tanaka.getMathematics_Score(); System.out.println("田中さんの数学の成績は" + Mathematics_Score + "点です" ); } }
実行結果
田中さんの国語の成績を登録しました 田中さんの国語の成績は80点です 田中さんの英語の成績を登録しました 田中さんの英語の成績は100点です 田中さんの数学の成績を登録しました 田中さんの数学の成績は60点です
クラスMyScoreのsetMotherLanguage_Score()、setEnglish_Score()、setMathematics_Score()がセッターメソッドです。
getMotherLanguage_Score()、getEnglish_Score()、getMathematics_Score()がゲッターメソッドです。
フィールドが1つの場合はセッターメソッドとゲッターメソッドが1つずつ、2つの場合は2つずつ・・・と、メソッドをたくさん書く必要があり、ちょっと大変な印象があります。
しかしこれが一般的なパターンです。
abcという名前のフィールドがあったときにはゲッターをgetAbc、セッターをsetAbcという名前にする、というのも標準になっています。
ただし、このフィールドをクラス外で利用することがないと判断される場合は、これらのメソッドを実装する必要はありません。
まとめ
カプセル化
- それぞれのフィールドに対してゲッターとセッターを実装します。
独学で挫折しそうになったら、オンラインプログラミングスクール