パッケージとは、クラスを整理してわかりやすくひとまとめにしたものです。
「Java.util.*」「Java.awt.*」などのようにJavaによって提供されているパッケージ内のクラスもありますが、パッケージは自分で作成することもできます。
今回はパッケージとはどのようなものなのか、そしてパッケージの作成方法を見ていきます。それではさっそく始めていきましょう。
「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ドライブ直下のデフォルトパッケージを使用しているということになります。
パッケージ名の付け方
コーディング規約というプログラムを書くために定義されたルールがあり、パッケージ名の付け方においてもこのような決まりごとがあります。
主に複数人で共同、大規模なプログラムを行うための決まりごとですが、ソースコードの可読性を高めるためにもあるので1人で開発を行う場合でも是非知っておきたいルールです。
わかりやすいネーミングを付ける
パッケージ名をつける場合はできるだけわかりやすいネーミングにします。
例えばパッケージ名が「tc」だけではこれが何を意味するのか判断できませんよね。これではパッケージが複数あったり時が経てば作成した自分自身でさえもわけがわからなくなる可能性があります。
これを「testcalculator」にしたらどうでしょう?計算機・または電卓をテストで作ったクラスのパッケージだな、ということがなんとなくわかります。
全て小文字で統一する
クラス名は「Test」のように単語の先頭の文字のみ大文字で後は小文字というルールです。それに対しパッケージ名は全て小文字にするというのが決まりのようです。
ドメインを逆にする
世界中でパッケージ名の衝突を避けるためドメインを逆にする事が推奨されているようです。
例えばこのように・・
henoheno.moheji.com
com.moheji.henoheno
「-」ハイフンは使えないので「_」アンダーバーに変更する
heno-heno.moheji.jp
jp.moheji.heno_heno
Google Playストアで確認

ストアで実際どのようなパッケージ名が使われているか確認してみました。スマホでだとよくわかりませんでしたが、PCなら簡単に確認する事が出来ます。「?id=」以降のURLの文字列がパッケージ名になっているんです。
いくつか適当にパッと見ただけですがほとんどのAndroidアプリが、やはりドメインを逆にしているのかプロジェクト名やアプリ名を入れただけなのかわかりませんが「com.○○○.○○○」「jp.○○○.○○○」となっているようです。
パッケージを作成する
ではパッケージの階層を作り、その最下層に作った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圧縮技術を使ってまとめられたファイルです。プログラムをまとめて再利用したり配布するためにと・・ まだ使う機会はなさそうです。