Java 速習チュートリアル

Java のカプセル化

1. カプセル化(Encapsulation)

カプセル化(Encapsulation)の目的は、ユーザーから「機密性の高い」データを確実に隠すことにあります。これを実現するには、以下の手順を踏む必要があります:

  • クラスの変数(アトリビュート)を private として宣言する
  • private 変数の値を参照・更新するための、publicget および set メソッドを提供する

2. Get と Set(Getter/Setter)

前章で学んだ通り、private 変数は同じクラス内からしかアクセスできません(外部のクラスからはアクセス不可)。しかし、publicget および 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 キーワードを使用して、現在のオブジェクトを参照しています。

しかし、変数 nameprivate として宣言されているため、このクラスの外側から直接アクセスすることはできません

エラーになる例:

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 メソッドのみ(書き込み専用)を提供することで、変数の役割を制限できます。
  • 柔軟性(フレキシビリティ): プログラマーは、コードの他の部分に影響を与えることなく、コードの一部(内部実装)を変更できます。
  • データのセキュリティ向上: 外部から不正に値を書き換えられるリスクを低減します。