ここまで説明したimport文は、「単一型インポート」と呼ばれるもので、1つのクラスやインターフェイスをインポートする場合に使うものでした。同じパッケージに含まれる複数のクラスをインポートしたい場合には、「オンデマンドインポート」を使います。この方法では、具体的な型を指定する代わりに「*」を指定します。これにより、指定したパッケージに含まれるクラスについて、パッケージ名を省略できるようになります。
ただし、オンデマンドインポートをすると、使用している各クラスがどのパッケージのものか判断しにくくなるので、実際の開発現場ではあまり使われませんが、ちょっとした動作確認したいサンプルコードを書く場合などには重宝するので、覚えておきましょう。
import java.util.*;
この指定は、パッケージ単位で行う必要があります。例えば、Javaには、java.utilパッケージとjava.util.concurrentパッケージというパッケージがあります。パッケージ名からすると、java.util.concurrentパッケージに含まれるクラスは、java.utilパッケージに含まれそうな気もしますが、別のパッケージなので、オンデマンドインポートをするときは、次のように別々に指定が必要です。
import java.util.*; import java.util.concurrent.*;
試しに、java.utilパッケージのクラスであるjava.util.LinkedListクラスと、「java.util.concurrent」パッケージのクラスである「java.util.concurrent.LinkedBlockingDeque」を使うクラスを作成してみましょう。使うといっても、クラスを参照するだけです。
package sample; import java.util.*; public class ImportSample { LinkedList list = new LinkedList(); LinkedBlockingDeque e = new LinkedBlockingDeque(); }
LinkedListクラスの方は、オンデマンドインポートによりクラス名だけで利用できるようになっていますが、LinkedBlockingDequeクラスの方はパッケージが分からないため、エラーとなるはずです。次のように直すことにより、エラーは消えます。
package sample; import java.util.*; import java.util.concurrent.*; public class ImportSample { LinkedList list = new LinkedList(); LinkedBlockingDeque e = new LinkedBlockingDeque(); }
また、次のようなクラスも作成してみましょう。エラーが出ますが、なぜでしょう。
package sample; import java.awt.*; import java.util.*; public class ImportListSample { List list; }
これは、java.utilパッケージにもjava.awtパッケージにも「List」という名前の型が含まれているために問題が発生しているのです。java.util.Listとjava.awt.Listという型の両方を同時に使いたい場合は、パッケージ名も含めて指定する必要があります。
package sample; public class ImportListSample { java.awt.List awtList; java.util.List utilList; }
パッケージ名は、文字で始まり、その後に文字か数字を続けます。文字は「aからz」「AからZ」「アンダーバー(_)」のどれかです。実は「ドル($)」も使えますが、ちょっと特殊なので自分で作成するパッケージでは使いません。なお、予約語やリテラル値になるものは使えません。
パッケージ名の付け方としては、小文字で、インターネットのドメイン名を逆にしたものがよく使われます。例えば「atmarkit.co.jp」ドメインで利用するWebアプリケーションを作成する場合は、パッケージ名としてjp.co.atmarkitを採用すればよいということになります。
ちなみに、ドメイン名ではハイフン(-)が使われることがありますが、これはJavaのパッケージ名としては使えないので「アンダーバー(_)」に置き換えます。
例えば、「jp.co.atmarkit.Main」というプログラムを開発していたとしましょう。jp.co.atmarkit.Mainクラスでは、「jp.co.atmarkit.List」というクラスをインポートしていて、プログラム中ではListと書いたら、jp.co.atmarkit.Listのことになるようにしていました。ここへほかの人が開発した「org.sssg」パッケージのListクラスを利用することになったとしましょう。
パッケージという概念がなかったら、どうなるでしょうか。自分が開発したプログラムの名前がListで、ほかの人が開発したプログラムの名前がListだったとします。あるプログラム内で両方とも使いたい場合は、どちらかの名前を変更しないと利用できません。
しかし、Javaではパッケージという概念があるので、そんなことをしなくても、パッケージ名を含む名前で型を指定することにより、プログラムの名前をどちらも変更することなく利用できるのです。
今回は、パッケージについて解説をしました。パッケージは実用的なプログラムを作成するときには必ず使用するので、よく意味を理解しておきましょう。さらに、代表的なパッケージについて覚えておくと応用的なプログラムを作成するときに利用できそうなクラスを効率良く探すことができるようになります。
パッケージに含まれるクラスを利用するためにはimport文を使うことも説明しました。インポートでは、クラス名やインターフェイス名を指定する単一型インポートを使うのが基本です。ただし、オンデマンドインポートという方法で、パッケージに含まれる複数のクラスも簡単に利用できます。入門レベルではパッケージを使うことは少ないかもしれませんが、実際の開発では必ず使いますから、import文も必ず出てきます。よく覚えておきましょう。
実は、import文には「staticインポート」というものもありますが、今回は説明をしませんでした。「static」というキーワードに関する文法がいくつかあるので、それについて理解してからの方が分かりやすいからです。ということで、次回は、クラスで共用できるフィールドやメソッドを作成できるstaticキーワードについて説明をする予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
Copyright © ITmedia, Inc. All Rights Reserved.