こんにちは、Javaと聞いて最初「ジャワカレー」を連想した、おたんこなすウルフです。
Javaの学習中に出てくるアクセス制御
「ふ~ん、アクセス制御ってこんな感じなんだ~」
という程度の理解だったけど
学習をすすめるにつれ、コイツがコンパイルエラーに関わるけっこう重要なモノだということに気づきました。
今までのエラーの原因の7割くらいがアクセス制御が原因だったので、、、

しかも、アクセス制御って4種類もあって、役割も千差万別。ややこしいんだよな!
重要なんだけど、Java初学者に(多分)軽視されがちなアクセス制御
コイツについて理解しようと努力をしてみる。
今日はそんな記事内容です!
Javaのアクセス制御を理解する努力の序章


アクセス制御とは?
アクセス制御とは、見える範囲を制限するための仕組みです。
場所によってアクセスができるできないを、分けるために使うモノですね。
変数、メソッド、クラスなどへのアクセスを制限します。



なんだかよくわからない人は「ファイルの行き来を制限するモノ!」というように理解しておけばいいぞ!。
実際にアクセス制御するためには、のちに紹介するアクセス修飾子たるものを使います。
アクセス制御を適当にやって、エラーに悩みました
アクセス制御と聞いてアレルギー反応が出る人は
「もういいや、あとで理解しよう」
というようになると思うんですけど、私はこういった考えで適当にやって
コンパイルエラーに悩みました、、、
勉強しているテキストの12章あたりからかな?コンパイルエラーが頻発しました。
なかなか、解決できずに奮闘した結果、アクセス修飾子を変更することで、解決。
当時は意味を全く理解できないまま解決してしまいました。
その後も同じようなエラーにつまづくという悪循環。
この時思いましたね「アクセス制御をしっかり理解しよう」…と
制御するには、アクセス修飾子を使う!
制御するにはアクセス修飾子というものを使用し、記述する時は
- アクセス修飾子 クラス名 {}
- アクセス修飾子 型名 フィールド名;
- アクセス修飾子 型名 メソッド名(引数, …) {}
以上のように指定してあげます。
アクセス修飾子に入る種類としては計4種類
- private
- デフォルト(記載なし)
- protected
- public
それぞれ役割も制御できる範囲も違います。
次からは、私が頭を抱えてまとめたアクセス修飾子について、極力簡単に紹介していきます!
Java|アクセス修飾子の種類と役割


private


最も範囲の狭いアクセス修飾子
同じclass内でのみ参照できる修飾子となっております。



家の中から決して出ることのない引きこもりタイプ、それがprivateなんだ!
※classには指定できません。
デフォルト(記述なし)


2番目に範囲の狭いアクセス修飾子
同じクラス名、同じ名前空間でのみ参照できます。



名前空間という地域から出ることのない、地元大好きなマイルドヤンキーがデフォルトなんだ!
名前空間は同じ名前のクラスを分けるようにしています。
同じ名前のクラスを分けるのにパッケージというものを使用し、クラスファイルをまとめています。
パッケージを使用すると。


上の写真のようにパッケージごとにクラスファイルを管理することができます。
最近ウマ娘にハマっているので、ウマ娘で例えさせて頂きますと
- メジロマックイーン
- メジロドーベル
- メジロライアン
同じメジロの名のもとに生まれていますが、名前が違いますよね。
これらをパッケージごとに分けてあげると


こんな感じになります。



ややこしかったら、とりあえず「パッケージ=フォルダ」というように理解しておけばいいぞ!
protected


デフォルトアクセス修飾子に加えて、継承したサブクラスのメソッドからも参照できます。
サブクラスに関しては名前空間が異なっていても参照できます。



地方から東京に引っ越してきて、方言は残りつつも東京に染まってしまった人がprotectedなんだ!
※classには指定できません。
public


最も広いアクセス修飾子
どのような場所からでも参照可能な万能タイプです。
たいていのテキストで記載されていることでしょう。



世界中どこにでもいける、フットワークの軽いワールドワイド、それがpublicです。
※ただし、名前空間が違う場合は参照元のclassにもpublicを指定する必要あり。
Java|アクセス制御を覚えるため体験してみる


プログラミングを理解するコツは
コードを書いて実行してみること!
てなわけで、実際にアクセス制御を体験してみましょう!



先ほどの解説も頭に入れながら、実行してくれよな!
- コピペして実行してみる。
- うまくコンパイルできなければ、解決方法検索してみる。
Javaの動作環境が構築できていない人はこちら!


アクセス修飾子①:private
class Private {
private int field = 0;
private void method() {
System.out.println("メソッドを呼び出すよ!");
}
void test() {
System.out.println(this.field);
this.method();
}
/* コンパイル確認用 */
public static void main(String[] args) {
Private a = new Private();
a.test();
}
}
アクセス修飾子②:デフォルト(記載なし)
class DefaultA {
int field = 0;
void method() {
System.out.println("メソッドを呼び出すよ!");
}
}
class DefaultB {
void test() {
DefaultA a = new DefaultA();
System.out.println(a.field);
a.method();
}
/* コンパイル確認用 */
public static void main(String[] args) {
DefaultB b = new DefaultB();
b.test();
}
}
アクセス修飾子③:protected
- パッケージ
- ファイル①
- ファイル②
public class ProtectedA {
protected int field = 0;
protected void method() {
System.out.println("メソッドを呼び出すよ!");
}
}
class ProtectedB extends ProtectedA {
void test() {
System.out.println(this.field);
this.method();
}
/* コンパイル確認用 */
public static void main(String[] args) {
ProtectedB a = new ProtectedB();
a.test();
}
}
アクセス修飾子④:public
- パッケージ
- ファイル①
- パッケージ
- ファイル②
public class PublicA {
public int field_public = 0;
public void method_public() {
System.out.println("publicのメソッドだよ!!");
}
}
class PublicB {
void test() {
PublicA a = new PublicA();
System.out.println(a.field_public);
a.method_public();
}
/* コンパイル確認用 */
public static void main(String[] args) {
PublicB b = new PublicB();
b.test();
}
}
まとめ
アクセス制御と聞いて最初は蕁麻疹(じんましん)が出そうなくらい覚えるのがおっくうだったんですけど
こうして、記事にまとめてみると案外理解しやすいものですね。
やはり、理解への近道は自分なりにわかりやすくまとめることなのか、、、
今回の記事が少しでも参考になったのであれば幸いです。
それでは、良きJavaライフを!