検索

キーワード


【Java】アクセス修飾子の使い分け方は?注意すべき有効範囲と宣言対象

  • 公開日:2020-08-11 15:46:06
  • 最終更新日:2021-01-25 17:32:39
【Java】アクセス修飾子の使い分け方は?注意すべき有効範囲と宣言対象

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてアクセス修飾子について紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:パッケージの役割 / メソッドの使い方紹介 / 変数と定数の違いとは? / コンストラクターとは? / カプセル化をする理由

アクセス修飾子の役割と使い方

プロジェクトを開発する際は様々なクラスやメソッドなどが組み合わせることになります。

組み合わさったクラスやメソッドはお互いに影響を与え合いますが、

その範囲が制限なく許可されてしまうと、どこでどのような影響があるか予想さえできなくなります。

このような事態に陥らないようにするため、また効率的に汎用性の高い機能を共有して使うために、

アクセス修飾子を活用します。

ここでは共有範囲をコントロールするためのアクセス修飾子について紹介させていただきます。


アクセス修飾子の役割

アクセス修飾子はクラスやメソッド、フィールド、コンストラクタなど様々なもので宣言され、

アクセスの有効範囲を詳しく設定することができます。

例えば広範囲でアクセス可能なセッター・ゲッターといったメソッドは、

同じクラス内のフィールドへアクセスしますが、そのフィールドは同クラス外からのアクセスを許可しません。

◆同じクラスの中でメソッドとフィールドの公開範囲を区別

// 「private のフィールド」と「public のメソッド」を作成
public class AccessTest {
	private int num;
	
	public int setNum(int number) {
		return num = number;
	}
}

このようにフィールドの値の直接的な変更を阻止することをカプセル化で実現します。

 ※カプセル化については別記事で紹介させていただきます。



アクセス修飾子の種類

アクセス修飾子には4種類あり、

メソッドやフィールドなどをどのように扱いたいかによってアクセスの有効範囲を選びます。

ではそれぞれの違いを見ていきましょう。


public

アクセス修飾子の中で最も公開範囲が広く、全てのクラスからアクセスが可能です。

外部からのアクセスがあっても問題がない、

もしくは外部で利用することを目的に作成されたものに対して public の宣言を行います。

実際にサンプルコードで書き方の確認をしましょう。

◆ public の宣言例

// public クラス
public class AccessTest {

  // public フィールド
	public int num;

  // public メソッド	
	public int setNum(int number) {
		return num = number;
	}
}

全てがオープンされたクラスです。

クラスのアクセス修飾子は「public」と「デフォルト」のみ宣言可能です。

また1つのファイルが複数のクラスを持つことは可能ですが、

public クラスはファイル名と同名のクラスでなくてはならないため、1ファイルにつき1クラスしか保持できません。


private

public と相対的に、アクセス修飾子の中で最も公開範囲が狭いアクセス修飾子が private です。

private が宣言されたクラス内でのみアクセスが有効となり外部のアクセスを一切受け付けないため、

最も変更に強いアクセス修飾子ということになります。

宣言の方法は public と同様です。

◆ private の宣言例

public class AccessTest {

  // private のフィールド
	private int num;

  // private のメソッド
	private int setNum(int number) {
		return num = number;
	}
}

これでは何も生み出さないクラスになってしまいますが、全てを公開しないクラスです。

private はこのクラスのみでアクセスが可能であることから、

private のメソッドやフィールドが変数や引数を持つ場合は、同じクラス内で使うことを前提とします。


protected

公開範囲が「同じクラス内」「同じパッケージ内」「継承したサブクラス」となります。

public が外部パッケージでもアクセスできることに対して、protected は外部パッケージのアクセスを許可しません。

ただし「継承したサブクラス」が外部パッケージにある場合はそのクラスのみアクセスを許可します。

※継承については別記事で紹介させていただきますが、簡単に紹介すると元となるクラスの機能を引き継ぐことです。

 クラスを継承してできた新たなクラスをサブクラスと呼びます。

◆ protected の宣言例

package test;

public class AccessTest {

  // protected のフィールド
	protected int num;
	
  // protected のメソッド
	protected int setNum(int number) {
		return num = number;
	}
}

上記例ではAccsessTestクラス内、testパッケージにある他のクラス、AccessTestを継承したサブクラスの3つが

アクセスの有効範囲となります。


デフォルト(宣言なし)

アクセス修飾子の宣言を付けないことをデフォルトと呼びます。

デフォルトでは同じパッケージ内のクラス間でアクセスが許可され、

外部パッケージのアクセスを一切受け付けません。

先ほど紹介した protected と private の間のアクセスレベルにあたります。

◆宣言なし(デフォルト)の例

package test;

class AccessTest {

	// デフォルトのフィールド
	int num;
	
	// デフォルトのメソッド
	int setNum(int number) {
		return num = number;
	}
}

testパッケージ内にあるクラスがアクセス可能なクラスです。



まとめるとアクセスの有効な範囲は以下の順に狭くなっていきます。


   public    :全てのクラスが対象

 protected :同クラス、同パッケージ、継承したサブクラスが対象

デフォルト :同クラス、同パッケージが対象

   private   :同クラスのみが対象



アクセス修飾子の宣言ができるもの

クラスは少し特殊ですが、アクセス修飾子が使える場所であれば基本的に紹介した全てのアクセス修飾子が宣言できます。

宣言の方法を紹介したので、どこでアクセス修飾子が使えるのかも併せて紹介しておきます。


         クラス        : public, デフォルト

インターフェース: public, デフォルト

       メソッド        public, private, protected, デフォルト

  コンストラクタ  : public, private, protected, デフォルト

     フィールド      : public, private, protected, デフォルト


宣言できるのは5つのみのため、覚えやすいのではないでしょうか。

クラスととインターフェース以外は全てのアクセス修飾子を宣言することができます。


まとめ

4つのアクセス宣言方法を使い分けることで、メソッドやフィールドなどのアクセス範囲を調整することができます。

アクセス修飾子は Java の特徴となるオブジェクト指向にも関りを持ってきますので、

使い方をしっかりと押さえておきましょう。


関連記事リンク

パッケージの役割 / メソッドの使い方紹介 / 変数と定数の違いとは? / コンストラクターとは? / カプセル化をする理由


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様