Javaではクラスやメソッド・フィールドの前にアクセス修飾子(private・public・protected)を付与することで、データにアクセス出来る範囲を指定します。
本記事では、Java初心者の方向けにアクセス修飾子privateの使い方をクラス・メソッド・フィールドでサンプルコードを掲載しながらご紹介していきます。
目次
private修飾子とその他アクセス修飾子の違い
アクセス修飾子の1つである「private」は、同一クラス内でのみデータにアクセスすることが可能となります。
- 同一クラス: 可
- 同一パッケージ: 不可
- 別パッケージのサブクラス: 不可
- 別パッケージのサブクラス以外:不可
その他アクセス修飾子との違い
privateのアクセス範囲と同様に「public」「protected」「指定なし」の場合のアクセス範囲についても確認しておきましょう。
- public
- 同一クラス: 可
- 同一パッケージ: 可
- 別パッケージのサブクラス: 可
- 別パッケージのサブクラス以外:可
- protected
- 同一クラス: 可
- 同一パッケージ: 可
- 別パッケージのサブクラス: 可
- 別パッケージのサブクラス以外:不可
- 指定なし
- 同一クラス: 可
- 同一パッケージ: 可
- 別パッケージのサブクラス: 不可
- 別パッケージのサブクラス以外:不可
privateクラスの使い方
privateクラスは、他の外部クラスから呼び出されたくないクラスを定義する際に記述します。
内部クラスを定義する場合、1つのファイルにプログラムが増加する傾向にあり、privateクラスが利用される機会はそれほど多いわけではありません。
privateクラスを呼び出すサンプル
「Sample」クラスに定義した「PrivateSample」クラスを呼び出すサンプルコードが下記となります。
package sample; public class Main { public static void main (String args[]) { Main sampleMain = new Main(); PrivateSample ps = sampleMain.new PrivateSample(); ps.execute(); } private class PrivateSample { void execute() { System.out.print("テスト実行"); } } }
実行結果
テスト実行
privateクラスが呼び出せないサンプル
下記のように外部のクラスからprivateクラスを呼び出そうとするとコンパイルエラーとなります。
package sample; public class Main { public static void main (String args[]) { } private class PrivateSample { void execute() { System.out.print("テスト実行"); } } } class Sample { Main.PrivateSample sample; }
「型 Main.PrivateSample は不可視です」のエラーとなりコンパイルが出来ません。
privateメソッドの使い方
privateメソッドはクラス内部でのみ使用したい処理を記述する際に利用します。
privateメソッドを呼び出すサンプル
同一クラス内のmainメソッドから直接privateメソッドを呼び出すパターンと、外部クラスのprivateメソッドをpublicメソッドを経由して呼び出す2つのパターンを実行するサンプルです。
package sample; public class Main { public static void main (String args[]) { privateSample1("内部からの呼び出し\n"); Sample sample = new Sample(); sample.publicSample(); } private static void privateSample1(String str) { System.out.print(str); } } class Sample { public void publicSample() { privateSample2("外部メソッド経由の呼び出し"); } private void privateSample2(String str) { System.out.print(str); } }
実行結果
内部からの呼び出し 外部メソッド経由の呼び出し
「privateSample1」のメソッドに関しては、呼び出し元の「main」メソッドと同一クラス内に存在するため問題なく処理を呼び出すことが出来ます。
外部クラスの「Sample」に記述している「privateSample2」に関しては「publicSample」を経由することで処理を実施しています。
privateメソッドを呼び出せないサンプル
では上記サンプルで「privateSample2」を直接「main」メソッドから呼び出す記述に変更してみましょう。
package sample; public class Main { public static void main (String args[]) { Sample sample = new Sample(); sample.privateSample2("直接呼び出し"); } } class Sample { private void privateSample2(String str) { System.out.print(str); } }
「メソッド privateSample2(String) は型 Sample で不可視です」のエラーとなりコンパイルが出来ません。
privateフィールドの使い方
privateフィールドは、外部から直接フィールド値を変更してもらいたくない場合に利用します。
Javaのシステム開発では、基本的にメンバー変数であるフィールドはprivateに設定し、ゲッター(getter)・セッター(setter)と呼ばれるアクセス用のメソッドを公開する方法が一般的です。
privateフィールドに直接アクセスするサンプル
同一クラス内であれば、直接フィールドの値を書き換えることは可能です。
外部クラスから値を変更したい場合は、セッターメソッドを呼び出し値を変更した上でゲッターメソッドで値を取得するか、別途用意したメソッド内で処理を完結させる方法で実現出来ます。
package sample; public class Main { public static void main (String args[]) { Sample sample = new Sample(); sample.execute(); sample.setText2("\nセッターから値を設定"); System.out.print(sample.getText2()); } } class Sample { private String text1; private String text2; public String getText2() { return text2; } public void setText2(String text2) { this.text2 = text2; } public void execute() { this.text1 = "フィールドに直接値を設定"; System.out.print(this.text1); } }
実行結果
フィールドに直接値を設定 セッターから値を設定
privateフィールドに直接アクセス出来ないサンプル
外部クラスから下記のように直接privateフィールドにアクセスしようとした場合はエラーとなります。
package sample; public class Main { public static void main (String args[]) { Sample sample = new Sample(); sample.text1 = "この方法では値は設定できません。"; } } class Sample { private String text1; }
「フィールド Sample.text1 は不可視です」のエラーとなりコンパイルが出来ません。
さいごに: private修飾子を使いこなしてJavaのアクセス範囲を適切に定義しよう
本記事では、Javaのアクセス修飾子の1つである「private」の使い方についてご紹介していきました。
予期せぬエラーやセキュリティ上の問題を起こさせないためにも、アクセス範囲を最小限に限定することは大切です。
データの修正が簡単だからとpublic修飾子ばかり使うのではなく、今回ご紹介したようなprivateやprotectも利用して、適切なデータ範囲を定義するよう意識しておきましょう。
指定なしというのは「void メソッド名」のように、アクセス修飾子の指定をせず定義することを意味しています。