Javaのプログラム開発では、パッケージの構成を予め決定した上で、膨大な数になるクラスファイルを管理する方法が一般的です。
本記事では、パッケージの基本的な概要からJavaで実際に利用する方法までご紹介していきます。
Javaのパッケージって何?
Javaでアプリケーション開発を行う際、パッケージと呼ばれるグルーピングを行った上でクラスファイルを格納し、パッケージを組み合わせてシステムを稼働させます。
デフォルトパッケージ
Javaではクラスファイルを配備する際、必ずどこかのパッケージに格納されている必要があります。
デフォルトパッケージは、名前の通りパッケージ宣言をしなかった場合に自動的に割り振られるパッケージです。
これまでJava開発をされたことのある方で、特にパッケージの指定などせずにJavaアプリケーションを動かすことが出来ていた場合、このデフォルトパッケージが利用されている可能性が高いです。
パッケージとディレクトリ
Javaではパッケージとディレクトリが少し混同してしまいがちですが、基本的にはパッケージとディレクトリは同一名と考えて問題ありません。
厳密には定義自体は異なりますが、ファイル名とクラス名を同じにするように、パッケージ名とディレクトリ名は同じ名前で作成するのが一般的です。
命名規則
パッケージ名の命名規則としては、まずインターネットのドメインを反対にした方式が一般的です。
当サイトのドメインを例にすると「style.potepan.com」がインターネットのドメイン名ですので、パッケージ名は「com.potepan.style」となります。
また基本的に数字かアルファベットの小文字で構成され、ハイフンは使わずアンダースコアを利用します。
Javaパッケージの利用方法
Javaでパッケージを利用するには、「宣言」と「import」が必要となってきます。
前提
パッケージを利用する際、宣言するパッケージ(ディレクトリ)構成でファイルが格納されている必要があります。
プログラムファイルが宣言した場所にない場合、コンパイルエラーとなるため注意が必要です。
宣言
宣言方法はJavaファイルの先頭に下記の形式で記述します。
package パッケージ名;
ちなみにパッケージは階層化させることが可能で、「.」で繋げてパッケージを記述します。
package パッケージ1.パッケージ2[.パッケージ3・・・];
パッケージ名指定
パッケージ名を指定してクラスにアクセスすることで、後述するimport文を利用しなくても別パッケージのクラスを利用することが出来ます。
パッケージ名.クラス名[.メソッド名];
ちなみに呼び出し元のクラスと同一パッケージにアクセスしたいクラスファイルが格納されている場合、クラス名指定だけで利用出来ます。
クラス名[.メソッド名];
import
他パッケージのクラスにアクセスする際、パッケージ名をいちいち記述するのは面倒なのでimport文を記述する方法が一般的です。
import文を記述しておけば、指定したパッケージのクラスファイルにはクラス名だけでアクセス出来るようになります。
import パッケージ名.クラス名; import パッケージ名.*;
クラス名まで指定した場合は明示したクラスにのみアクセス可能で、「*」で指定した場合はパッケージ配下の全てのクラスにアクセスすることが出来るようになります。
パッケージを使ったJavaサンプル
では実際にJavaのサンプルコードで、パッケージの使い方をもう少し詳しく確認していきましょう。
パッケージ構成
ルートから「tree」コマンドを実行してパッケージ構成を確認しておきます。
$ tree . ├── Main.java ├── Test.java └── app1 ├── Sample1.java └── app2 ├── Sample2.java └── Test.java
サンプルコード
パッケージ構成に記載されたそれぞれのJavaファイルには下記のコードを記述しました。
Main.java
import app1.Sample1; import app1.app2.Sample2; public class Main { public static void main(String[] args) { Test.run(); Sample1.run(); Sample2.run(); app1.app2.Test.run(); } }
サンプルでは3種類のパターンでクラスにアクセスしています。
7行目は同一パッケージ内のためクラス名の記述のみ、8,9行目に関してはimport文でパッケージの指定を予めおこなっています。
10行目に関しては、同一クラス名のファイルが存在するため、パッケージを明示した上でクラスにアクセスする方法です。
Test.java(同一パッケージ)
public class Test { public static void run() { System.out.println("同一パッケージ内のTestクラスにアクセスしています。"); } }
こちらのTest.javaはデフォルトパッケージを利用するため、パッケージの宣言は行っていません。
Sample1.java
package app1; public class Sample1 { public static void run() { System.out.println("app1のSample1クラスにアクセスしています。"); } }
Sample1.javaは、app1パッケージ配下に格納しているため、1行目でパッケージの宣言を行っています。
Sample2.java
package app1.app2; public class Sample2 { public static void run() { System.out.println("app1.app2のSample2クラスにアクセスしています。"); } }
Sample2.javaは、階層化されたapp2のパッケージに属することを宣言しています。
Test.java(app2のパッケージ)
package app1.app2; public class Test { public static void run() { System.out.println("app1.app2のTestクラスにアクセスしています。"); } }
Javaではこのようにパッケージが異なれば、同一クラス名を利用することも可能です。
実行結果
サンプルのプログラムを実行すると下記の結果が表示されます。
同一パッケージ内のTestクラスにアクセスしています。 app1のSample1クラスにアクセスしています。 app1.app2のSample2クラスにアクセスしています。 app1.app2のTestクラスにアクセスしています。
パッケージが異なるクラスにもアクセス出来ていることがご確認頂けます。
さいごに: パッケージ名を分かりやすく設定しJavaファイルを管理しよう
本記事では、Javaのパッケージに関して命名規則から宣言方法まで、初心者向けに使い方をご紹介してきました。
パッケージ名の設定には今回簡単にご紹介した一般的な命名規則から、プロジェクト固有の命名規則まで様々です。
パッケージ名を分かりやすく設定して、読みやすく管理されたJavaのパッケージ構成になるようプロジェクトに活用してみてください。
import文は記述しなくても、パッケージからのフルパスを記述することで利用出来ますが、import文を記述することでコーディング量を減らす方法が一般的です。