アクセス修飾子(public/private)

クラスで定義するフィールドやメソッドには、アクセス可能な範囲を設定することができます。このときに使用するのがアクセス修飾子です。クラス内だけでアクセス可能にするのか、または外部からもアクセス可能にするのかを適切に設定することで、オブジェクトのデータを安全に管理することができます。ここではオブジェクト指向におけるアクセス修飾子について解説します。

アクセス修飾子とは

Java ではクラスの中で定義するフィールドとメソッドに対して「どこからアクセスできるのか」を指定することができます。このような指定を行うためのキーワードをアクセス修飾子と呼びます。

アクセス修飾子を使用することで、クラス内でだけアクセスできるのか、それとも外部からもアクセスできるのかを区別することができます。フィールドやメソッドに適切なアクセス可能な範囲を設定することで、プログラムの安全性や保守性を高めることができます。

Java では主に次のようなアクセス修飾子があります。

public
protected
なし(deafult)
private

ここでは基本となる public と private について解説します。

public

アクセス修飾子として public を指定すると、そのフィールドやメソッドはどこからでもアクセスできるようになります。

class Product {
  public String name;
}

このように public が付いたフィールドは、クラスの外からでも自由にアクセスすることができます。

次の例をみてください。

public class Sample {
  public static void main(String[] args) {
    Product p = new Product();
    p.name = "オレンジ";
  }
}

class Product {
  public String name;
}

main メソッド内で Product クラスのオブジェクトを作成したあと、オブジェクトの name フィールドに直接値を設定しています。このように public が設定されたフィールドは、クラス内だけでなく外部から直接アクセス可能となります。

private

アクセス修飾子として private を指定すると、そのフィールドやメソッドは同じクラスの中からしかアクセスできなくなります。

class Product {
  private int price;
}

この場合、クラスの外から price フィールドに直接アクセスすることはできません。

次の例をみてください。

public class Sample {
  public static void main(String[] args) {
    Product p = new Product();
    p.name = "オレンジ";
  }
}

class Product {
  private String name;
}

main メソッド内で Product クラスのオブジェクトを作成したあと、オブジェクトの name フィールドに直接値を設定しようとしています。ただ name フィールドには private が設定されているため外部から直接アクセスすることはできません。その為、このプログラムはコンパイルの時点でエラーとなります。

このように private を設定することで、クラスのデータを外部から直接変更できないようにすることができます。

protectedとアクセス修飾子を省略した場合

Java のアクセス修飾子には public や private 以外に protected や、アクセス修飾子を省略した場合の設定があります。

public       : どこからでもアクセス可能
protected    : 同じパッケージ、またはサブクラスからアクセス可能
なし(default) : 同じパッケージ内からアクセス可能
private      : 同じクラス内のみアクセス可能

アクセス修飾子とは(1)

protected は同じパッケージ内のクラスからアクセスできるほか、別のパッケージであってもサブクラス(継承したクラス)からアクセスすることができます。アクセス修飾子を何も指定しない場合は、同じパッケージ内にあるクラスからのみアクセスできます。この状態はデフォルトアクセス(またはパッケージプライベート)と呼ばれます。

ただし Java のオブジェクト指向ではカプセル化が基本となります。フィールドは private にしておき、外部に公開する必要のあるメソッドなどだけを public にするのが推奨されます。

メソッドを通してアクセスする

クラスのフィールドを private にした場合、外部からは直接フィールドのデータを取得したり変更したりすることができなくなります。その為、フィールドのデータの取得や変更を行うためのメソッドを用意します。

public class Sample {
  public static void main(String[] args) {
    Product p = new Product();
    p.name = "オレンジ";
  }
}

class Product {
  private String name;

  public void setName(String name) {
    this.name = name;
  }

  public int getName() {
    return name;
  }
}

外部からアクセスする必要のあるメソッドについては、アクセス修飾子の public を設定しています。

-- --

オブジェクト指向におけるアクセス修飾子について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。