Javaでのシステム開発を行ったことがある方の中には、コードファイル内やプロジェクトツリー上にパッケージ(package)という表記を見たことがある方も多いのではないでしょうか。
本記事では、Java開発初心者の方向けにパッケージの概要から実際の使い方についてサンプルコードを掲載しながらご紹介していきます。
Javaのパッケージとは
Javaでは、パッケージを使ってクラスやインターフェースといったシステムを構成するファイルをグループ化させることが出来ます。
パッケージの役割
Java開発では、膨大なクラスファイルからシステムが構成されることも少なくないため、クラスファイルが煩雑になってしまいがちです。
パッケージを利用することにより、膨大なクラスを整理して管理することが出来るようになります。
実はJavaの仕様上、クラスファイルはいずれかのパッケージに属している必要があるため、パッケージを指定していない場合でもデフォルトパッケージに属している扱いとなります。
パッケージを利用するメリット
パッケージを利用するメリットとしてまず挙げられるのが、同名のクラスファイルを別パッケージであれば作成出来るという点です。
パッケージを指定しない場合、Javaでは同名のクラスファイルを作成することが出来ませんが、パッケージを切り分けることで同一パッケージ内でなければ同名のクラスファイルを作成することが出来ます。
またJavaには言語仕様により予め確保された予約語(Systemなど)がありますが、オリジナルのパッケージを作成することにより、パッケージ内であればJavaの予約語も使用することが可能です。
Javaでパッケージの利用方法
ここからは実際にJavaのパッケージ利用法についてご紹介していきます。
パッケージ宣言
パッケージの宣言は、Javaファイルの先頭にpackage文を記述する必要があります。
package パッケージ名;
階層化
パッケージを階層化させる場合、「.」でパッケージを繋げて記述します。
package パッケージ1.パッケージ2.パッケージ3;
パッケージの呼び出し方
パッケージの特定クラスを呼び出す場合、呼び出し側のクラスが同一パッケージかパッケージ外に存在するかにより条件が変わります。
同一パッケージのクラスを呼び出す場合、クラス名を記述するだけでアクセスすることが可能です。
外部パッケージ
外部パッケージのクラスを利用する場合、import文を記述して対象のパッケージを指定する必要があります。
import パッケージ.クラス名; import パッケージ.*;
パッケージの下にクラス名を記述した場合は、明記したクラスだけが利用出来るようになり、「*」を指定した場合はパッケージ配下のクラスファイル全てにアクセスすることが出来るようになります。
パッケージを使ったJavaサンプルコード
では実際にパッケージを使ったJavaサンプルコードで具体的な使い方を確認していきましょう。
サンプルコード1
1つ目のサンプルではパッケージ指定なしの「Main.java」から、「パッケージ指定なし(Test1.java)」「パッケージ指定あり(Test2.java)」「階層化されたパッケージ(Test3.java)」それぞれに格納されたクラスの処理を呼び出しています。
ルートフォルダからの階層
src $ tree . ├── Main.java ├── Test1.java └── sample1 ├── Test2.java └── sample2 └── Test3.java 2 directories, 4 files
Main.java
import sample1.Test2; import sample1.sample2.Test3; public class Main { public static void main(String[] args) { Test1.execute(); Test2.execute(); Test3.execute(); } }
1,2行目に記述しているimport文により、他のパッケージのクラスファイルにアクセスすることが出来るようになっています。
Test1に関しては同一パッケージ(デフォルトパッケージ)に格納されているため、import文不要でアクセス可能です。
Test1.java
public class Test1 { public static void execute() { System.out.println("Test1から出力しています。"); } }
シンプルなコンソール出力処理で、packageの宣言は行っていません。
Test2.java
package sample1; public class Test2 { public static void execute() { System.out.println("Test2から出力しています。"); } }
1行目に記述しているとおり、「sample1」パッケージ内のクラスファイルであることを宣言しています。
Test3.java
package sample1.sample2; public class Test3 { public static void execute() { System.out.println("Test3から出力しています。"); } }
Test3に関しては「sample1」パッケージ内部に「sample2」パッケージを作成し、格納されていることを宣言しています。
出力結果
これらのプログラムを実行すると下記の結果が出力されます。
Test1から出力しています。 Test2から出力しています。 Test3から出力しています。
サンプルコード2
次のサンプルは異なるパッケージに同一クラス名のファイルが存在するプログラムを実行してみます。
ルートフォルダからの階層
src $ tree . ├── Main.java ├── Test.java └── sample1 ├── Test.java └── sample2 └── Test.java 2 directories, 4 files
Main.java
public class Main { public static void main(String[] args) { Test.execute(); sample1.Test.execute(); sample1.sample2.Test.execute(); } }
同一パッケージに格納されているTestクラス以外はパッケージ名まで指定して処理を呼びだす必要があります。
import文ではどのTestクラスを実行しているのか分からないため、サンプルのような記述法になります。
Test.java(パッケージ指定なし)
public class Test { public static void execute() { System.out.println("パッケージ指定無しのTestクラスから出力しています。"); } }
Test.java(sample1パッケージ)
package sample1; public class Test { public static void execute() { System.out.println("sample1パッケージのTestクラスから出力しています。"); } }
Test.java(sample2パッケージ)
package sample1.sample2; public class Test { public static void execute() { System.out.println("sample2パッケージのTestクラスから出力しています。"); } }
出力結果
これらのプログラムを実行すると下記の結果が出力されます。
パッケージ指定無しのTestクラスから出力しています。 sample1パッケージのTestクラスから出力しています。 sample2パッケージのTestクラスから出力しています。
Main.javaクラスでパッケージを指定することにより、任意のパッケージに格納されたTestクラスの処理が実行されていることが確認出来ます。
さいごに: Javaのパッケージを使ってファイル管理を徹底しよう
本記事では、Javaのパッケージについて役割から使い方までをJava初心者向けに解説してきました。
小さなプロジェクトではあまりパッケージを意識することはないかも知れませんが、Java開発者としては抑えておきたい知識の1つです。
今回の情報を参考に、パッケージを使うことで記述方法がどのように変わるのかしっかりと把握しておきましょう。