10章 パッケージ
1.パッケージとは
 パッケージとはクラスやインターフェースをひとまとめにしたものである。 
 例えば、ファイルが多くなってくると同じカテゴリのファイルは新しいフォルダを作成してそこに移動して、ファイルを整理する。Javaでも同じようなことができる。つまり、同じカテゴリのクラスやインターフェースは1つのパッケージにしている。
 ディレクトリと同じように、パッケージを階層構造にすることもできる。
 Javaでは標準で様々なクラスが用意されているが、これらも機能のカテゴリごとに分類され、パッケージ化されている。例えば、ネットワーク関係のクラスは「java.net」というパッケージに各クラスがしまわれている。これは、「java」パッケージという意味になる。そのほかにも「java.util」、「java.lang」など多くのパッケージが用意されている。
パッケージ  解説
java.lang Javaの中核を成す機能を担うクラス群
java.util ユーティリティ機能を提供するパッケージ
java.net ネットワーク機能を提供するパッケージ
java.io 入出力機能を提供するパッケージ
java.awt Javaの基本的なGUI機能(AWT:Abstract Window Toolkit)を提供するパッケージ
java.awt.event AWTの中でもイベントの機能(ボタンが押された場合など)を提供するパッケージ
 
2.パッケージの宣言 
 あるクラスをあるパッケージに格納するためにはいくつかの手続きが必要になる。一つ目はjavaファイルにパッケージ名を格納すること、二つ目はパッケージ名と同じディレクトリをつくり、そこにjavaファイルを格納することである。
1)Javaファイル(ソースファイル)の最初に
package packageName 
と記述する。 
packageNameはパッケージ名をあらわし、例えば下記のように記述する。
// entertainmentパッケージとして定義
package entertainment
// entertainmentパッケージの中のTVパッケージとして定義
package entertainment.TV
2)ディレクトリ
 パッケージ構成と同じディレクトリを構成する必要がある。つまり、上の例ではentertainmentパッケージとしたjavaファイルは、「entertainment」というディレクトリの中に格納する必要があり、entertainment.TVパッケージとしたjavaファイルは、「entertainment\TV」というディレクトリの中に格納する必要がある。
3)パッケージの指定 
 異なるパッケージのクラスを指定する場合は、「パッケージ名.クラス名」として参照する。詳しくは下記の例を参照。
4)例  
PackageDemo.java

public class PackageDemo{
    public static void main(String args[ ] ){
     // パッケージ内のクラスを参照する場合は「パッケージ名.クラス名」として参照する
        testPackage.A a = new testPackage.A( );
        testPackage.B b = new testPackage.B( );
        a.a1( );
        b.b1( );
     }
}
   

testPackage\A.java

// testPackageパッケージとして定義
package testPackage;

public class A{
     public void a1( ){
          System.out.println("a1");
     }
}
   

testPackage\B.java

// testPackageパッケージとして定義
package testPackage;

public class B{
  public void b1( ){

          System.out.println("b1");
     }
}
   

C:\java>javac PackageDemo.java

C:\java>java PackageDemo

a1
b1

C:\java>

 
3.クラスパス
 「entertainment.TV」というクラスを指定した場合、javaは以下のような場所を探す。
 1.カレントディレクトリの中の「entertainment」ディレクトリの中のTV.class
 2.Javaが標準で用意されているクラス郡の「entertainment」パッケージの中のTV.class
 しかし、これだけでは、自分で部品として使えるようにしたクラス群をパッケージとして作成した場合や、便利なパッケージをダウンロードしてきた場合、いちいち自分がこれから作ろうとするディレクトリにすべてコピーしなくてはならなくなる。これでは不便なので、一度部品として切り分けられるようにして作ったパッケージは、ある特定のディレクトリにおいておき、これを指定しておけば、いろいろなプログラムからそのパッケージをいつでも参照することができる。その設定がクラスパスである。
C:\java>set classpath=c:\java\mypackage;c:java\downloadpackage

C:\java>set classpath
CLASSPATH=c:\java\mypackage;c\java\downloadpackage

C:\java>

 クラスパスはUNIXやWindowsでは環境変数で設定する。
 このように設定すると、javaは
 1.カレントディレクトリの中の「entertainment」ディレクトリの中のTV.class
 2.c:\mypackage\entertainment\TV.class
 3.c:\downloadpackage\entertainment\TV.class
 4.Javaが標準で用意されているクラス郡の「entertainment」パッケージの中のTV.class
という手順でTV.classを探しに行く。
 
4.import
 testPackageパッケージ内のAクラスを指定するのに「testPackage.A」と記述した。このように「パッケージ.クラス名」と指定する方法を完全修飾名を指定するという。
 しかし、この方法は、わざわざパッケージを名をしてしなければならないので面倒である。そこで、あらかじめ「testPackage」を使うとJavaに指定してやれば、わざわざ完全修飾名で指定しなくてもすむ。つまり、C言語でいう「#include」のようなものである。Javaでは「#include」ではなく「import」というステートメントを使用する。
 importはjavaファイルのはじめに記述し、そのjava内で使用するクラスをimportの後に、「パッケージ名.クラス名」の形式で宣言する。そのパッケージ内のすべてのクラスを宣言したい場合は、クラス名を「*」として指定する。まだ、複数のパッケージを指定することもでき、その場合はimport行を何行も列挙する。
 以下に例を示す。左側は完全修飾名を指定して記述した場合で、右側はimportを使用して、使用するパッケージを宣言した例である。以下の二つの例は同じになる。
PackageDemo.java

public class PackageDemo{
    public static void main(String args[ ] ){
     // 完全修飾名
          testPackage.A a = new testPackage.A( );
          testPackage.B b = new testPackage.B( );
          a.a1( );
          b.b1( );
      }
}
   

PackageDemo.java

import testPackage.*;

public class PackageDemo{
     public static void main( String args[ ] ) {
     // 完全修飾名
          A a = new A( );
          B b = new B( );
          a.a1( );
          b.b1( );
      }
}

testPackage\B.java

// testPackageパッケージとして定義
package testPackage;

public class B{
  public void b1( ){
              System.out.println("b1");
     }
}
   

C:\java>javac PackageDemo.java

C:\java>java PackageDemo
a1
b1

C:\java>