オブジェクト指向言語 – 第 7 章 p.1

第 7 章 パッケージとライブラリ
他人の作成したクラス（やインタフェース）を利用したり、自分の作成したクラスを利用してもらうときには、クラス名やインタフェース名がぶつからないように気を付ける必要がある。
Java ではクラス名の衝突を避けるために(package) という仕組みを用いる。また、パッケージの名前の付け方にも一定の慣習がある。
この章では、パッケージを JAR (Java archive) と呼ばれる Java のライブラリを配布するためのファイル形式と併せて紹介する。

7.1 パッケージ
すでに、Java のクラスは、正式にはパッケージという階層的な名前空間に属している（例えば 、標準ライブラリの Graphics クラスの正式名は java.awt.Graphics 、PrintWriter クラスの正式名はjava.io.PrintWriter である）こと、パッケージに属するクラスを利用するときは、通常 import 文を使って短い名前を使うことなど 、を学習してきた。
ここでは、パッケージ内にクラスを作成する方法を紹介する。

7.1.1 package 宣言クラスが属するパッケージを宣言するには、ソースファイルの先頭に、package というキーワード、続けてパッケージ名とセミコロン（ ; ）を書く。例えば 、foo.bar というパッケージに Baz というクラスを定義するときはpackage foo.bar;
public class Baz {...
}のようにする。これで、正式な名前（ 完全修飾名）が foo.bar.Baz のクラスが定義される。という特別なパッケージに属することになる。
package 宣言のないクラスは、アプレットやサーブレットのように他のクラスから利用することがないクラスは 、無名パッケージでも特段不都合はない。しかし 、他のクラスから利用するクラスは、名前の衝突を避けるためにパッケージに入れる必要がある。

オブジェクト指向言語 – 第 7 章 p.2

第 7 章 パッケージとライブラリ

7.1.2 パッケージとディレクト リ階層の関係
クラス (.class) ファイルは、そのパッケージに対応するディレクトリに配置する。例えば、foo.bar.Bazクラスなら無名パッケージのクラスを置くデ ィレクトリ（ java コマンド で実行する場合はカレントディレクトリ、アプレットの場合は HTML ファイルが置かれているディレクトリ）の foo というディレクトリの bar というサブディレクトリに、 Baz.class というファイルを置く。
（ただし 、後述するように class ファイルを JAR ファイルというアーカイブファイルにまとめてしまう方法もある。）
main メソッド を持つクラス Main が 、例えば 、abc.xyz というパッケージにあるとき、これを実行するには abc というディレクトリの xyz というサブディレクトリに、 Main.class を置き、abcディレクトリの親ディレクトリ（ Main.class のあるディレクトリからは 2 つ上のディレクトリ）で、> java abc.xyz.Mainというコマンド を実行する必要がある。
javac コマンド も、java コマンド と同じやり方で、与えられた java のソースファイルをコンパイルするために必要なクラスファイルを探索する。例えば 、XXX.java というソースファイルの中で 、aaa.bbb.CCC というクラスが使われている場合、aaa というデ ィレクトリの bbb というサブデ ィレ
クトリの CCC.class というファイルを探す。クラスファイルが見付からなかった場合は、同じ場所で .java という拡張子を持つソースファイル（ CCC.java ）を見つけ、再帰的にコンパイルする。
foo.bar.Baz という完全修飾名を持つクラスをコンパイルするためには、Baz.java というソースファイルを、foo というデ ィレクトリの中の bar というデ ィレクトリに置き、> javac foo/bar/Baz.javaというコマンド でコンパイルする必要がある。
問 7.1.1 第 5 章で定義した、Point クラスを point というパッケージに ColorPoint クラスを point.extというパッケージに 入れ 、PointTest は無名パッケージのままにして、コンパイルし 、実行せよ。

7.1.3

CLASSPATH 環境変数

java や javac コマンド がユーザー定義のクラスファイルを探す場所は 、通常カレントデ ィレ ク
トリの下だが 、という環境変数で、クラスを探すデ ィレクトリを指定することができる。探すデ ィレクト リを複数指定する場合は 、セミコロン（ ; ）で区切る。また、java コマンド に-classpath というオプションを与えても同じ効果がある。例えば 、次のようにする。
> java -classpath .;C:\foo\bar;C:\aaa\bbb\ccc Baz
詳しくは java コマンド のマニュアルを参照すること。

7.1.4 パッケージ名の付け方の慣習
パッケージの名前を適当に付けたのでは、やはり衝突の可能性が出てくる。そこで Java では次のような約束ごとで、ド メイン名に基づいてパッケージ名をつけることにしている。
例えば example.com というド メイン名を持つ組織ではという接頭辞を持つパッケージ名を使用する。つまり、ド メイン名をコンポーネントごとに逆にした接頭辞を持つようにする。
それ以降のパッケージの階層名の規約は組織ごとに定めれば良い。ド メイン名にパッケージ名として使えない文字（ 例えばハイフン「 - 」）が入っている場合は、適宜アンダースコア「 _ 」を使用する。

7.2. JAR ファイルの作成

オブジェクト指向言語 – 第 7 章 p.3

7.1.5 パッケージとアクセス指定
パッケージは情報隠蔽の単位としても使用される。
public, private というアクセス指定は 、パッケージと関連はないが 、アクセス指定には他に 、protected と無指定（つまり、public, protected, private のいずれの指定もない場合）がある。
無指定のクラス、メソッド、フィールド は、からのみアクセス可能という意味になる。protected と指定されたメソッド やフィールドは、同一パッケージのコードとのコードからのみアクセス可能という意味に（他のパッケージに属するかもしれない）なる。
問 7.1.2 point.Point クラスの x や y などのフィールド を protected と指定し（あるいは無指定にし ）、さらに、point.ext.ColorPoint クラスや PointTest クラスのメソッドからこれらのフィールドに直接アクセスを試みて、protected と無アクセス指定の効果を確認せよ。

7.2 JAR ファイルの作成
複数個の Java のクラスファイル（と、場合によってはそこから使用する画像や音声ファイルなど ）を、一つにまとめてアーカイブにして扱うことができる。Java は JAR 形式というファイル形式を用いる。JAR 形式の拡張子はである。というコマンド を用いる。例えばカレントデ ィレクトリ以下のすJAR ファイルの作成には 、べてのファイルを親デ ィレクトリの nantoka.jar という JAR ファイルにまとめるには、以下のようにする。
> jar -cvf ../nantoka.jar .

JAR 形式は実は ZIP 形式そのものなので、拡張子を .zip に書き換えると、標準的な解凍ツールで中身を見ることができる。ただし 、META-INF/というディレクトリ内には、jar コマンドが作成するメタ情報が格納されている。
JAR ファイルは CLASSPATH 環境変数や java コマンド や javac コマンド の-classpath オプションの中にデ ィレクトリと同じように指定することができる。例えば 、> java -classpath .;nantoka.jar XXXのようにする。
アプレットの場合は、applet タグの archive という属性で、使用する JAR ファイルを指定することができる。複数の JAR ファイルを指定するときは、コンマ (,) で区切る。例えば 、<applet code="XXX.class" width="150" height="50"
archive="nantoka.jar,kantoka.jar"></applet>のように書くことができる。
問 7.2.1 point.Point クラスと point.ext.ColorPoint クラスを JAR ファイルにアーカイブし 、java
コマンド の-classpath オプションでこの JAR ファイルを指定して PointTest クラスを実行せよ。
キーワード パッケージ、package 宣言、無名パッケージ、CLASSPATH 環境変数、-classpath オ
プション 、protected, JAR 形式、jar コマンド、archive 属性