Developer

【はじめてのJava】アクセス修飾子【パッケージとモジュール編】
2021.07.23
Lv1

【はじめてのJava】アクセス修飾子【パッケージとモジュール編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


アクセス修飾子


前回の記事で、パッケージを解説しました。
パッケージを利用することで、クラスを関連するものにまとめて管理することができ、大規模なプログラム等ではクラスを扱いやすくすることができました。
今回は、様々な場所に作成されたクラスへのアクセスの可否を制御することができる構文を解説していきます。

目次


アクセス修飾子

アクセス修飾子とは、クラスやメソッド、メンバ変数(フィールド)に対して、それぞれ別のクラスやパッケージからのアクセスを許可するのか拒否するのかを制御できる構文です。
大きく分けると、以下の4つの修飾子が用意されており、メンバ変数やメソッドの定義を行う際に、その中のどれかを使用して、アクセス制御を行います。
※ローカル変数は、アクセス修飾子の対象外(つけることができない)ので注意してください。

  • public
  • パッケージプライベート(default)
  • protected
  • private

この記事では、「public」「パッケージプライベート(default)」「private」の3つに関して解説していきます。
protected」に関しては、この修飾子の解説のためには「継承」という概念を知る必要がありますので、後の記事で解説します。
それぞれの修飾子ごとにクラス、メソッド、メンバ変数のどれにつけることができるのか、また、つけることでどこからのアクセスが可能になるのかということをしっかりと
覚える必要があります。


public

public修飾子は、「すべてのパッケージやクラス」からアクセス可能な修飾子です。
publicをつけて定義したクラスやメソッド、メンバ変数は、定義したクラスと異なるパッケージに所属したクラスからでも自由にアクセスが可能になります。
アクセス修飾子の中でもっとの公開範囲が広い(制限が緩い)ものになります。
注意点として、public修飾子をクラスやインターフェースにつけて定義する場合、クラス名とファイル名を同じにしなければいけません。
また、1つのファイルにpublicなクラスやインターフェースは1つしか定義することはできません。
[構文]対象のクラスやメソッド、メンバ変数に「public」キーワードをつけて定義します。

//クラスにpublicを付けた例
public class ○○{
	
	//メンバ変数にpublicをつけた例
	public int △△;
	
	//メソッドにpublicを付けた例
	public void □□(){
		
	}
}

publicキーワードを付けたクラスやメソッド、メンバ変数にアクセス可能な箇所を図にまとめたものが以下になります。

パッケージプライベート(default)

パッケージプライベート(default)修飾子は、「指定したクラスと同じパッケージに所属するすべてのクラスからのみ」アクセス可能な修飾子です。
他の修飾子とは記述方法が異なり、アクセス修飾子をつけずにクラスやメソッド、メンバ変数を定義した際に、この動作になります。
[構文]対象のクラスやメソッド、メンバ変数を、アクセス修飾子をつけずに定義します。

//クラスをパッケージプライベートにする例
class ○○{
	
	//メンバ変数をパッケージプライベートにする例
	int △△;
	
	//メソッドをパッケージプライベートにする例
	void □□(){
		
	}
}

パッケージプライベートにしたクラスやメソッド、メンバ変数にアクセス可能な箇所を図にまとめたものが以下になります。

private

private修飾子は、「指定したメソッドやメンバ変数が定義されたクラスと同じクラス内からのみ」アクセス可能な修飾子です。
アクセス修飾子の中でもっとの公開範囲の狭い(制限が厳しい)ものになります。
そのため、private修飾子はクラスにつけて定義することはできません。
[構文]対象のメソッド、メンバ変数に「private」キーワードをつけて定義します。

//クラスにはprivateをつけることはできません
public class ○○{
	
	//メンバ変数にprivateをつけた例
	private int △△;
	
	//メソッドにprivateを付けた例
	private void □□(){
		
	}
}

privateキーワードを付けたメソッド、メンバ変数にアクセス可能な箇所を図にまとめたものが以下になります。


アクセス修飾子のまとめ

今回紹介した3つのアクセス修飾子のアクセス制限範囲を表にまとめたものが以下のようになります。

それぞれのアクセス修飾子の制限範囲を明確に理解して、プログラムの中で適切に利用することで、定義した変数に不正な値が代入されたり、利用できないはずの場所で
利用されたりといった、不具合を防ぐことが可能になります。
このような構造にすることで、「カプセル化」を実現することにもつながります。カプセル化に関しては、別の記事で詳しく解説しています。
アクセス修飾子の選び方は、「要件を満たすうえで最も範囲の狭いもの」にしておくことが良いかと思います。


パッケージとモジュール編・次回の内容

今回はアクセス修飾子について解説してきました。
次回は、Java 9 から追加されたより細かいアクセス制御を行う方法である「モジュール」について解説していきます。


初めてのJavaシリーズの目次はこちら
パッケージとモジュール編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら