Chapter 14

Java カプセル化

おでん
おでん
2021.08.14に更新
このチャプターの目次

カプセル化とは

カプセル化とは、隠ぺいされているメンバを、他クラスからメソッドを通してのみ操作できるようにアクセスを制限する機能のことです。
簡単にいうと、隠してあるデータをあるメソッドからだけ操作できるようにすることです。
一つずつ見ていきます。
まず、隠ぺいされているメンバは、private修飾子で外部クラスからの参照をできないようにしたメンバです。
他クラスから隠ぺいされているメンバを操作するメソッドをアクセサと言います。
アクセサの代表的なものとして以下の2つがあります。

  1. getter(隠ぺいされているメンバを参照する)
  2. setter(隠ぺいされているメンバを更新する)

カプセル化の例

ここで、カプセル化の実例を挙げてみます。
「銀行口座」を考えてみます。
口座名義や口座残高の確認は本人であればできます。
これは参照なのでgetterに当たります。
また、口座名義の変更や口座残高の更新(実際には入出金)も本人であればできます。
これは更新なのでsetterに当たります。

それでは、この実例をソースコードにしてみます。

BankAccount.java
public class BankAccount {
  //口座名義
  private String myname;
  //口座残高
  private int balance;

  // 口座名義を参照
  public String getName() {
	return myname;
  }
  // 口座名義を更新
  public void setName(String sVal) {
	myname = sVal;
  }
  // 残高を参照
  public int getBalance() {
	return balance;
  }
  // 残高を更新
  public void setBalance(int val) {
	balance = val;
  }

  public void showAccount() {
	System.out.println("口座名義:" + myname);
	System.out.println("口座残高:" + balance + "円");
  }
}
BankAccountMain.java
public class BankAccountMain {
  public static void main(String[] args) {
	BankAccount acc = new BankAccount();

	acc.setName("田中太郎");
	acc.setBalance(1000000);
	acc.showAccount();
  }
}
結果
口座名義:田中太郎
口座残高:1000000円

これを見ると、メンバ変数の「myname」「balance」にはprivate修飾子を付与しています。
これによって、口座名義や口座残高が勝手に参照されたり変えられたりしないように、隠ぺいしています。
「getName()」「getBalance()」はgetterとして、これらのメソッドでのみメンバ参照ができます。
「setName()」「setBalance()」はsetterとして、これらのメソッドでのみメンバ更新ができます。

以上からカプセル化は基本的に、メンバ変数にはprivate修飾子を付与し、メソッドにはpublic修飾子を付与します。