Java入門|インポートでクラスを簡単に使う

インポートを覚えると、別パッケージのクラスがぐっとすっきり書けるようになる

前回は、異なるパッケージにあるクラスを使うときには、パッケージ名を含めてクラス名を書く必要があることを学びました。これはJavaのしくみとしてとても大切で、どのパッケージにあるどのクラスを使っているのかをはっきり示すための書き方でした。

ただ、実際のプログラムでは、別パッケージのクラスを1つだけ使うとは限りません。たくさんのクラスを利用する場面では、毎回長いパッケージ名を書き続けるのは少し手間がかかりますし、コードの見通しも少し悪くなります。そこで役立つのが、import 文です。

import を使うと、別パッケージのクラスをあらかじめ読み込んでおけるので、コードの中ではパッケージ名を毎回書かずに、クラス名だけで使えるようになります。今回は、ドラゴンボールの世界をイメージしたクラスを使いながら、import の基本的な考え方と使い方をやさしく整理していきましょう。

インポートとは何か

Javaで別のパッケージにあるクラスを使うとき、何も準備をしなければ、クラス名の前にパッケージ名をつけて書く必要があります。

たとえば、pc パッケージにある Fighter クラスを使うなら、次のように書く形です。

pc.Fighter fighter1 = new pc.Fighter();

この書き方は正しいのですが、毎回 pc.Fighter と書くことになります。
クラスを1回だけ使うならそれほど気にならなくても、何度も出てくると少し見づらくなってきます。

そこで、ファイルの先頭に import 文を書いておくと、そのクラスをこのファイルで使います、ということを先に宣言できます。すると、その後はクラス名だけで書けるようになります。

インポートの基本の書き方

インポートの基本の書き方はとてもシンプルです。

import パッケージ名.クラス名;

たとえば、pc パッケージにある Fighter クラスを読み込みたいなら、次のように書きます。

import pc.Fighter;

こうしておけば、そのファイルの中では Fighter とだけ書いて利用できます。

インポートを使うと何が便利になるのか

import の便利さは、主に次のようなところにあります。

使わない場合使う場合
毎回 パッケージ名.クラス名 と書くクラス名だけで書ける
記述が長くなりやすいコードがすっきりする
同じクラスを何度も使うと見づらい読みやすくなる
書き間違いが増えやすい記述の負担が減る

つまり、import はコードを短くするためだけではなく、読みやすく、整理しやすくするための仕組みでもあります。

まずは import を使わない場合を確認しよう

import を使わない場合、異なるパッケージのクラスは、パッケージ名を含めて書く必要があります。
たとえば、pb パッケージにあるクラスから、pc パッケージの Fighter クラスを使うなら、こんな形になります。

pc.Fighter fighter1 = new pc.Fighter();

この書き方自体はまったく問題ありません。
Javaとしても、どこの Fighter クラスなのかがはっきりしているので、正しく理解できます。

ただし、同じ Fighter クラスを何回も使うと、そのたびに pc.Fighter と書くことになり、コードが少し重たく見えてきます。

import を使うとどう変わるのか

ファイルの先頭で Fighter クラスを import しておくと、その後は Fighter だけで使えます。

import pc.Fighter;

この1行を書いておけば、コードの中では次のように書けます。

Fighter fighter1 = new Fighter();

この変化はとても大きいです。
使っているクラスそのものに意識を向けやすくなり、パッケージ名の長さに引っ張られずにコードを読めるようになります。

今回の例で使う考え方

今回は、pb パッケージに属する Sample6 クラスから、pc パッケージにある Fighter クラスを使う場面を考えます。

ここで前提になるのは、pc パッケージ側にある Fighter クラスが、別パッケージから使えるように public で宣言されていることです。
異なるパッケージから使うには、この条件が必要でしたね。

そのうえで、Sample6.java では import pc.Fighter; と書くことで、Fighter クラスを読み込みます。すると、main メソッドの中では Fighter というクラス名だけで使えるようになります。

サンプルプログラム:import の確認

ファイル名:Sample6.java

package pb;

import pc.Fighter;

class Sample6 {
    public static void main(String[] args) {
        Fighter fighter1 = new Fighter();
        fighter1.show();
    }
}

このプログラムのポイント

このコードで注目したいのは、ファイルの先頭にある次の1行です。

import pc.Fighter;

この指定によって、pc パッケージにある Fighter クラスを、このファイルで使えるようにしています。
そのため、main メソッドの中では、

Fighter fighter1 = new Fighter();

と書くだけでよくなっています。

もし import がなければ、ここは

pc.Fighter fighter1 = new pc.Fighter();

のように書かなければなりません。
import があることで、コードがかなりすっきりしていますね。

実行結果のイメージ

pc パッケージ側の Fighter クラスが、たとえばコンストラクタで初期メッセージを表示し、show メソッドで現在の状態を表示するように作られているとします。すると、Sample6 を実行したときには、たとえば次のような表示になります。

戦士を準備しました。
戦士名は未設定です。
戦闘力は0です。

ここで大事なのは表示内容そのものよりも、別パッケージのクラスを、import によってシンプルに使えていることです。

import 文はどこに書くのか

import は、ファイルの先頭付近に書きます。
順番としては、まず package 文があり、そのあとに import 文を書きます。

今回の Sample6.java でも、次の順序になっています。

順番内容
1package pb;
2import pc.Fighter;
3クラス定義

この順番はとても大切です。
package 文の前に import を書くことはできませんし、クラス定義の途中に書くこともできません。

package 文と import 文の役割の違い

ここは混同しやすいところなので、表で整理しておきましょう。

役割
package 文このファイルのクラスがどのパッケージに属するかを決める
import 文別のパッケージのクラスを使いやすくする
クラス定義実際の処理内容を書く

つまり、

  • package は自分の住所を決めるもの
  • import は使いたい相手を読み込むもの

と考えると、とてもわかりやすいです。

import を使ってもクラスの所属は変わらない

ここも大事なポイントです。
import を書いたからといって、読み込んだクラスが自分のパッケージに移動してくるわけではありません。

今回の例では、Fighter クラスはあくまで pc パッケージのクラス です。
Sample6 クラスは pb パッケージのクラス です。

import pc.Fighter; と書くことで、pb パッケージの Sample6 から pc パッケージの Fighter を使いやすくしているだけです。
所属そのものは変わりません。

この関係を整理すると、こうなります。

クラス名所属パッケージ
Fighterpc
Sample6pb

import は、別のパッケージのクラスを見えやすくする仕組みであって、クラスの所属先を変更する仕組みではないのです。

import があるとコードが読みやすくなる理由

import を使うと、コードの中で注目したい情報が見えやすくなります。
たとえば、次の2つを見比べてみてください。

import を使わない書き方

pc.Fighter fighter1 = new pc.Fighter();
fighter1.show();

import を使う書き方

Fighter fighter1 = new Fighter();
fighter1.show();

後者のほうが、処理の流れがすっと目に入ってきます。
もちろん、どこの Fighter クラスなのかという情報も大切ですが、それはファイル先頭の import 文を見ればわかります。

このように、詳細な情報は先頭にまとめ、処理本体は読みやすく保つのが import のよさです。

インポートの考え方を図で整理する

この図では、左側に pc パッケージ、その中に Fighter クラスがあり、右側に pb パッケージ、その中に Sample6 クラスが配置されています。
そして、pc パッケージから pb パッケージへ向かう矢印に import pc.Fighter; と書くことで、Sample6 が Fighter クラスを読み込んでいることを表しています。

さらに、Sample6 クラスの中には Fighter fighter1 = new Fighter(); と書かれていて、コード中ではパッケージ名を省略して使えていることがわかります。
この図を見ると、import の役割がかなりはっきり見えてきます。

import を使うときに気をつけたいこと

便利な import ですが、いくつか意識しておきたい点もあります。

注意点内容
import しても public でなければ使えないことがある別パッケージから使えるクラスである必要がある
import は package 文のあとに書く順序を間違えない
import しても所属パッケージは変わらないあくまで使いやすくするだけ
同名クラスが複数あるときは注意が必要どのクラスを使うか混乱しやすい

特に最後の点は今後大切になります。
たとえば pa.Fighter と pc.Fighter の両方がある場合、単純に Fighter と書いただけでは、どちらを使いたいのかが問題になることがあります。そんな場面では、あえてパッケージ名つきで書くほうがわかりやすいこともあります。

import とパッケージ名つき記述の使い分け

ここで、2つの書き方を整理しておきましょう。

書き方特徴
パッケージ名つきで書くpc.Fighter fighter1 = new pc.Fighter();どのクラスか明確
import してクラス名だけで書くFighter fighter1 = new Fighter();コードがすっきりする

どちらも正しい書き方です。
Javaでは、場面に応じて読みやすいほうを選ぶことが大切です。

ただ、同じクラスを何度も使うなら、import の便利さはとても大きいです。
コード全体の見通しがよくなり、処理の流れに集中しやすくなります。

ここまでで押さえたいこと

今回の内容で、特に大事なのは次の点です。

大事なポイント内容
import を使うと別パッケージのクラスを読み込めるファイル先頭で指定する
import 後はクラス名だけで使えるパッケージ名を毎回書かなくてよい
package 文と import 文は役割が違うpackage は所属、import は利用準備
import してもクラスの所属先は変わらない使いやすくなるだけ
コードが読みやすくなる長い記述を減らせる

import は、Javaの文法の中でもとても実用的な機能です。
大きなプログラムになればなるほど、その便利さを実感しやすくなります。

異なるパッケージのクラスをそのまま使う方法を知ったうえで、さらに import を覚えると、コードの整理のしかたが一段と上手になります。ここまでの流れをひとつずつ積み重ねていくと、Javaで大きめのプログラムを扱う感覚がしっかり育っていきます。