パッケージ
オブジェクト指向でプログラミングをしていくと、どんどんとクラスが増えてきたりします。それらを纏め、パッケージとして大きく機能別に分けたりする事でソースコードのメンテ性を上げたり、可読性を上げたりし部品化していきます。
例えば、一番分かりやすい例で言うと、
Exception in thread "main" java.lang.NoSuchMethodError: main
というふうに、コンパイルしてクラスを作るときにmainメソッドがなかったりするとエラーが表示されます。このときの、java.langというのがNoSuchMethodErrorクラス属するパッケージなんです。
- クラスをパッケージに収めてみる。
pakage unko; // パッケージunkoに収めてみる pakage unko.aho // unkoパッケージのahoサブパッケージに収めてみる public class HogeUnko{ ・・・ }
このようにパッケージに収めていく事ができます。そしてルールとしてもう一つ大事な点は、パッケージ構造がディレクトリ構造とマッチする事です。上記のHogeUnkoクラスが収まるのは、「unko/aho/HogeUnko.class」になるわけです。windows上ではなかなか視覚的に意識しなかったりしますがservlet作ったりするときによく分かります。
- パッケージに属するクラスを利用してみる
パッケージに所属させる方法は上記の通り指定します。では、別のパッケージに属しているクラスで、このパッケージのクラスを呼び出すためには、どうするかというと以下の通り記述します。
import unko.aho.HogeUnko;
このように、「import」で宣言します。この宣言がないとコンパイル時にクラスがないよーってエラーを吐いてコンパイルを中断します。Javaの標準APIを使うときは以下のように記述したりしますね。
import java.awt.*; import java.awt.event.*; import java.swing.*; import java.io.*;
こうやって他のパッケージから呼び出したり、パッケージ化したりする事でクラスを機能別に分けたりしてうまく纏めていくのですが、ここで一つ難しい事が。上記の例のようにいろいろパッケージを作り別のクラスで呼ぶときなど、きちんとクラスパスを通さないとコンパイルエラーになります。
javaのコマンドオプションで「-cp」を使いクラスパスの指定をしないといけません。パッケージルート以外の任意のディレクトリからパッケージに属するクラスをプログラムとして実行するときには必要です。
java -cp [パッケージルート(ex. ../lib)] [パッケージに属するクラス名(ex. unko.aho.HogeUnko)]
そのほかにもパッケージを呼ぶ方法があります。
パッケージに属するクラスをjarファイルに纏めて、javaをinstallした指定の場所に置くとそれらのクラスを利用する事ができいちいちクラスパスを気にしないで済みます。この方法についてはおいおい説明していきたいと思います。