Java のカプセル化
1. カプセル化(Encapsulation)
カプセル化(Encapsulation)の目的は、ユーザーから「機密性の高い」データを確実に隠すことにあります。これを実現するには、以下の手順を踏む必要があります:
- クラスの変数(アトリビュート)を
privateとして宣言する private変数の値を参照・更新するための、publicなgetおよびsetメソッドを提供する
2. Get と Set(Getter/Setter)
前章で学んだ通り、private 変数は同じクラス内からしかアクセスできません(外部のクラスからはアクセス不可)。しかし、public な get および set メソッドを提供することで、それらにアクセスすることが可能になります。
- get メソッドは、変数の値を返します。
- set メソッドは、変数に値を設定します。
これらの構文のルールとして、メソッド名は get または set で始め、その後に変数名を続け、変数名の先頭の文字を大文字にします。
例:
public class Person {
private String name; // private = アクセス制限あり
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String newName) {
this.name = newName;
}
}2.1 例の解説
get メソッドは、変数 name の値を返します。set メソッドは、パラメータ(引数)として newName を受け取り、それを変数 name に代入します。ここで this キーワードを使用して、現在のオブジェクトを参照しています。
しかし、変数 name は private として宣言されているため、このクラスの外側から直接アクセスすることはできません。
エラーになる例:
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.name = "John"; // エラー
System.out.println(myObj.name); // エラー
}
}もし変数が public として宣言されていれば、出力は「John」となるはずです。しかし、private 変数にアクセスしようとしているため、以下のようなエラーが発生します:
MyClass.java:4: error: name has private access in Person
myObj.name = "John";
^
MyClass.java:5: error: name has private access in Person
System.out.println(myObj.name);
^
2 errors代わりに、getName() と setName() メソッドを使用して、変数へのアクセスと更新を行います。
正しい例:
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.setName("John"); // name変数の値を "John" に設定
System.out.println(myObj.getName());
}
}
// 出力: "John"3. なぜカプセル化が必要なのか?
- クラス属性とメソッドの制御が向上する: 開発者が意図した通りにデータの入出力を管理できます。
- 読み取り専用、または書き込み専用にできる:
getメソッドのみ(読み取り専用)や、setメソッドのみ(書き込み専用)を提供することで、変数の役割を制限できます。 - 柔軟性(フレキシビリティ): プログラマーは、コードの他の部分に影響を与えることなく、コードの一部(内部実装)を変更できます。
- データのセキュリティ向上: 外部から不正に値を書き換えられるリスクを低減します。