パッケージについて
パッケージとは
クラスを整理するための仕組みのこと。
Java言語には多くのクラスが存在する。そのため、大量のクラスを目的や機能ごとに整理しておくと、目的ごとに使いやすくなり、クラスの管理も容易になる。
パッケージ宣言の仕方
「package パッケージ名;」で宣言する。
(正)ソースコードの先頭行に記述する
package jp.co.xxx;
import aaa.*;
public class Hello(){
System.out.println("hello world!");
}
(誤)パッケージ宣言よりも前にimportが記述されている
import aaa.*;
package jp.co.xxx;
public class Hello(){
System.out.println("hello world!");
}
必ずソースコードの先頭行に記述しなければならない
パッケージ宣言よりも前に記述できるのはコメントだけ
目的
- 名前空間を提供し、名前の衝突を避ける
- アクセス制御機能を提供する
- クラスの分類を可能にする
名前空間を提供し、名前の衝突を避ける
パッケージが違うと、同じクラス名のクラスでも別クラスとなる。
もし名前が同じクラスがあった際に、コンパイラやJVMはどちらのクラスを使えば良いか判断できず、コンパイルエラーや、意図したクラスが利用されない可能性がある。
その場合に名前の重複を避けるために使う。
コンパイラやJVMはクラスを「パッケージ名.クラス名」で判断する。
そのためパッケージ名はできる限り一意であるのが望ましい。
ちなみに「パッケージ名.クラス名」での表現を完全修飾クラス名、「クラス名」だけの省略形を単純名と呼ぶ。
完全修飾クラス名:「java.lang.String」
単純名 :「String」
アクセス制御機能を提供する
クラスを複数のパッケージに分けることで、パッケージ単位でアクセス制御ができるようになる。パッケージ内のクラスを公開するクラスと公開しないクラスに分けることで、思っていたクラスと違うクラスが利用されることを防ぐ。
アクセス修飾子の種類
「private」:同じクラス内からのみアクセス可能
「protected」:同じパッケージ内のクラスや違うパッケージでも、そのクラスを継承したサブクラス内からアクセス可能。
「public」:全てのクラスからアクセスできる
「なし」:同じパッケージ内のすべてのクラスからアクセス可能
<例>
jp.co.xxxパッケージに属するpublicなHelloクラスの宣言
package jp.co.xxx;
public class Hello(){
System.out.println("hello world!");
}
jp.co.xxxパッケージに属するByeクラスの宣言
package jp.co.xxx;
class Bye(){
System.out.println("Bye!");
}
publicであるHelloクラスは他のパッケージに属するクラスからも利用できるが、publicではないByeクラスは利用することができない。
クラスの分類を可能にする
パッケージはディレクトリ構造になっている。ソースディレクトリ配下にあるディレクトリはパッケージである。
「jp.co.xxx.Hello」クラスだったら「¥¥jp¥co¥xxx¥¥Hello.class」という感じ。
クラスは必ず何らかのパッケージに属しており、パッケージ宣言を省略したクラスはデフォルトで無名パッケージに属するものと解釈される。パッケージに属さないクラスは存在しない。