Java:import文を少し理解した話

こんにちは、のわです。
今回はJavaプログラミング勉強中にちょっとした躓きについて話したいと思います。
現在、スッキリわかるJava入門編の参考書をもとに勉強しています。

スッキリわかるJava入門 第3版 (スッキリシリーズ)

スッキリわかるJava入門 第3版 (スッキリシリーズ)

その中で日付と時刻を扱う章があるのですが、躓き、学んだ出来事があったので備忘録として記録したいと思います。

現在日時を取得する方法にjava.util.Dateクラスがあります。
参考書のサンプルコードは以下の通り

import java.util.Date;

public class Main {
  public static void main(String[] args) {
    Date d = new Date();  //現在日時を取得するDateインスタンスを生成する
    System.out.println(d);
  }
}

最初に当該クラスをimportするようになっています。

これを私はimportしないでやってみよう!と考えました。
そして書いたプログラムコードは以下の通り

public class Main {
  public static void main(String[] args) {
    Date d = new java.util.Date();  //importしなかったDateクラスをここで指定
    System.out.println(d);
  }
}

これで問題ないと思っていました。しかし、コンパイルすると以下のエラー文が発生
Main.java:3: エラー: シンボルを見つけられません
Date d = new java.util.Date();
^
シンボル: クラス Date
場所: クラス Main
エラー1個

「え、シンボルエラー?クラスあるじゃん」
と思ったが最後、なかなか解決策が出ず苦労しました。。。






そのまま諦めようかと思っていた時、ふと気が付きました。
「これって、FQCNで指定するのか?」
FQCN(Full Qualified Class Name)とはパッケージを含むクラス名を指定すること
簡単にいうなら正式名称です。
それを踏まえるとDateクラスは以下のような意味合いになります
Dateクラスはjava.utilパッケージ内のDateクラスである
つまり、私の書いたプログラムを修正すると

public class Main {
  public static void main(String[] args) {
    //Dateクラスにパッケージ名を追加
    java.util.Date d = new java.util.Date();  
    System.out.println(d);
  }
}

のようになります。
これだとコンパイルが成功し、現在の時刻を表示することが可能になります。

では、なぜインスタンスにはパッケージ名をつけたのに
クラスにはつけていなかったのか
以下のコードをご覧ください

public class Main {
  public static void main(String[] args) {
    int r = new java.util.Random().nextInt(10);  
    System.out.println(r);
  }
}

上記コードは0〜9までのランダムな数値をint型の変数rに格納し表示するコードです。

最初、私の頭の中にこれがよぎり
「型 変数名 = new クラス名」だったなと勝手に変換していました。

インスタンスの生成は
「クラス名 変数名 = new クラス名();」
が基本の形でだったことを失念していました。。。


というわけでまとめると
インスタンスの生成は「クラス名 変数名 = new クラス名();」の形
・クラス名の指定は二通り
 ①パッケージを含むクラス(FQCN)で指定すること
 ②事前にパッケージを含むクラスをimportし、クラスのみ記載する

初歩的なミスですが、分かっただけですごく嬉しかったです
こういった気づきを大切にしていきたいなと思います!