【Java入門】4つのアクセス修飾子を使い分ける方法

プログラミングの基礎を解説Java入門
スポンサーリンク

こんにちは!しーま(@s59shima)です。

いつもブログをご覧いただきありがとうございます。

今回はこんな悩みや疑問を持った人に向けて記事を書きました。

アクセス修飾子を使い分ける必要はあるの!?全てpublicで宣言して問題ないかな!?

アクセス修飾子を適切な権限で宣言する理由が分からない方や4つのアクセス修飾子の使い分けがイマイチ分からない方にはおすすめの記事です。

IT系フリーランス専門エージェントサービス第1位のMidWorksは業界トップクラスの低マージンで多くのエンジニアから選ばれています!!

アクセス修飾子を使い分ける理由は1つ

アクセス修飾子を使い分ける理由はたった1つです。それは、オブジェクトのカプセル化を実現することです。

オブジェクトのカプセル化のメリットは以下の3つが考えられます。

  1. 外部からの不正な操作を防ぐことができる
  2. 影響範囲の極小化
  3. 想定した使用方法以外での利用をさせない

アクセス修飾子の一覧(4つ)

アクセス修飾子は「public」「protected」「なし」「private」の4種類です。

この4種類がどのようなアクセス範囲になっているのか一覧で確認してみましょう!

Noアクセス修飾子同一クラス同一パッケージサブクラス全て
public
protected×
なし××
private×××

つまり、No列の数字が大きいほど、アクセス範囲が狭いことがわかりますね。逆に No列の数字が小さいほど、アクセス範囲が広いということです。

アクセス修飾子の順番を確認

4種類のアクセス修飾子が実際に上記の図のようになるのか確認してみましょう。

このようなファイル構成で、アクセス修飾子を確認していきます。

Javaのアクセス修飾子を確認

確認パターン1.同一クラスの場合

Javaのアクセス修飾子を確認_パターン1

上記の図だと、同一クラスでの確認ですね。

publicからprivateの4種類すべてがアクセスできるか確認です。

Mainクラスの中身はこちら。

public class Main {
  // 4種類のアクセス修飾子を用意
  public String msg_public = "public";
  protected String msg_protected = "protected";
  String msg_Default = "default";
  private String msg_private = "private";

  public static void main(String[] args) {
    Main main = new Main();
    // アクセス可能か確認
    System.out.println( main.msg_public );
    System.out.println( main.msg_protected );
    System.out.println( main.msg_Default );
    System.out.println( main.msg_private );
  }
}

実行結果

public
protected
default
private

同一クラスの場合、4種類全てのアクセス修飾子にアクセスできることを確認できました。

確認パターン2.同一パッケージの場合

Javaのアクセス修飾子を確認

上記の図だと、同一パッケージでの確認ですね。

TestAクラスの中身を確認・実行してみましょう!

public class TestA {
  public static void main(String[] args) {
    Main main = new Main();
    System.out.println( main.msg_public );
    System.out.println( main.msg_protected );
    System.out.println( main.msg_Default );
    //System.out.println( main.msg_private );
  }
}

MainクラスとTestAクラスは同一パッケージです。private変数は構文エラーになるため、コメントにしています。

実行結果

public
protected
default

確認パターン3.サブクラスの場合

Javaのアクセス修飾子を確認

上記の図だと、サブクラスでの確認ですね。

TestB2クラスの中身を確認・実行してみましょう!

package sampleB;

import sampleA.Main;

public class TestB2 extends Main {
  public static void main(String[] args) {
    TestB2 b2 = new TestB2();
    System.out.println( b2.msg_public );
    System.out.println( b2.msg_protected );
    // System.out.println( b2.msg_Default );
    // System.out.println( main.msg_private );
  }
}

デフォルト変数とprivate変数は構文エラーになるため、コメントにしています。

実行結果

public
protected

確認パターン4.全ての場合

Javaのアクセス修飾子を確認

上記の図だと、全てでの確認ですね。

TestBクラスの中身を確認・実行してみましょう!

package sampleB;

import sampleA.Main;

public class TestB {
  public static void main(String[] args) {
    Main main = new Main();
    System.out.println( main.msg_public );
    // System.out.println( main.msg_protected );
    // System.out.println( main.msg_Default );
    // System.out.println( main.msg_private );
  }
}

protected変数・デフォルト変数・private変数は構文エラーになるため、コメントにしています。

実行結果

public

アクセス修飾子とstaticを両方宣言する場合

クラス、メソッド、フィールドで複数の修飾子を列挙する場合、以下のように書きます。

アクセス修飾子(publilc・protected・private) + static

アクセス修飾子は最も左側に書いて、staticなどの修飾子はその後に書きます。

まとめ

今回は、アクセス修飾子を使い分ける必要はあるのか? という疑問や使い分ける方法について回答してきました。

本記事をまとめると以下の通りです。

  • アクセス修飾子を使い分ける事で、オブジェクトのカプセル化を実現
  • アクセス修飾子の使い分ける基準は、同一クラス・同一パッケージ・サブクラス
  • 複数の修飾子を列挙する場合、アクセス修飾子 + staticなど とする

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました