パッケージと言う機能は、複数人での開発となった場合に威力を発揮する機能です。
プログラムの規模が大きくなると、複数人での開発スタイルとなりますが、
その場合、同じクラス名を使うとエラーとなってしまいます。
それゆえに、クラス名が衝突しない様に、気を遣う事となります。
プログラマ自身が気をつけなければならないため、
独自の管理体制を持つ必要がありました。
このクラス名衝突問題の管理をJava言語の中に取り込んだのがパッケージです。
パッケージには、好きな名前をつける事ができ、
そのパッケージがフォルダ(ディレクトリ)機能を提供します。
1つのフォルダの中には同じ名前のファイルを格納できませんが、
異なるフォルダ間であれば、同じファイル名があっても大丈夫です。
これと同じように、1つのプログラムの中に同じクラス名があってはいけません。
しかし、異なるパッケージ間であれば、同じクラス名があっても大丈夫です。
と言う事です。
なんとなくイメージがつかめたでしょうか?
パッケージの使い方
パッケージは、フォルダ機能を提供していますが、
手作業でフォルダを作る必要があります。
(プログラム統合開発環境 Eclipse ではパッケージを作る機能があります。)
例えば pkg_hello と言うパッケージを作るとしたら、
パッケージ名と同じ pkg_hello と言うフォルダを作ります。
そして、その pkg_hello パッケージ内に Chelloクラスを記述したい場合、
pkg_helloフォルダ内に Chelloクラスを記述したソースファイルを格納します。
実際のコード例を書いてみます。
ファイル名:Chello.java
package pkg_hello;
public class Chello {
void show() {
System.out.println("Hello");
}
}
|
先頭行でパッケージ指定しています。
この記述は、このファイルは pkg_helloパッケージに属しています。
と言う意味になります。
そして、もう1つ別のパッケージとそのパッケージ内のクラスも作ってみます。
ファイル名:Cmain.java
package pkg_main;
public class Cmain {
public static void main(String[] args) {
pkg_hello.Chello obj = new pkg_hello.Chello();
obj.show();
}
}
|
こちらは、pkg_mainパッケージに属するCmainクラスです。
このpkg_mainパッケージ内から別のパッケージ内のクラスを指定するには、
パッケージ名.クラス名 と指定する必要があります。
また、パッケージ間でクラスを使う場合は、
クラス修飾子としてpublicを指定しなければなりません。
何も指定しない場合は、別パッケージからそのクラスを使えません。(アクセス不可)
同じパッケージ内に限りアクセスできます。
この2つのパッケージを用いたプログラムフォルダ構成図は以下のようになります。
pkg_hello(フォルダ)
└Chello.java(ソースファイル)
pkg_main(フォルダ)
└Cmain.java(ソースファイル)
|
Javaには以下のようなルールがあるため、上記のような構成にしてあります。
・1つのファイルには、1つのpublic指定クラスしか記述できない。
・public指定されたクラスがあるファイルのファイル名は、
"public指定したクラス名.java" と、しなければならない。 |
public指定されていないクラスが記述されたファイルのファイル名は
自由に決めてOKです。しかし、クラス名をファイル名とすると分かりやすくなります。
1ファイルに1クラスの記述をするようにするとキレイな構成になります。
パッケージのネスト
パッケージ内にパッケージを作る事もできます。
これは、フォルダ内にフォルダを作る。と言う意味と同じです。
もちろん、それぞれのパッケージ内のクラスは別モノとして扱われます。
使用例
パッケージ(フォルダ)構成図
pkg_A(フォルダ)
└pkg_B(フォルダ)
└Chello.java(ソースファイル)
pkg_main(フォルダ)
└Cmain.java(ソースファイル)
|
ファイル名:Chello.java
package pkg_A.pkg_B;
public class Chello {
void show() {
System.out.println("Hello");
}
}
|
ファイル名:Cmain.java
package pkg_main;
public class Cmain {
public static void main(String[] args) {
pkg_A.pkg_B.Chello obj = new pkg_A.pkg_B.Chello();
obj.show();
}
}
|
このプログラムは、パッケージ pkg_A の中にパッケージ pkg_B を入れた例です。
パッケージが1階層の時と同じようにドットを使って
パッケージ名.パッケージ名.クラス名 のように指定します
パッケージの活用例
パッケージ機能の活用例としては、
佐藤君、鈴木君、田中君の3人で1つのアプリケーション開発しているとしたら、
それぞれに固有のパッケージを担当させる。
例えば、佐藤君が作る全てプログラムは、パッケージ:satou内で作るものとする。
以下、鈴木君と田中君も同じようにすれば、
それぞれが作ったプログラムを合わせた時に、
クラス名の衝突がない事がパッケージ機能によって保証されているので、
そのような事を気をする必要がなくなります。
スポンサードリンク
|