クラス宣言とアクセス修飾子


今回はアクセス修飾子についてみていきます。クラス、メソッド、フィールドにアクセス権限をつけることにより、オブジェクト指向の特徴の1つである「カプセル化」を実現します。まずは、「クラス宣言とアクセス修飾子」からみていきます。

カプセル化とは

wikipedia引用

カプセル化とは、オブジェクト指向を構成する概念の一つ。オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。データ隠蔽と勘違いされやすいが、データ隠蔽はカプセル化の具体例の1つにすぎず、同一のものではない。

オブジェクト内部のデータや振る舞いを隠蔽すると書かれていますが、簡単に言えば外部クラスからのアクセスを自由にできないようにするということです。オブジェクトのデータ(フィールド)は、自分自身のクラスからのみ参照や更新ができ、外部からの直接の参照や更新はできないようにすることが望ましいです。直接データ(フィールド)を参照や更新すると思わぬバグが発生する確率が高くなります。バグを減らすにもデータ(フィールド)への参照は、そのデータ(フィールド)を参照・更新するメソッドを準備し、そのメソッドを通すことが望ましいです。また、メソッドにも内部処理専用のメソッドを作成することも多々ありますが、当然そのようなメソッドは外部から参照させることは良くありません。

クラス宣言とアクセス修飾子

(1) class AccessDefaultClass{}
(2) public class AccessPublicClass {}
(3) protected class AccessProtectedClass {}
(4) private class AccessPrivateClass{}

アクセス修飾子には、「public 、protected 、private」 があります。
各アクセス制限の範囲はこの後みていきますので、まずはクラス宣言で指定できるアクセス修飾子の種類をみます。
(1)はアクセス修飾子を指定していません。(2)は「public」を指定しています。この(1)と(2)は指定してもエラーにはならないので使えます。
(3)は「protected」を指定しています。(4)は「private」を指定しています。この(3)と(4)を指定すると次のようなエラーが表示されました(※eclipse)。

クラス ○○ の修飾子が正しくありません。
public、abstract、およびfinalのみが許可されています。
指定なし public protected private
× ×

結果からアクセス修飾子を指定しないか、「public」のみ指定できます。

アクセス制限の範囲

クラスで指定できるアクセス修飾子は、「指定しない」か「public修飾子」でした。では、この2つのアクセス権限の範囲の違いについてみていきます。

(1) class AccessDefaultClass{}
(2) public class AccessPublicClass {}

(3) package makeA;
    class AccessDefaultClass{}
(4) package makeA;
    public class AccessPublicClass {}

(1)(2)はパッケージの指定をしていないのでデフォルトパッケージに属します。(3)(4)は「makeA」というパッケージに属します。各パッケージにはアクセス修飾子を指定しないクラスとpuclicのクラスを準備し、これらのクラスへアクセスできるか確認してみます。

public class Sample{
    public static void main(String[] args) {
    	//デフォルトパッケージ > アクセス修飾子なし
    	AccessDefaultClass   Obj_1 = new AccessDefaultClass();
    	//デフォルトパッケージ > public修飾子
    	AccessPublicClass    Obj_2 = new AccessPublicClass();
    	//makeAパッケージ > アクセス修飾子なし
    	makeA.AccessDefaultClass  Obj_3
    	    = new makeA.AccessDefaultClass();
    	//makeAパッケージ > public修飾子
    	makeA.AccessPublicClass   Obj_4
    	   = new makeA.AccessPublicClass();
    }
}
 Exception in thread "main" java.lang.Error:
             Unresolved compilation problems:
   型 makeA.AccessDefaultClass は不可視です

java096

Sampleクラスはパッケージの指定をしていないのでデフォルトパッケージに属します。各クラスの関係は上図のようになります。Sampleクラスから各クラスにアクセスした結果、makeAパッケージのアクセス修飾子を指定しないクラスだけがエラーになりました。

結果をまとめると

同パッケージ内のクラスへのアクセスには制限はない。
別パッケージの場合は、Public修飾子のクラスのみアクセスできる

となります。
次回はメンバのアクセス修飾子についてみていきます。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です