こんにちは!運営者のハックです。
今回から初級編の再チャレンジ記録を紹介していきます。
今回は「Javaコース初級 基礎編Day7&8『基本型、標準API、条件分岐』」の学習再挑戦記録について紹介します。
Day7 基本型と標準APIについて復習しよう
今回は基本型と標準APIについて復習します。
型という存在がプログラミング言語において非常に重要な立ち位置にあるため、「適切な型の取り扱い方」を覚えておく必要があります。
基本型と参照型
Javaの基本型(プリミティブ型)は、数値や文字といった単純なデータを直接格納するための型です。
基本型の例(全部で8種類あります)
- int…32ビット(-231~231-1)の符号つき整数を扱う
- double…64ビットの浮動小数点を扱う
- char…Unicodeで表現できる一文字(\u0000~\uFFFF)を扱う
基本型はメモリ効率が良く処理速度が速いですが、メソッド(関数)やプロパティ(変数)を持つ「オブジェクト」としての操作は限られています。
対して、参照型(ラッパー型)はこれらの基本型のデータをオブジェクトとして扱うためのクラスです。
参照型の例
- Integer…基本型intの参照型
- Double…基本型doubleの参照型
- Character…基本型charの参照型
- String…文字列を扱う。文字列は必ず参照型になる
参照型を使うと、オブジェクト指向の特徴を活かした操作が可能になりますが、メモリの使用量が増え処理速度が若干遅くなる場合があります。nullの代入やリストやマップなどのコレクションに数値を格納する場合にも、参照型を用いることでオブジェクトとして扱えます。
標準API
Javaの標準API(Application Programming Interface)は、Javaプログラミング言語で提供される一連のクラスおよびインターフェースのライブラリです。
ライブラリというのはJavaで作業する時に使える道具や部品のセットのようなものです。
これらはすでにJavaに入っていて、文章や写真の扱い、インターネットでのやりとり、見た目のデザイン作り、日付や時間の管理、計算といった色々な作業を簡単にできるようにしてくれます。
このおかげで、開発者は自分で一から全てを作る必要がなく、既に用意されている部品を組み合わせて新しいアプリやサービスを作り出すことができます。
まさにJavaにとっての図書館(ライブラリー)だにゃ!
例えば、上の三つのコードは日付や時刻を管理するためのものです。
LocalDateは日付のみ(年、月、日)、LocalDateTimeは日付と時刻、ZonedDateTimeはタイムゾーンを含む日付と時刻の情報を扱います。.now()メソッドを使うことで、現在のシステム時刻を基にそれぞれのオブジェクトを生成します。
この三つのAPIを使用すると異なる時間管理のニーズに対応でき、タイムゾーンを考慮したより精密な時刻管理が可能になります。
標準APIを使わなかったら、どんなコードになるのかにゃ?
標準APIを使用しない場合、時間や日付を扱うためのコードは、自身で細かいロジックを実装する必要があり、はるかに複雑になります。
具体的には以下のようなコードになります。
// 日付と時刻の取得
long currentTimeMillis = System.currentTimeMillis();
Date now = new Date(currentTimeMillis);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateFormat.format(now); // 現在の日付
String formattedDateTime = dateTimeFormat.format(now); // 現在の日時
// タイムゾーンを考慮した日時の取得はさらに複雑になる
TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
calendar.setTimeInMillis(currentTimeMillis);
// この段階で calendar オブジェクトを使って日時を操作する
コードを見ただけで頭が痛くなってきたのにゃ…
ありがたく標準APIに頼らせていただくのにゃ。
Day8 条件分岐について復習しよう
条件分岐とは、プログラム内で特定の条件に基づいて異なる実行経路(コードブロック)を選択するプログラミングの概念です。
詳しい文法についてはWeb制作コースの記事で紹介しましたね。
ちなみに条件分岐ができればありとあらゆるロジックは実装できる、なんて言われます。
何故かというと機械というのは0と1しか理解できないので、0 or 1を判断するロジックさえ組めればいけるよね、というお話だからです。
ネストに要注意!
if文の中にさらにif文を記載するようなものをネストと呼びます。ネストしたコードは主にコードの可読性(読みやすさ)と保守性(点検しやすさ)の観点から、あまり好ましくありません。
要は読みにくいし何やっているのか分からないのでバグも多いコードだ、ということです。
Web制作コースの記事の時にリファクタリング云々言っていたのは
このことだったにゃ。
課題に再挑戦!
プレイヤーがスニークした回数が素数の時、花火を飛ばすように変更してみてください。
当時はChatGPTのプロンプト作成方法も分かっておらず、Javaのコードの意味も録に分からず、数時間粘っていた記憶があります。
今回作成したコードは以下のとおりです。赤字の部分が課題で作成したコードです。
@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
count++;
// BigIntegerを使用して、現在のカウントを素数判定
BigInteger val = BigInteger.valueOf(count);
if (val.isProbablePrime(10)) { // 素数判定を行う(引数は確度)
// イベント発生時のプレイヤーやワールドなどの情報を変数に持つ。
Player player = e.getPlayer();
World world = player.getWorld();
// 花火オブジェクトをプレイヤーのロケーション地点に対して出現させる。
Firework firework = world.spawn(player.getLocation(), Firework.class);
// 花火オブジェクトが持つメタ情報を取得。
FireworkMeta fireworkMeta = firework.getFireworkMeta();
// メタ情報に対して設定を追加したり、値の上書きを行う。
// 今回は青色で星型の花火を打ち上げる。
fireworkMeta.addEffect(
FireworkEffect.builder()
.withColor(Color.BLUE)
.with(Type.STAR)
.withFlicker()
.build());
fireworkMeta.setPower(1);
// 追加した情報で再設定する。
firework.setFireworkMeta(fireworkMeta);
System.out.println("スニークした回数が素数です: " + count);
System.out.println("次の素数は: " + val.nextProbablePrime());
}
}
}
緑字のコードは必須ではありませんが、左画像のようにログに履歴を残すため作成しました。
if文の条件式の「val.isProbablePrime(10)」の10って結局何なのにゃ?
引数である10は素数判定の確度です。
素数判定の確度というのは、数字が本当に素数であるかどうかを計算機が「推定」する際の「自信の度合い」を示します。この数値が大きいほど、計算機はより多くのチェックを行って、その数字が素数であるという「自信」を深めます。
例えば、素数判定で確度を「1」と設定すると、計算機は最低限のチェックしか行わないので、簡単に「これは素数だろう」と結論付けることがあります。一方で、確度を「10」とすると、計算機は「より慎重に」チェックを行い、より高い自信を持って「これは素数である」と言えるようになります。
確度を高くすると、計算にかかる時間は長くなりますが、誤った結論に至るリスクは低くなります。つまり、確度を上げるほどに、より正確な結果が得られる可能性が高まるということです。
まとめ 約1年前に悩んだ箇所も今ならクリアできる
今回はJava初級編Day7と8について再度学習した内容を紹介しました。
当時はコードの意味も分からず、ChatGPTの使い方も下手で、講義の動画を見よう見まねで入力していた記憶があります。
その頃に比べると少しは成長したのでしょうか?
デイトラを卒業するころには更に成長していることを願います。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント