パッケージとはクラスを整理してわかりやすくひとまとめにしたものです。
「Java.util.*」「Java.awt.*」などのようにJavaによって提供されているパッケージ内のクラスもありますが、パッケージを自分で作成する事もできます。
今回はパッケージとはどのようなものなのか、そしてパッケージの作成方法を見ていきましょう。
SPONSORED LINK
photo by Owen Moore
▼この記事の目次
「Java」パッケージ
例えばJavaファイルからコンパイルしたクラスファイルがあるとします。Cドライブ直下、Javaフォルダ内のtest1~5.class、です。
┠ Java
┣━━━┯━━━┯━━━┯━━━┓
test1 test2 test3 test4 test5 (.class)
書ききれないので5つのクラスとしましたが、何十と多くのクラスファイルを作ってくと大変見ずらいものとなってしまいます。
フォルダやブックマークにダウンロードしたファイルや画像が増えていき整理しないと目当てのファイルを探すのも一苦労ですよね。ちょっと違う部分もありますがそのような感じです。
ちょっと違う部分というのは通常同じクラスファイル名を作成する事はできないのですが、パッケージでクラスファイルを管理する場合はパッケージを分ければたとえ同じクラスファイル名だったとしても別のクラスファイルとして扱われるのです。
予約語とかぶらないようにする
例えば「byte.class」というクラスを新規で作るとしましょう。しかし、byteという識別子は予約語としてJavaに存在しています。
※ 予約語一覧
abstract | assert | boolean | break | byte | case | catch | char |
class | const | continue | default | do | double | else | enum |
extends | final | finally | float | for | goto | if | implements |
import | instanceof | int | interface | long | native | new | package |
private | protected | public | return | short | static | strictfp | super |
switch | synchronized | this | throw | throws | transient | try | void |
volatile | while | true | false | null |
一覧として出してみましたが、この中で予約語として該当するものはクラスとして作成する事が出来ません。パッケージで宣言してもこれは同じ事です。
試しに「byte.java」を作りコンパイルしてみましたが、「identifierがありません」と表示されさらにmainメソッドの定義も含めて全てがエラーとなってしまいます。どうしても予約語を使いたいという場合は先頭の文字を大文字にするなどします。
また同一ファイル名を複数作成するには、パッケージに含める必要があります。
パッケージとして宣言すれば・・
「パッケージ名.クラスファイル名」
「パッケージ名・パッケージ名2.クラスファイル名」
などといった名前空間が与えられるので名前同士が衝突する事なく利用する事ができるのです。
デフォルトパッケージ
Javaのクラスファイル (.class) はその性質上、必ずパッケージ内に納める必要があります。
となると・・
「今までパッケージを指定する事なく作成していた通常のクラスファイルはどうなる?」
という話になってきますよね。パッケージを意識して作成しているわけではないので。
実はパッケージを宣言して作成したクラスファイルではなくても、全くパッケージを使用していない状態というわけではなくCドライブ直下のデフォルトパッケージを使用しているという事になります。
パッケージ名の付け方
コーディング規約というプログラムを書くために定義されたルールがあり、パッケージ名の付け方においてもこのような決まり事があります。主に複数人で共同、大規模なプログラムを行うための決まり事のようですが、ソースコードの可読性を高めるためにもあるので一人で開発を行う場合でも是非知っておきたいルールです。
わかりやすいネーミングを付ける
パッケージ名をつける場合はできるだけわかりやすいネーミングにします。
例えばパッケージ名が「tc」だけではこれが何を意味するのか判断できませんよね。これではパッケージが複数あったり時が経てば作成した自分自身でさえもわけがわからなくなる可能性があります。
これを「testcalculator」にしたらどうでしょう?計算機・または電卓をテストで作ったクラスのパッケージだなという事がなんとなくわかります。
全て小文字で統一する
クラス名は「Test」のように単語の先頭の文字のみ大文字で後は小文字というルールです。それに対しパッケージ名は全て小文字にするというのが決まりのようです。
ドメインを逆にする
世界中でパッケージ名の衝突を避けるためドメインを逆にする事が推奨されているようです。
例えばこのように・・
henoheno.moheji.com
com.moheji.henoheno
「-」ハイフンは使えないので「_」アンダーバーに変更する
heno-heno.moheji.jp
jp.moheji.heno_heno
Googel Playストアで確認
ストアで実際どのようなパッケージ名が使われているか確認してみました。スマホでだとよくわかりませんでしたが、PCなら簡単に確認する事が出来ます。「?id=」以降のURLの文字列がパッケージ名になっているんです。
いくつか適当にパッと見ただけですがほとんどのAndroidアプリが、やはりドメインを逆にしているのかプロジェクト名やアプリ名を入れただけなのかわかりませんが「com.○○○.○○○」「jp.○○○.○○○」となっているようです。
photo by samthor
パッケージを作成する
ではパッケージの階層を作り、その最下層に作ったJavaファイルを入れてコンパイル→実行までの流れをやってみましょう。
パッケージを作成
それではパッケージを作成しましょう。最終的にはパッケージ内のクラス含めて「jp.test.test2.test3.hoge.hoge.java」というものを作ります。
GUIでも作れますが、コマンドプロンプトで作ってみます。詳しくは「コマンドプロンプトによるディレクトリ操作方法」で紹介しています。
「Hoge.java」の中身
Hogeクラスです。繰り返し処理を行うためにfor分を使いました。パッケージの宣言を行うのですがパッケージの階層は「.」で区切る事ができます。
public class Hoge{
public static void main(String[] args){
for(int i = 0; i < 30 ; i++){
System.out.println(“【処理】→ ” +i+ “回目”);
}
}
}
パッケージ内のクラスファイルをコンパイル→実行
それではコマンドプロンプトを使いコンパイルから実行までやってみます。コマンド前にカレントディレクトリをパッケージの手前の階層まで移動しておきます。
javac jp\test\test2\test3\hoge.Hoge.java
//▼実行
java jp.test.test2.test3.hoge.Hoge
当たり前の事ですが、パッケージの名前空間にあるクラスファイルを修正する度にコンパイルする必要があるので階層が深ければ深い程これが結構手間になります。
この記事のまとめ
パッケージ以外にもjarファイルなるものがあります。こちらはパッケージよりも大きい概念でクラスやパッケージをZIP圧縮技術を使ってまとめられたファイルです。プログラムをまとめて再利用したり配布するためにと・・ まだ使う機会はなさそうです。