27.
カプセル化
カプセル化とは
プロパティの隠蔽化
カプセル化はオブジェクト指向プログラミングの3大要素の1つで、クラスのメンバ変数を外部から直接参照させない(隠蔽化)する仕組みです。
アクセサメソッド
カプセル化はメンバ変数(プロパティ)をもとに getter / setterメソッドで定義するアクセッサメソッドを利用します。
- setter:「set + プロパティ名」で値を設定
- getter:「get + プロパティ名」で値を取得
getter/setter メソッドの例
フィールド「email」の getter / setterメソッドを定義した例です。
// フィールド
private String email;
//setter
public void setEmail(String email) {
this.email = email;
}
//getter
public int getEmail() {
return this.email;
}
アクセサメソッドの作成
Eclipseでは、メンバ変数(プロパティ)からアクセッサメソッドを自動生成できます。
ファイル構成
sns/
├── App.java
└── entity
└── UserBean.java
プロパティ定義
「UserBean」にprivateプロパティを定義します。
UserBean.java
package sns.entity;
public class UserBean {
private String email;
private String name;
private String password;
}
getter/setterの追加
「UserBean」を右クリックして、「ソース > getter および setterの生成...」を選択します。
【すべて選択】ボタンで getter / setterのプロパティをすべてチェックし、【生成】ボタンをクリックします。
getter / setterが生成されました。
UserBean.java
package sns.entity;
public class UserBean {
private String email;
private String name;
private String password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
setterの利用
プロパティに直接設定
privateのメンバー変数に、値を設定します。
App.java
package sns;
import sns.entity.UserBean;
public class App {
public static void main(String[] args) {
UserBean user = new UserBean();
user.name = "東京 太郎";
user.email = "[email protected]";
user.password = "pass12345";
}
}
コンパイルエラー
コンパイルエラーになりました。

setterの利用
エラー部分をコメントアウトして、setterでデータを設定してみましょう。
App.java
public static void main(String[] args) {
UserBean user = new UserBean();
// user.name = "東京 太郎";
// user.email = "[email protected]";
// user.password = "pass12345";
user.setName("東京 太郎");
user.setEmail("[email protected]");
user.setPassword("pass12345");
}
getter
プロパティを直接取得
privateプロパティに直接アクセスします。
public static void main(String[] args) {
...
System.out.println(user.name);
System.out.println(user.email);
System.out.println(user.password);
}
コンパイルエラー
コンパイルエラーになりました。

getterの利用
プロパティに直接設定
privateのメンバー変数に、値を設定します。
App.java
public static void main(String[] args) {
....
System.out.println(user.getName());
System.out.println(user.getEmail());
System.out.println(user.getPassword());
}
結果
getterでデータが取得できました。
東京 太郎
[email protected]
pass12345
演習
問題1
「private int price;」の「setter」メソッドの定義で正しいのはどれですか?
1)public void setPrice() { this.price = price; }
2)public void setPrice(int price) { this.price = price; }
3)public int setPrice() { return this.price; }
4)public int setPrice(int price) { return this.price; }
問題2
「private int price;」のデータ取得で正しいのはどれですか?
1)public void getPrice() { this.price = price; }
2)public void getPrice(int price) { this.price = price; }
3)public int getPrice() { return this.price; }
4)public int getPrice(int price) { return this.price; }
問題3
「private int price;」の「setter」によるデータ設定で正しいのはどれですか?
1)item.getPrice();
2)item.setPrice();
3)item.getPrice(300);
4)item.setPrice(300);
問題4
「private int price;」の「getter」によるデータ取得で正しいのはどれですか?
1)item.getPrice();
2)item.setPrice();
3)item.getPrice(300);
4)item.setPrice(300);
問題5
「Character」クラスで、setter/getterを実装し、コンパイルエラーが発生した箇所を修正してみましょう。