インポート

目次
  • 解説
  • 1. インポートとは
  • 2. packageとimport
  • 3. アスタリスクによる指定は使わない
  • 4. import文を使わない場合
問題に挑戦!
進捗を変更する




解説

1. インポートとは


FirstStep.java」の構造をひととおり学習しましたので、少し機能を追加してみましょう。Javaが用意してくれているプログラムを利用して、実行された日時も出力するようにします。

(1)次のサンプルコードのようにmainメソッドの中身を書き換えてください。
    public static void main(String[] args) {
        System.out.println(LocalDateTime.now());
        System.out.println("Hello!");
    }

すると、LocalDateTimeのところに赤い波線が付きますね。これは、Javaの構文解析を行った際に「知らない名前」が出てきたことを示します。このままでは、LocalDateTimeがどんなものなのかわからないため、コンパイルして実行ファイルを作ることができません。

(2)赤い波線にマウスオーバーすると、エラーメッセージとともに「クイックフィックス」という青い文字が出てきますので、それをクリックしてください。
(3)表示される選択肢から「Import 'LocalDateTime' (java.time)」を選択してください。

これによって次のプログラムコードがpackage宣言~クラス宣言の間に追加されました。

import java.time.LocalDateTime;
(4)ctrl+s / command+s」で保存したら、「F5」を押して実行してください。

ちょっと見慣れない形式ですが、「Hello!」の前に日時の情報が出力されるようになりました!

import文が追加されたことによって、LocalDateTimeは「java.time」というパッケージの中にあるということがわかるようになり、コンパイルと実行が可能となりました。

import文では、パッケージ名とクラス名をピリオドで繋ぐクラスのフルネームを指定します。このフルネームを完全限定名と呼びます。

このように、import文により他のクラスを利用できるようにすることが、インポートという仕組みです。

2. packageとimport


インポートしたプログラムがプロジェクト内に含まれない場合は、あらかじめ実行ファイルと同じ場所に用意しておく必要があります。Javaのプログラムの場合は、よく使う基本的な実行ファイルをJRE(Java Runtime Environment)という形でまとめてあり、あなたのパソコンへは、環境設定コースにおいてJDK(Java Development Kit) をインストールした際に一緒にインストールされています。今回使用した「LocalDateTime」も、そのJREの中に入っています。

では、同じプロジェクト内でのインポートについて確認しながら、ここまでの振り返りも兼ねて、以降の学習で役に立つクラスメソッドを別パッケージで作りましょう。

まだ詳細は学習していませんので、基本的にコピー&ペーストで構いません!

日時情報付きターミナル出力メソッド作成手順

(1)net > digskill」フォルダーの中に「utility」フォルダーを作成してください。
※これは「net.digskill.utility」パッケージを作成するということです。
(2)utility」フォルダーの中に「Logger.java」を作成し、
次のサンプルコードのようにプログラムを書き込んで保存してください。
package net.digskill.utility;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Logger {

    public static void out(Object out) {
        DateTimeFormatter nowDateTimeFormatter = 
            DateTimeFormatter.ofPattern("'['yyyy/MM/dd HH:mm:ss.SSS']'");
        String now = nowDateTimeFormatter.format(LocalDateTime.now());
        System.out.println(now + " " + out);
    }
}
(3)FirstStep.java」を次のサンプルコードのように書き換えて保存してください。
package net.digskill;

import net.digskill.utility.Logger;

public class FirstStep {
    public static void main(String[] args) {
        Logger.out("Hello!");
    }
}

手順は以上です。「FirstStep.java」を開いた状態で「F5」を押して実行してみましょう!

無事、ターミナルに「年からミリ秒までの日時情報付きのHello!」を出力できました。

net/digskill/utility」フォルダーに「Logger.java」というファイルを作成し、ファイルの先頭でpackage文によって「net.digskill.utility」パッケージにあることを宣言していますね。

それをFirstStepクラスの3行目でインポートしたことで、「Logger」クラスに作成した「out」メソッドを7行目で呼び出すことができたのです。

試しにimport文をコメントアウトし、前項で行った方法と同様にクイックフィックスを開いてみると、様々なパッケージのLoggerクラスの候補が表示されます。目的のクラスを使えるようにするためには、パッケージインポートの仕組みが重要であることがわかると思います。

3. アスタリスクによる指定は使わない


インターネットを検索すると、次のサンプルコードのようにimport文の最後がアスタリスクになっている場合をよく見かけると思います。

import java.util.*;

これは、オンデマンドインポートと呼び、「java.util.List」「java.util.ArrayList」・・・などというように同じパッケージから複数のクラスを使いたい場合に、import文をまとめて1行にできる、というメリットがあります。

しかし、どの処理のためのimport文か明示的でないという管理上のデメリットの方が大きいことや、複数のimport文のアスタリスク部分に含まれる(前項のLoggerのような)クラスでは、結局個別のimport文が必要になるということなどから、アスタリスクは使わずに必ず完全限定名で指定することが一般的です。

4. import文を使わない場合


同じパッケージ内のクラスを使用する場合にはimport文は不要です。

また、「java.lang」というパッケージは例外的にimport文が不要です。このパッケージには、Javaプログラミングにおいてほぼ必ず使うようなクラスが含まれています。

もうひとつimport文を使わない場合として、どうしても異なるパッケージの同名クラスを使用したい場合があります。その場合は次のサンプルコードのように、片方のクラスを使用する際にパッケージ部分も含む完全限定名で使用します。

package net.digskill;

import java.util.logging.Logger; // このimport文は7行目のLoggerのため

public class FirstStep {
    public static void main(String[] args) {
        Logger.getGlobal().info("This is information.");        
        net.digskill.utility.Logger.out("Hello!"); // 完全限定名での使用
    }
}

問題

確認問題


確認問題1

この中でインポートの説明として正しくないものはどれか?