Java Technology

[Java] アクセス修飾子のpublicとprivateの違い

2020-12-27

アクセス修飾子のpublicとprivateでこんがらがってきたので整理。


そもそもアクセス修飾子とは?

変数やメソッドに対してのアクセスをコントロールするもの。


なぜアクセスをコントロールする必要があるのか?

アクセスのコントロールによって、使える変数の範囲(変数のスコープ)が決まる。

変数のスコープを設定することで、なるべく関係のない情報は参照できないようにすることで、プログラムを整理するのがメリット。


ちなみにアクセス修飾子の種類には何がある?

  • public
  • private
  • protected
  • 指定なし(デフォルト)

の四種類がある。

今回はpublicとprivateに特化して整理する。


privateの使い方

privateを使用した場合、自クラス内のみからのみ、アクセスが可能となる。

下は実際にprivate変数を使って呼び出しをする例。


呼び出す時は、mountainMethod経由で呼び出している。

ではこれを変数経由で呼び出そうとするとどうなるか。



エラーの通り、変数mountainNameはprivateに設定してるから、アクセスできないよ!というエラーが起きる。

これを解決するには、これから述べる通り、アクセス修飾子をpublicにして外部からもアクセスできるようにするか、先程の例の通り、メソッド経由で呼び出す。

下記は比較。



publicの使い方

publicでは、privateのように制限がかかっていないため、外部からでも変数で呼び出せる。

先程の例では、変数で呼び出すとエラーになったが、今度は、Mountainクラスの変数をprivateからpublicに変えて実行してみる。



publicでは、外部からのアクセスもできるので、そのまま、変数で呼び出せる。



今回使ったコード

private変数をメソッド経由で呼び出す。

class Mountain {
    
    //フィールド変数
    private String mountainName = "金峰山";
    
    //private変数を外部で呼び出すためのメソッドを定義
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
        
        //private変数をメソッド経由で呼び出す。
        mountain1.mountainMethod();
    }
 
}


private変数を外から呼び出すとエラー

class Mountain {
    
    //フィールド変数
    private String mountainName = "金峰山";
    
    //メソッドを定義
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
        
        //private変数を外部で呼び出ししようとするとエラー
        System.out.println(mountain1.mountainName);
    }
 
}


publicの 変数は外部から呼び出せる

class Mountain {
    
    //フィールド変数をpublicに変更
    public String mountainName = "金峰山";
    
    public void mountainMethod() {
        System.out.println(mountainName + "に行きたい。");
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        //インスタンス生成
        Mountain mountain1 = new Mountain();
        
        //public変数を他のクラスから呼び出し
        System.out.println(mountain1.mountainName);
    }
 
}

-Java, Technology