PHPやJavaScriptを触ったことのある方は、恐らくJavaで最も不便に感じるものとして”import”を挙げるのではないでしょうか?
私自身もPHPから入っているため、Javaの学習時に最も煩わしく感じていました。
そこで今回はJavaの基本ルールでもあるクラスライブラリのインポートについて解説してみたいと思います。
これを読んでインポートについて理解してもらえたら非常に嬉しく思いますので最後までお付き合いください。
Javaでプログラムを組む時に知っておくべき事
冒頭でも触れましたが、PHPなどと比べJavaは宣言やルールが細かく設定されています。
これが他の言語(C言語等、更に難しい言語もありますが…)に比べJavaがとっつきにくい原因でもあります。
まず、Javaでクラスを使う際には必ずと言っていいほど”import”作業が発生します。
このクラスライブラリには様々なものがありますが、ざっと思いつくものをいくつか以下に挙げてみます。
基本クラス:java.lang
アクセス:java.io, java.nio, java.net
演算:java.math
グラフィックス:java.awt, javax.swing
テキスト:java.text
イメージ:java.awt.image, javax.imageio
セキュリティ:java.security, javax.crypto
データベース:java.sql
スクリプト:java.script
アプレット:java.applet
JavaBeans:java.beans
パッケージの使用
これらのパッケージを使用する為にはファイルの先頭で以下の構文を使って記述します。
import パッケージ名.クラス名;
パッケージ宣言と呼ばれるもので、他のサイトのサンプルコードでもよく見かけると思います。
Javaには大きく分けて”Java.lang”、”java.util”、”java.net”、”java.io”、”java.awt”の5つがあり、上記でリストとして記載したものもこのどれかに属します。
例外
全てのパッケージは宣言する必要が有るわけではなく、中には宣言無しで利用できるものもあります。
それが”java.lang”パッケージです。
これに属しているものは宣言無し(importする必要がない)で使用することが出来るため、”String”や”int”といったクラスは「クラス名 変数 = new クラス名();」のように記述すれば利用できるわけです。
importのルール
importにはファイル先頭で宣言するだけでなく、他にもいくつかのルールが存在します。
重複させない
まず一つ目のルールは「同じようなパッケージクラス名は重複させない」ということです。
次のコードを見てください。
import makeA.PackageSample; import makeB.PackageSample; public class Sample{ public static void main(String[] args) { } }
このコードでは、”makeA”というパッケージと”makeB”というパッケージ内にそれぞれ”PackageSample”というクラスがあり、そのクラスを使用する為にそれぞれのパッケージをインポートしています。
しかしこの記述はエラーが返されます。
ファイル先頭で宣言する
これは先ほども説明しましたが、パッケージ宣言はファイル先頭で宣言するようにしてください。
またわかりやすく記述することを心掛けてください。
例えば自作パッケージ”makepack”内のクラス”A”、”B”、”C”をimportする場合、次のように記述した方が他の開発者が見た場合にどのパッケージを使っているかが分かりやすくなります。
-- 良い例 -- import java.util.Calender; import java.util.List; import java.util.ArrayList; import java.util.LinkedList; import make.A; import make.B; import make.C; public class Sample{ public static void main(String[] args) { } } -- 悪い例 -- import java.util.Calender; import make.A; import java.util.List; import java.util.ArrayList; import make.B; import java.util.LinkedList; import make.C; public class Sample{ public static void main(String[] args) { } }
悪い例でもエラーとはなりませんが、他の開発者が見た時に非常にわかり難いため、同じパッケージは揃えて記述することが望ましいです。
オンデマンドインポート
アスタリスクを使用することで、クラス名を記述することなくパッケージ全体をimport出来ます。
またこの方法を使用してパッケージ全体をインポートしたとしても、これが原因で要領が肥大化するといったことはありません。
しかし、近年ではコード内で利用しているクラスを明確にすることが慣例となってきていますので、できるだけオンデマンドインポートは利用しない方が良いとされています。
Javaを学習中の方はロジックを知る為にも出来る限りアスタリスクは使わず、全て記述するように心がけましょう。
因みに、アスタリスクを使った記述方法は以下の通りです。
import java.util.*; public class Sample{ public static void main(String[] args) { } }
importの概念を捨てる
今までの解説では既存のパッケージとクラスについて説明してきましたが、クラスを自作するために、もう少しimportについての説明をします。
Javaでは”import”とは”読み込ませるという行為”といて捉えるのではなく”パッケージを含む冗長なクラス名を省略して記述する行為”と捉えた方が良いかもしれません。
例えば、先ほど使用するクラスを予めファイルの先頭でimportしないとエラーとなると説明しましたが、厳密にはエラーを回避させて記述する方法もあります。
次のコードを見てください。
package sample; public class TrimSample { public static void main(String[] args) { java.util.Calendar cl = java.util.Calendar.getInstance(); System.out.println("YEAR:" + cl.get(java.util.Calendar.YEAR)); } }
実行結果
YEAR:2019
このコードではimportでパッケージ宣言を敢えて行わずにコードを記述していますが、特にエラーが返されることなく動作しています。
クラス名を「完全限定名」で指定し記述すれば、実は特にimportする必要はないというわけです。
しかし、これを毎回記述するのは面倒すぎるため、ファイル先頭で一度「このパッケージのこのクラスを使用します!」と宣言することで、プログラムに理解させているのです。
これは変数の初期化などと一緒で、Javaの基本ルールに則った方法と言えます。
このように考えるとその他のロジックも意外と簡単に理解できるかも知れません。
まとめ
いかがでしたか?
今回は”import”についてわかりやすく解説してみました。
“import”という単語だけで理解しようとするとどうしてもその意味から、読み込みということを前提に考えてしまうと思いますが、プログラムというのは他の角度から見るとわかりやすいこともあったりします。
この記事を読んで様々な角度から考えられるように訓練してもらえると非常に嬉しいです。