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

Javaのpublicとprivateの違いについて解説する。


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

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

他のクラスからアクセスしていいかどうかの許可の指定ができる。


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

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

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


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

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

の四種類がある。

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


privateの使い方

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

privateを使う場合は、変数、メソッドに指定することができるが、クラスには指定はできない。

//クラスで指定はできない
private class Sample

// 変数はOK
private String name; 

//メソッドもOK
 private void method()

下記に例として、変数にprivateを使って別クラスで呼び出す。

呼び出す時は、publicであるmountainMethodのメソッド経由で呼び出している。

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



mountainName has private access in Mountain System.out.println

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

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


比較

privateの変数を呼び出すには、publicで定義されたメソッドで呼び出す。エラーが出るのはprivateで設定した変数をそのまま別クラスで呼び出そうとする場合。



publicの使い方

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

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



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

アクセス修飾子に関しての関連記事


下記に、アクセス修飾子に関しての関連記事をまとめた。


全体像を把握する

下記にJavaやwebアプリケーションについての記事をまとめた。


[st-card myclass=”” id=3431 label=”” pc_height=”” name=”” bgcolor=”” color=”” fontawesome=”” readmore=”on”]


コンピューターについての全体像も把握しておくと、プログラミングのさらなる理解に役立つ。


[st-card myclass=”” id=4587 label=”” pc_height=”” name=”” bgcolor=”” color=”” fontawesome=”” readmore=”on”]



今回使ったコード

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);
    }
 
}