パッケージ


クラスグループ

パッケージとは、その名のとおりです
一連のクラスやインターフェイス郡をひとつのパッケージとして扱います
パッケージは関連するクラスファイル郡を表します。それはディレクトリまたはライブラリを指します

パッケージは、集団によるJavaプログラムのプロジェクトや、巨大なシステムの作成時に欠かせません
これまでのサンプルプログラムは、ほんの一例に過ぎない短いプログラムでしたが
実用性に耐えるプログラムであれば、当然クラスやインターフェイスも効率よく拡張しなくてはいけません

すでに気づいていると思いますが
Javaはクラスごと、インターフェイスごとにバイトコードを生成しています
パッケージはクラスやインターフェイスのアクセス権などを左右する重要な機能です

パッケージを割り当てるにはpackageステートメントを使用します
ただし、packageステートメントはコメントを除いてファイルの先頭に記述されていなくてはいけません

package packName;

packNameにはパッケージ名を指定できます
packageステートメントはひとつのファイルに最大ひとつまでしか宣言できません
また、ファイルは必ずパッケージ名と同じディレクトリ下に存在していなければなりません

packageを指定しなかった場合は、Java既定のパッケージに割り当てられます
私たちがこれまで記述したきたのはこの方法ですね

別クラスへ名前だけでアクセスできるのは同じパッケージ内のクラスだけです
これまで、クラスのインスタンスの作成や静的メンバへのアクセスは
直接、その名前を指定するだけで問題なくアクセスすることができました
別のパッケージからあるクラスへアクセスするには、パッケージ名を指定し
かつ、そのクラスとメンバが他のパッケージからのアクセスを許可していなければなりません

別クラスへのアクセスは、後ほど紹介するとして
この場では、自作クラス郡を同じパッケージとして作成してアクセスを試みます
このとき、*.javaファイルは別々に作成してコンパイルしてください
//test.java

package pak;

class test {
	public static void main(String args[]) {
		LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 17);
		naru.write();
	}
}
//LOVE_HINA.java

package pak;

class LOVE_HINA {
	String name;
	int age;

	void write() {
		System.out.println(this.name + "\t" + this.age);
	}

	LOVE_HINA(String name , int age) {
		this.name = name;
		this.age = age;
	}
}
これら二つのファイルを用意します
package名は必ず同じにし、pakディレクトリに格納します
pakディレクトリのひとつ上のディレクトリ(親ディレクトリ)をカレントディレクトリにして
Windowsプラットフォームならばコマンドラインで次のようなコマンドを打ちます

javac pak\*.java

これで、pakディレクトリのjava拡張子のファイルがコンパイルされます
単体ではなく、パッケージごとコンパイルする必要があります

実行する時も、やはりパッケージを指定する必要があります
pakディレクトリの親ディレクトリから、次のコマンドを指定してください

java pak.test

既定パッケージ以外のパッケージクラスを実行させる場合
パッケージ名とクラス名を指定します
このような、フルネームのクラス名を完全限定名と呼びます

パッケージはディレクトリ構造同様に構造化できます
段階構造化したパッケージを指定するには、ドット演算子で区切ります

package packName1.packName2.packNameN...

packNameはパッケージ名です
当然クラスファイルは、それに相当した場所においておく必要があります

なぜこのような技術が必要かというと、Java言語は全てのクラスが独立したクラスです
そのため、myClass というクラスは、どこの誰が作ったmyClassなのかわからない
そこで、myClassにさらに名前をつけるのがパッケージなのです

たとえば、あなたには手紙などの郵便物が届きますよね
なぜ、郵便物が正確にあなたに届くのか考えてみましょう

あなたには名前があります。しかし、あなたと同じ名前の人は沢山います(全国探せば)
さらにあなたを識別するために名字があります
でも、名字と名前をあわせても、全国にはやはり同姓同名の人がいます
さらにその上には、あなたの住所が書いてあります
中央区 ○○さんへ だけでは届きません。北海道札幌市中央区…というように指定されています

そう、あなたは 国.県.市町村.番地.名前 というようにパッケージ化されているのです
その気になれば、国の上にも大陸名、星名、銀河名というように、パッケージかできます(笑)

Javaのパッケージも考え方はこれと同じです
あなたが作ったクラスに、正式な住所を指定するこで不要な衝突を防ぎます

package pak;
class test {...

この場合、testクラスはpackageでフルネームが与えられることになります
testクラスのフルネームは pak.test です
だから、さきほどコマンドラインで呼び出す時にパッケージ名も指定していたのです

Java 仮想マシンは、コマンドを与えられるとカレントディレクトリのクラスを検索します
完全限定名であれば、カレントディレクトリ下の与えられたパッケージコードのディレクトリを検索します
それでもクラスが無い場合は、Javaのクラスライブラリを検索します

ですが、場合によってはこちらが指定したあるディレクトリを自動検索してほしい場合があります
Javaクラスライブラリやカレントディレクトリ以外の、特定の場所にクラスなどを保存している時などです
そのような場合は、あなたが使っているプラットフォームの方法で CLASSPATH 環境変数を設定してください


package

ファイル内のコードが所属するパッケージ名を指定します
同じパッケージ内であれば直接名前を指定するだけでアクセスできますが
他のパッケージからは、パッケージ名も指定しなければアクセスできません



前のページへ戻る次のページへ