パッケージとは、小包などの意味で理解しておくとわかりやすいでしょう。
小包の中身が全く同じでも、その小包の名前が違っていれば区別することができます。
JAVAの場合は、まったく同じ名前を持ったクラスを、それぞれ別のパッケージに入れておけば、それぞれを区別して使うことができる、という仕組みです。
下記はパッケージを作っているサンプルコードです。
package calc;
calcというのがパッケージ名で、好きな名前を半角英数文字を使ってつけます。
ただ、このコードだけでは、パッケージの名前をつけているだけで、中身のないファイルになってしまうので、次にクラスを追加してみます。
package calc;
public class Cal {
public int sum(int i, int j){
return i + j;
}
}
public class sample {
public static void main(String[] args) {
Cal cal = new Cal();
System.out.println(cal.sum(1, 2));
}
}
このファイル(sample.java)をコンパイルすると、下記の2つができあがります。
・calcパッケージのCalクラス(Cal.class)
・calcパッケージのsampleクラス(sample.class)
パッケージ化されたクラスは、パッケージ名と同じディレクトリを作ってそこにおく必要があります。
この場合だと「calc」というディレクトリにおく必要があるということです。
もう1つ下記のようなパッケージを作ってみます。
paclage calc2;
public class Cal {
public int sum(int i, int j){
return i – j;
}
}
public class sample{
public static void main(String[] args) {
Cal cal = new Cal();
System.out.println(cal.sum(1, 2));
}
}
このファイルも先ほどと同じ「sample.java」というファイル名で作りますが、パッケージ名が「calc2」ですので、ディレクトリも「calc2」をつくってそこに置き、コンパイルします。
先ほどと同じように、
・calc2パッケージのCalクラス(Cal.class)
・calc2パッケージのsampleクラス(sample.class)
ができ、
「calcパッケージ」にも「calc2」パッケージにも同じsample.classがありますが、パッケージが違うので2つは区別されます。
ディレクトリが違うので当然といえば当然ですが、パッケージの役目はこれだけではありません。
パッケージ化するということは、クラスファイルをそれぞれディレクトリごとに分けて保存しておくことができます。
一度パッケージ化したクラスファイルを作ってしまえば、どのプログラムからでも下記のように指定すればそのクラスを参照できます。
パッケージ名.クラス名
calcパッケージの「Cal」クラスを参照する場合、下記のようになります。
calc.Cal cal = new calc.Cal();
ただ、パッケージに所属しているクラスを使うたびに「パッケージ名.クラス名」のセットを記述するのはめんどうです。
そんなときに使うのがimportです。
下記のように下記ます。
import calc.Cal;
これをプログラムの最初に書いておくと、calcパッケージのCalクラスをインポートしてくれます。
また、パッケージの中に複数のクラスがあり、それをすべてインポートしたい場合にはワイルドカードの意味を持つ「*」を使い下記のように書きます。
import calc.*;
これでcalcパッケージのすべてのクラスをインポートできました。
ただし、先ほどのように「calc」パッケージと「calc2」パッケージが「Cal」という同じクラス名を持っていて、下記のようにインポートを行、Calクラスを参照したとします。
import calc.*;
import calc2.*;
public class sample {
public static void main(String[] args) {
Cal cal = new Cal();
・・・・・・・・
}
}
この内容でコンパイルを行うとエラーになってしまい、インポートしていても、使いたいほうのパッケージ名を「calc.Cal cal = new calc.Cal();」と指定しなければいけません。