【備忘録】Java_リテラル

f:id:nowa0402:20210508180533p:plain

こんにちは。のわです。
今日はJavaからリテラルについてまとめたいと思います。


リテラルとはソースコード中に記述する値』のことです。

  int i = 10;

上記コードの「10」がリテラルになります。

そして、リテラルはデータ型を持っています。
上記コードの「int」が型になります。

このデータ型とリテラルには書き方に一定のルールがあります。
ざっとまとめてみました。

 int i = 10; // 整数
 long l = 100000L; // int型より大きい整数 末尾に「L」もしくは「l」をつける
double d = 3.14; // 小数点付きの数字
float f = 3.14F; // 小数点付きの数字 末尾に「F」もしくは「f」をつける
boolean b = true; // 真偽値 入る値は「true」か「false」
char c = 'A'; // 1つの文字 「'」で囲む 

int型とchar型は以下のような宣言も可能です。

  int a = 0x11; //「0x」で16進数表記 aには17が入る
  int b = 011; // 「0」で8進数表記 bには9が入る
  int c = 0b0011; //「0b」で2進数表記 cには3が入る

 char d = 12354; // Unicode表記 dには「あ」が入る
 char e = '¥u3042'; // Unicode 16進数表記 eには「あ」が入る

ここからが応用編、リテラルには任意の場所にアンダースコア(_)を入れることが可能です。
ただし、以下の条件をクリアすることが必要です。
 条件①リテラルの先頭と末尾にはつけられない
 条件②記号の前後には記述できない
ここでいう記号は「.」「L」「F」「0b」「0x」などのリテラル内で記述できるものです。

いくつか例をあげてみます

  int a = 1_000_000; // OK
  int b = _100; // NG 条件①
  int c = 100_; // NG 条件①
  int d = 0_1100; // OK
  int e = 0x_11; // NG 条件②
  float f = 3.14_F; // NG 条件②
  double g = 3._14; // NG 条件②

となります。

今回はリテラルについてまとめてみました。
次回はデータ型と変数についてまとめたいと思います!

最後まで読んでいただきありがとうございました!

【備忘録】Java_コレクション

f:id:nowa0402:20210505160433p:plain
こんにちは、のわです。
今回は勉強中のJavaからコレクションについて備忘録を残します。

前回の記事で勇者VSドラゴンの記事をあげました。
nowa-0402.hatenablog.com

そこから下記内容を追加して現在プログラム修正中です。
 ・職業魔法使いを増やす。
 ・モンスターを増やす

魔法使いを増やしたことで勇者はパーティを組む必要が出てきました。
そこで、勉強したコレクションを使ってパーティ化することにしました。

※前提
 勇者=Heroクラス
 魔法使い=Wizardクラス
 勇者と魔法使いの親クラス=Characterクラス

【Main.java

    // ArrayListの記述省略のためimportしておく
    import java.util.*:

    // 勇者と魔法使いを生み出す
    Character c1 = new Hero();
    Character c2 = new Wizard();
    // 勇者と魔法使いでパーティを組む
    ArrayList<Character> party = new ArrayList<>();
    party.add(c1);
    party.add(c2);

コレクションと配列の違う点は要素を随時追加できる点です。

   // Character型のコレクション『party』を作成
    ArrayList<Character> party = new ArrayList<>();
 // partyに対して勇者と魔法使いのインスタンスを格納
    party.add(c1);
    party.add(c2);

上記で言うところの『.add()』メソッドが追加の役割を果たしています。
配列は事前にいくつ入れるのか決める必要があり
そこから要素を追加することは出来ませんでした。

コレクション(ArrayListの場合)だと
 ・要素追加は『.add(インスタンスの型)』
 ・要素削除は『.remove(int)』
と楽に追加、削除や取り出しが可能です。


では、コレクション化すると何が出来るようになるか。
実際にコレクションを活かしたプログラムを作ってみました。

【Main.java

    import java.util.*;

    // 勇者と魔法使いを生み出す
    Character c1 = new Hero();
    Character c2 = new Wizard();
    // 勇者と魔法使いでパーティを組む
    ArrayList<Character> party = new ArrayList<>();
    party.add(c1);
    party.add(c2);

   // ドラゴンを生み出す
   Dragon d = new Dragon();

  // ドラゴンがパーティに火を吹く
   d.fireBless(party);


【Dragon.java

 // ドラゴンがパーティに火を吹く
  import java.util.*;

  public void fireBless(ArrayList<Character> party) {
    System.out.println("ドラゴンは全体に火を吹いた!");
    for(int i = 0; i < party.size(); i++) {
      party.get(i).hp -= 20;
      System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");
    }
  }

コレクションはデータ型、配列と同様、引数に指定することが可能です。
実際、どんな処理をしているのか簡単に説明します。

  public void fireBless(ArrayList<Character> party) {}

メソッドの引数にコレクションを指定しています。
変数名は任意の名前をつけます。
今回はMain.javaで付けたpartyにしています。

for(int i = 0; i < party.size(); i++) {
   party.get(i).hp -= 20;
   System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");
    }

今回のポイントになります。
引数でもらった勇者御一行にどうやってダメージを与えるか
下記で詳細を説明します。

 for(int i = 0; i < party.size(); i++) {}

for文で何回繰り返すか設定しています。
『.size()』メソッドは格納されている要素数を返します。
今回、要素数は勇者と魔法使いの2人です。
つまり、『i < 2』となり、iが2になったら処理が終了します。

    party.get(i).hp -= 20;
    System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");

この文でダメージを与えています。
『.get(int)』メソッドはint番目の要素を取り出します。
つまり、『party.get(i).hp -= 20;』は
『partyのi番目にいるキャラのHPを20引け』
という意味になります。
iはfor文で定義しています。
 ・繰り返し1回目なら『i = 0』となり、勇者が対象
 ・繰り返し2回目なら『i = 1』となり、魔法使いが対象
になります。

因みに、コレクションは配列と同じく要素は『0』から始まります。
『1』からでは無いので注意してください。



今回はコレクションを使ったプログラムを紹介しました。

私自身、コレクションを勉強した当初は
「何に使えるのこれ」という感じでした。
ですが、コードを書きながら、色々試行錯誤をしていくうちに
「色々できるやん!コレクションすごい!」と気づきました。

やっぱり、考えながらコードを書くのが一番楽しくて、勉強になりますね。


なお、コレクションは引数だけではなく、戻り値にも指定できます。
是非活用してみてください!

今回も最後まで見ていただきありがとうございました!

【備忘録】Linux_LPIC認定試験を通じて得たもの

f:id:nowa0402:20210430153910p:plain
 こんにちは。のわです。
f:id:nowa0402:20210430142631j:plain
 本日(2021/4/30)にLPIC102を取得しました!
 前回の101と合わせ、無事LPIC1認定取得できました。

 今回はLPIC試験を通じて勉強になったことを記録したいと思います。

※勉強方法についてはLPIC101取得と同じように進めました。
もし参考にされたい方は下記の記事を参照ください。

nowa-0402.hatenablog.com


 私が身についたなと思うものは2点
  Linuxの基礎知識を理解することができる】
  【CUI操作に慣れる】

 これらについてまとめていきます。


※本題前に
  LinuxとはWindowsmac OSと同じオペレーションシステムの一つです。
 大きな特徴は『無料で使用することができること』です。

  では、なぜ私はLinuxを学ぶことにしたのか
 それは『サーバで数多く利用されている』からです。
 
  Linuxは上記の通り『無料』でOSを使用することができます。
 サーバを数多く運用するのであれば、OSは費用がかからないLinuxを選択する可能性が高くなります。
 私は、エンジニアを目指すのであればサーバ側の知識が必要になると考えていました。
 そのため、Linuxの知識を身につけようとしたのです。


LPIC試験を通じて得たもの①
Linuxの基礎知識を身につけることができる】
  Linuxをどう学ぶか、私は色々考えました。
 Linuxを学ぶといっても、何をどう学べばいいのか分かりませんでした。
 そこで思いついたのが『LPIC』の認定試験でした。
 
  LPICレベル1認定を目指す。そして、その過程でLinuxの基礎知識を身につけようとしました。
 私はLinuxを勉強するうえで
 ・動画教材の『Udemy』
 ・完全無料の教材『Linuxの標準教科書』
 ・LPIC資格本
 を使用し、勉強をすすめました。
  上記の中でLinux標準教科書』はLinuxを勉強したい方に是非取り組んでほしいです。
 無料教材ですが、有料級の情報がつまっています。
 リンクを載せておきますので参考にしてください。
 Linux標準教科書 ダウンロード LinuCレベル1対応 | Linux技術者認定試験 リナック | LPI-Japan

  結論、『何となく概要は把握した』状態になりました。
 当初は『OSなのは知っている』状態だったので、それなりに進歩したかなと思っています。
 後は、ポートフォリオを作成する際にサーバ構築等が必要になると考えています。
 そのタイミングで更にアウトプットして知識を定着させます。




LPIC試験を通じて得たもの②
CUI操作に慣れる】
  CUIというのはこんな画面で色々コマンドを打つことです。(画像はWindows)
 f:id:nowa0402:20210430154421p:plain
  個人的にこっちの方が得たものは大きかったです。
  Linuxに限らず、エンジニア転職に向けて勉強していると、CUI操作が求められる場面が多々あります。
 特にLinuxの勉強はCUI操作が基本になります。
 つまりCUI操作はエンジニアになるためには避けて通れない道』だと思いました。

  Linuxの勉強中、最初は訳もわからず教科書通りにコマンドを打つ状態が続きました。
 コマンドを打つと英語がずらっと出てきます。なんて書いてあるかまったく分かりません。
 これが一番つらかったです。CUIじゃなくてGUI(いつも使っているデスクトップ環境)を見ると安心します。
 
  ただ、毎日勉強していると、自然とディレクトリ移動やファイル作成、エラーに対する対応ができるようになってきます。
 こうなってくるとCUI操作が嫌じゃなくなってきます。
 『英語たくさんの画面に慣れてきた状態』になります。 
 
  CUIに慣れてくると、Linuxに限らず、プログラミング学習でも効果が出ています。
 CUIでたくさん経験する『コマンドを叩くと画面に出てくるたくさんの英語』
 ここから必要な情報を読み取る力が少しづつ身についてきました。

  結論、CUI操作を通じて
 『英語の羅列に苦手反応が出にくくなる』
 『出てきた情報から必要なものを取り出す』

 この力を身につけることができました。
 ただ、まだまだ理解が足りないと感じているので実践の中で成長していきます。
  CUI画面が苦手だと感じている方、是非Linux学習を通じて勉強してみてほしいです。
 


 今回はLPIC認定試験を通じて得たものについて記載しました。
  【Linuxの基礎知識を理解することができる】
    ・サーバ構築で必須となるLinuxを資格勉強を通じて身につける。
  【CUI操作に慣れる】
    ・英語がたくさん出てきても苦じゃなくなる
    ・必要な情報を読み取って検索する力が身につく

  認定試験に合格したからなにか人生が変わるものではないと思っています。
 しかし、勉強する目的が
  ・『合格のため』に勉強する
  ・『何を得たいのか』にフォーカスして勉強する
 どちらにするのかで、理解力に差が出るはずです。
  
  私の場合、『Linuxとはなにかを理解する』ことにフォーカスして勉強しました。
 理解する手段としてLPIC試験というわかりやすい道筋を立てました。
 なにか挑戦するときは『これをすると何が変わるのか』を考える。
 これを今後も大事にしていきたいと思います。
 
  今回も最後まで読んでいただきありがとうございました!

Javaで勇者VSドラゴンのプログラムを書いてみた

f:id:nowa0402:20210425160737p:plain
こんにちは。のわです。
現在、Javaのプログラムを勉強しています。
今回は、初めて自分で考え作成したプログラムを載せてみます。
タイトルは『勇者vsドラゴン』

まずはコードから
【Main.java

package com.nowa0402.sample;

public class Main {

	public static void main(String[] args) {
		Hero h = new Hero();
		Dragon d = new Dragon();
		boolean heroDie = false;
		boolean dragonDie = false;
		System.out.println("名前を入れてください");
		h.name = new java.util.Scanner(System.in).nextLine();
		System.out.println(h.name + "が生まれました!");
		System.out.println("これからドラゴン退治が始まります!");
		System.out.println("ドラゴンが出てきた!");
		
		System.out.println(h.name + "の現HPは" + h.hp + "です。");
		System.out.println(h.name + "の現MPは" + h.mp + "です。");
		System.out.println("回復、攻撃呪文を唱えるたびにMPは5消費されます");
     // ここから戦闘ブロック
		do {
     // 勇者側のターン。選択権を与えています。
			System.out.println(h.name + "はどうする?");
			System.out.print("1:攻撃 2:回復 3:攻撃呪文");
			int select = new java.util.Scanner(System.in).nextInt();
		// 入力値によって処理が変化
			switch (select) {
			case 1:
				h.attack(d);
				break;
			case 2:
				h.heal();
				break;
			case 3:
				h.fireBoll(d);
				break;
			}
	  // ドラゴンのターン前にドラゴンのHPが0以下か確認
			if(d.hp <= 0) {
			//もし体力がなければドラゴンが倒れ、返り値「true」がdragonDieに入る
				dragonDie = d.die();
			} else {
			//体力が残っていればドラゴンのターン、確立で【攻撃】が【火の息】か分ける
			int dSelect = new java.util.Random().nextInt(5);
			if(dSelect <= 3) {
				d.attack(h);
			} else {
				d.fire(h);
			}
		// 勇者の体力が残っているか判定
			if(h.hp <= 0) {
			//勇者の体力が0以下の場合、勇者は力尽きてゲームオーバー
				heroDie = h.die();
			} else {
			// 体力が残っている場合、残りHPとMPをお知らせ
				System.out.println(h.name + "の残HPは" + h.hp + "です。");
				System.out.println(h.name + "の残MPは" + h.mp + "です。");
			}
			}
		// 繰り返し判定「勇者とドラゴンどちらも力尽きていない場合は【do】まで戻る」
		} while (heroDie == false && dragonDie == false);
		// 最終判定「ドラゴンが力尽きたか、勇者が力尽きたかでメッセージが変わる」
		if(dragonDie == true) {
			System.out.println("見事ドラゴンを倒しました!やったね☆");
		} else if(heroDie == true) {
			System.out.println("ドラゴンを倒せませんでした。また挑戦してね!");
		}
		// 最終メッセージ
		System.out.println("遊んでくれてありがとうございました!!");
	}

}


【Hero.java

package com.nowa0402.sample;

public class Hero {
	int hp;
	int mp;
	String name;
	
	public Hero() {
		this.hp = 100;
		this.mp = 50;
	}
	
	public void attack(Dragon d) {
		System.out.println(this.name + "の攻撃!");
		d.hp -= 10;
		System.out.println("10ポイントのダメージを与えた!");
	}
	
	public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}
	
	public void heal() {
		System.out.println(this.name + "は回復呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			int healHp = 50;
			this.hp = Math.min(100, healHp + this.hp);
			System.out.println(this.name + "は50ポイント回復した!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
	public void fireBoll(Dragon d) {
		System.out.println(this.name + "は攻撃呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			d.hp -= 20;
			System.out.println(this.name + "は火の玉を繰り出した!");
			System.out.println("20ポイントのダメージを与えた!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
}


【Dragon.java

package com.nowa0402.sample;

public class Dragon {
	int hp;
	
	public Dragon() {
		this.hp = 200;
	}
	
	public void attack(Hero h) {
		System.out.println("ドラゴンの攻撃!");
		h.hp -= 10;
		System.out.println(h.name + "は10ポイントのダメージを受けた!");
	}
	
	public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}
	
	public void fire(Hero h) {
		System.out.println("ドラゴンは火の息を繰り出した!");
		h.hp -= 20;
		System.out.println(h.name + "は20ポイントのダメージを受けた!");
	}
}

Hero.javaとDragon.javaでフィールドとメソッドを作成。
Main.javaでシナリオを進めています。

個人的に考えたのは『繰り返し処理を何で判定するか』です。
繰り返し処理はwhile文になります。
判定基準はどちらかのHPが0になることまではイメージできていました。
それをどうやって表現するか。。。


考えた結果、私の答えは
『booleanで返り値つけて判定するか』
でした。

booleanは簡単に説明すると『真偽値』
正しければ『true』を間違っていれば『false』を返します。

つまり
『繰り返し処理を何で判定するか』については
『繰り返し処理は勇者、ドラゴンがどちらかが倒れていれば抜け出す』
になります。


この処理を実現したのが以下の文になります。

【Hero.java

public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}

【Dragon.java

public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}

【Main.java

while (heroDie == false && dragonDie == false);

Hero.javaとDragon.javaのDieメソッドに返り値『true』を付けています

Main.javaでは繰り返し判断(while文)で
 ○どちらか倒れていれば(trueの返り値が来ていたら)繰り返し終了
 ○どちらも生きていれば(trueの返り値が来ていない)繰り返し処理『do』の位置まで戻る
を実現しています。


今回のプログラム紹介は以上になります。

ただ、これから修正していきたい点はたくさんあります。
例えば
・名前の入力後にその名前で問題ないか問い合わせる。
・選択肢で数字を間違えたら、再度選択肢画面に戻る
・勇者以外の職も作ってみる
・ドラゴンだけではなく他のモンスターも作る
などなど...

まずは『一つ作り上げる』
これを目標にしていたので達成できて良かったです!


今後は
・このプログラムをアップデートしていくこと
Java Silverの資格勉強
にフォーカスしつつ引き続き勉強頑張っていきたいと思います!

【合格体験記】LPIC101に合格したので勉強方法をご紹介

f:id:nowa0402:20210416190905p:plain
こんにちは。のわです。
本日(2021.04.16)に無事LPIC101試験を合格できました!
f:id:nowa0402:20210416191047j:plain

今回は勉強~受験までの道のりを書き残したいと思います。
私と同じく受験しようと思っている方がいれば是非参考にしていただければ幸いです。

【勉強期間】

 ・期間は1ヶ月半程度
 ・勉強時間は平日2時間、休日6時間

【勉強方法】

参考書

  今回の受験にあたって、下記の参考書を購入しました。
 ①『1週間でLPICの基礎が学べる本』
  

1週間でLPICの基礎が学べる本 第3版 (1週間シリーズ)

1週間でLPICの基礎が学べる本 第3版 (1週間シリーズ)

  • 作者:中島 能和
  • 発売日: 2019/06/20
  • メディア: 単行本(ソフトカバー)

 ②『Linux教科書 LPICレベル1』通称『あずき本』
  

Linux教科書 LPICレベル1 Version5.0対応

Linux教科書 LPICレベル1 Version5.0対応

  • 作者:中島 能和
  • 発売日: 2019/04/08
  • メディア: 単行本(ソフトカバー)

 ③『Linux教科書 LPICレベル1 スピードマスター問題集』
  

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応

 

勉強の仕方について

  ※勉強する前に
   LPIC試験は実際に実機でコマンドを叩きながらやるのが体系的に覚えられるのでLinuxをインストールすることをおすすめします!
   Linuxの参考書を購入(上記参考書なら①と②)すると仮想環境の構築法が載っていると思いますのでそれを見ながらやればOKです!
  
(1)学習開始~2週間 「①の参考書をすすめる」
   ①の基礎本を進めながら実際にコマンドを叩いてみます。
   一週間で学べるとありますが私は2週間かかりました。。。意外と1日のボリュームがあります。
   それと参考書の説明がとても分かりやすいです。
   この後あずき本が出てきますが説明の理解しやすさは圧倒的に基礎が学べる本です。

(2)2週間経過~4週間目まで 「あずき本とスピードマスターを一周する」
   ①の参考書を終了後に②のあずき本にとりかかりました。
   私は単元ごとにあずき本をやったら③のスピマスをやるをしながら勉強を進めました。
   また、スピマスの他に私は『Ping-t』という勉強サイトを活用していました。
   あずき本⇒スピマス⇒Ping-tの演習問題 を単元ごとに繰り返す形です。
   2週間を目処に模試以外を終わらせました。

(3)4週間目~試験前日まで 「模試と苦手分野を集中的に勉強する」
   ここからは追い込みをかけていきました。
   あずき本、スピマス、Ping-tにある模試を80%超えるよう繰り返し勉強しました。
   一番お世話になったのはPing-tです。
   解説が一番分かりやすいので何故そうなるのか理解しやすいです。
   正解を覚えるのではなく解説を読み込んで実際にコマンドを打ちながら進めていきました。
   試験前日までに90%を安定して取れるようにしました。
   また、このときに苦手分野の単元を毎日勉強して頭に叩き込んでいました。

  (4)試験当日
   試験当日はあずき本のチェックシートを使って、不安な箇所を今一度整理しました。
   試験中、最も苦しめられたのは日本語訳がおかしい箇所があるところです。
   後はスピマスの模試問題で出てくる問題がいくつかありました。
   

勉強のポイント

  勉強するにあたってのポイントですが
   ・実機で操作
   ・わからない言葉は自分で調べながらすすめること
   ・ノートにまとめてみる
  個人的には一番最後に記載した「ノートにまとめる」のが一番良かったと思っています。
  ○ノートにまとめる=情報を整理するので頭の整理にもなる
  ○コマンドやファイルパスを書く事で記憶力があがる
  それと私はTwitterもやっているのですが
  毎日今日理解したことを整理して発信していました!
  ノートにまとめると同じ効果+140文字で伝えるという制限があるので
  情報をより細かく整理する力がつき、より理解が深まると思います!

【感想】

 Linuxの基礎を学びつつすすめる事ができたので個人的には大満足です。
 ただ、まだまだ理解出来ていない箇所もあるので引き続き参考書にはお世話になるかなと思います。
 LIPC1の認定には102の試験もあるので引き続き頑張りたいと思います!

Linux LIPC1対策日記_パッケージ管理について

f:id:nowa0402:20210409175550p:plain
こんにちは。のわです。


今回は現在勉強中のLinux LPIC101から
パッケージ管理についての備忘録を書き留めておきます。

 因みに使用している参考書はこちら(小豆本です)

Linux教科書 LPICレベル1 Version5.0対応

Linux教科書 LPICレベル1 Version5.0対応

  • 作者:中島 能和
  • 発売日: 2019/04/08
  • メディア: 単行本(ソフトカバー)

パッケージ管理コマンドで一番苦労しているのが
『形式によってオプションが全然違う』
ことです。
※両者形式については以下の通り
 ◎Debian形式(Debian系のディストリビューション)
  dpkg、aptコマンド
 ◎RPM形式(Red Hat系のディストリビューション)
  rpmyumコマンド

 
例えばオプションが下記だったとします。

 -l または --list オプション

この場合
dpkgコマンドで実行すると『インストール済パッケージを検索して表示』
rpmコマンドで実行すると『指定したパッケージに含まれるファイルを表示』
という意味になります。(※説明は参考書より引用)

教科書の説明からして何言っているんだ…といった感じですが
いい機会なので自分なりの言葉で共通部分の整理をしたいと思います。


①『パッケージの情報を表示』

dpkg -s パッケージ名
dpkg --status パッケージ名
rpm -qi パッケージ名
rpm -q --info パッケージ名



②『指定パッケージから生成されたファイルを表示』

dpkg -L パッケージ名
dpkg --listfiles パッケージ名
rpm -ql パッケージ名
rpm -q --list パッケージ名



③『指定ファイルを生成したパッケージを表示』

dpkg -S ファイル名
dpkg --search ファイル名
rpm -qf ファイル名



④『全パッケージ一覧を表示』

dpkg -l 
dpkg --list 
rpm -qa 
rpm -q --all 


とても簡易的ですが、参考にしていただければ幸いです。

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し、クラスのみ記載する

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