パッケージの利用
Javaではプログラムをクラスという単位で扱うので、クラスの管理をしっかりしておく必要があります。
多くのクラスを使用しやすくするためには、目的ごとに整理して管理しておきます。
インターフェースも1つのクラスと考えます。これらクラスやインターフェースを整理する方法がパッケージです。
例えば、会社内で顧客管理や販売管理といった営業業務にかかわるプログラムと社内の社内人事の勤怠管理を扱うプログラムがあったとします。
これらがごちゃごちゃあると煩雑になりますね。
これらを営業用のパッケージと、社内人事用のパッケージにそれぞれ分けて整理しておくと、使用する時に簡単に見つけることができます。
つまりパッケージは簡単に言うと、目的別にまとめたクラスの入れ物と考えてよいでしょう。
このようにクラスをパッケージ別に管理することをパッケージ化と言います。
パッケージ化するとクラス名の衝突を防ぐことができます。
例えば下図のように、Humanというクラスが2つ存在していたとします。
パッケージ化していないとHumanというクラスは1つしか作れませんが、パッケージ化しておくと、AパッケージのHumanクラスとBパッケージのHumanクラスといった具合に、パッケージが異なれば、同じ名前でクラスを作ることも可能です。
クラスは自作クラス以外に、Stringクラスのように、Javaで提供されているクラスも多く存在します。
それらも、パッケージで提供されています。
Javaがインストールされているディレクトリ内にjre\lib\rt.jarというファイルがあります。
このファイルはjarという拡張子を持ちます。
このrt.jarファイルをデスクトップなどにコピーし、拡張子をzipに変えて、展開をすると、標準クラスライブラリを見ることができます。
Stringクラスは、java.langというパッケージに入っていることを表します。
クラス単体の名前はStringですが、パッケージ名を含めた名前をクラスの完全修飾名と言います。
また、パッケージには互いに関連するクラスやインターフェースをまとめるためにも利用されています。
例えばJavaで提供されているクラスはjavaというパッケージの中に入っています。
その中でもGUIに関するものはawtパッケージ、入出力に関するものはioパッケージ、ネットワークに関するものはnetパッケージなどと、「サブパッケージ」を作って管理します。
関連するクラス同士を同じパッケージに格納しておく事で、利用する側にとってクラスを的確に利用でき、また検索しやすくなります。
Javaで提供されているクラスでも、java.awtパッケージとjava.utilパッケージの両方にListクラスがあります(正確にはjava.util.Listはインターフェースです)。
このように、クラス名が重なることはよくあることです。
javadocの左下のフレームにはすべてのクラス名が並んでいるので、どのようなものがあるか見てみるのも良いでしょう。
【パッケージ内のクラスの使用】
public class UseDate{ public static void main(String[ ] args){ java.util.Date date = new java.util.Date( ); System.out.println(date); } }
実行結果
Wed Aug 05 14:48:24 JST 2020
java.util.Dateクラスは日付を表します。
オブジェクトをnewすると、その時の日付と時間を持ちます。
このようにクラスはパッケージに格納されているので、完全修飾名で指定します。
しかし、毎回これを書くのは作業量的に大きくなってしまいます。
そこでパッケージ名を省略して記述することが出来るようになっています。パッケージ名を省略したい場合は「import文」を書きます。
ポイント!import
ソースの先頭に
import クラス名;
と書くだけです。そのパッケージ内のすべてのクラスを使いたいときは
import パッケージ名.*;
と書くこともできます(この場合、importされるのはpublicなクラスだけです)。import パッケージ名.クラス名 ;
import パッケージ名.*;
を行った場合、パッケージ名を省略できるのは指定したパッケージ内にあるクラスなどのみです。パッケージ名の中に更に別のパッケージ(例えばAという名のパッケージ)が存在した場合、そのAパッケージ内のクラスを利用する際には、完全修飾名を記述する必要があります。
【import文によるクラスの使用】
import java.util.*; public class UseDate2{ public static void main(String[ ] args){ Date date = new Date( ); System.out.println(date); } }
実行結果
Wed Aug 05 14:55:08 JST 2020
import文を記述していますのでjava.util.Dateという完全修飾名ではなく、単にクラス名Dateで使用できます。
実際にはimport文が何行か最初に記述されるのがよく見られるパターンです。
ポイント!Eclipseの補完機能
Eclipseを使うと、必要なimport文の記述がない場合には、赤い波線をマウスでポイントすると解決策を提示してくれます。
パッケージの作成
パッケージを作るときは実際にディレクトリを作り、単にその中にファイルを入れていきます。
そして、ソースコードの1行目にpackage文を書き、ディレクトリ構成を記述します。
package パッケージ名;
自分でパッケージを作成する際、他のアプリケーションとパッケージ名が重なると問題があります。
パッケージ名が同じであったために、クラスが上書きされてしまうかも知れないからです。
そこでJavaではインターネットなどで利用されるドメイン名と同じ考え方を使って重複しないように気をつけます。
例えばphoeducation.co.jpというドメイン名を持つ団体であれば、そのドメイン名を後ろから見た名前jp.co.phoeducationというパッケージを作り、利用します。
ドメイン名は世界に1つの名前ですので、ドメイン名を利用すれば、他と名前が重複する可能性は非常に小さくなります。
このドメイン名を利用した方法は1つのルールであり、決して守らなければならないというものではありません。
ドメインを有していない場合は、重複しないよう工夫して名前をつけて頂ければ結構です。
*ポイント!Eclipseでパッケージを作るには
パッケージエクスプローラのsrcフォルダを選択して[ファイル]→[新規]→[パッケージ]
(もしくは右クリック→[新規]→[パッケージ])を選択して、パッケージを作成します。
【パッケージの作成と利用】
[mypackage]パッケージ内に、「MyObj」クラスを作成します。
package mypackage; public class MyObj{ public void foo( ){ System.out.println("mypackageのMyObjの機能が呼び出されました"); } }
[com.mirai]パッケージ内に、「UseMyObj」クラスを作成します。
package com.mirai; import mypackage.MyObj; public class UseMyObj { public static void main(String[ ] args){ MyObj obj = new MyObj( ); obj.foo( ); } }
実行結果
mypackageのMyObjの機能が呼び出されました
mypackageパッケージを作成し、その中にMyObjクラスを作成しています。
com.miraiパッケージにあるUseMyObjクラスからmypackageパッケージ内のMyObjクラスを実行するために、UseMyObjクラスに、import mypackage.MyObj;と記述することで、MyObjクラスを読み込むことができます。
Javaではクラス名やメソッド名などで識別するので、クラス名やパッケージ名をつける作業はとても重要です。
staticインポート
通常staticなメンバにアクセスする場合には、staticなメンバが存在するパッケージをインポートした後、「クラス名.staticメンバ名」でアクセスをする必要があります。
staticインポート機能を使用すると、「static import」に続けてパッケージ名やクラス名を指定することで、staticメンバを使用する時に、パッケージ名やクラス名を省略することができます。
staticインポートの構文は次の通りです。
import static パッケージ名.クラス名.*;
完全修飾名で指定されたクラスに定義されたすべてのstaticメンバをstatic importします。
【staticインポート機能を使用してstaticメンバにアクセスする】
package com.mirai; import static java.lang.Math.*; public class StaticImport { public static void main(String[] args) { int x = max(10,20); System.out.println("maxメソッドの戻り値は" + x); int y = min(10,20); System.out.println("minメソッドの戻り値は" + y); } }
実行結果
maxメソッドの戻り値は20 minメソッドの戻り値は10
java.lang.Mathクラスは、指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのメソッドを含んでいます。
Mathクラスのメソッドはそのほとんどがstaticなメソッドです。
複数のstaticメソッドを使用するには、import static java.lang.Math.*;
と指定をします。
5行目で指定しているmax()メソッドは2つの引数のうち大きい方を戻り値として返します。
8行目で指定しているmin()メソッドは2つの引数のうち小さい方を戻り値として返します。
javadocを確認しておくとよいでしょう。
まとめ
パッケージの利用
- パッケージ内のクラスは完全修飾名で用いることができます。
- import文を書くことによってパッケージ名を省略できます。
パッケージの作成
- パッケージはpackage文で宣言します。
- パッケージはpackage文で宣言します。
staticインポート機能
import static パッケージ名.クラス名.*;
と指定すると、staticなメンバにまとめてアクセスでき、パッケージ名、クラス名を省略できます。
参考図書
独学で挫折しそうになったら、オンラインプログラミングスクール