10日で覚えるJavaDay 3: 制御構文

Day 3: 制御構文

今日学ぶこと

  • 条件分岐(if / else)
  • switch文とswitch式
  • for ループ
  • while / do-while ループ
  • break と continue

if文

int score = 85;

if (score >= 90) {
    System.out.println("A");
} else if (score >= 80) {
    System.out.println("B");
} else if (score >= 70) {
    System.out.println("C");
} else {
    System.out.println("D");
}
// 出力: B
flowchart TB
    Start["score = 85"]
    C1{"score >= 90?"}
    C2{"score >= 80?"}
    C3{"score >= 70?"}
    A["A"]
    B["B"]
    C["C"]
    D["D"]
    Start --> C1
    C1 -->|"Yes"| A
    C1 -->|"No"| C2
    C2 -->|"Yes"| B
    C2 -->|"No"| C3
    C3 -->|"Yes"| C
    C3 -->|"No"| D
    style B fill:#22c55e,color:#fff

三項演算子

int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
System.out.println(status); // 成人

switch文

従来のswitch文

int day = 3;

switch (day) {
    case 1:
        System.out.println("月曜日");
        break;
    case 2:
        System.out.println("火曜日");
        break;
    case 3:
        System.out.println("水曜日");
        break;
    default:
        System.out.println("その他");
        break;
}

注意: breakを忘れるとフォールスルー(次のケースも実行)が発生します。

switch式(Java 14+)

int day = 3;

String dayName = switch (day) {
    case 1 -> "月曜日";
    case 2 -> "火曜日";
    case 3 -> "水曜日";
    case 4 -> "木曜日";
    case 5 -> "金曜日";
    case 6 -> "土曜日";
    case 7 -> "日曜日";
    default -> "不明";
};

System.out.println(dayName); // 水曜日

推奨: Java 14以降ではアロー構文のswitch式を使いましょう。breakの書き忘れがなく、値を返せます。

複数値のマッチング

String type = switch (day) {
    case 1, 2, 3, 4, 5 -> "平日";
    case 6, 7 -> "週末";
    default -> "不明";
};

switchで使える型

int, byte, short, char case 1:
String case "hello":
enum case MONDAY:

forループ

基本のforループ

for (int i = 0; i < 5; i++) {
    System.out.println("i = " + i);
}
// i = 0, 1, 2, 3, 4
flowchart TB
    Init["int i = 0<br>初期化"]
    Cond{"i < 5?"}
    Body["ループ本体<br>実行"]
    Update["i++<br>更新"]
    End["ループ終了"]
    Init --> Cond
    Cond -->|"true"| Body --> Update --> Cond
    Cond -->|"false"| End
    style Init fill:#3b82f6,color:#fff
    style Cond fill:#f59e0b,color:#fff
    style Body fill:#22c55e,color:#fff
    style Update fill:#8b5cf6,color:#fff

カウントダウン

for (int i = 5; i > 0; i--) {
    System.out.println(i);
}
// 5, 4, 3, 2, 1

ネストしたforループ

// 九九の表
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.printf("%3d", i * j);
    }
    System.out.println();
}

拡張forループ(for-each)

配列やコレクションの全要素を順に処理します。

String[] fruits = {"りんご", "みかん", "ぶどう"};

for (String fruit : fruits) {
    System.out.println(fruit);
}

推奨: 配列やリストの全要素を処理する場合は拡張forを使いましょう。インデックスが不要な場面で簡潔に書けます。


whileループ

while

int count = 0;

while (count < 5) {
    System.out.println("count = " + count);
    count++;
}

do-while

int count = 0;

do {
    System.out.println("count = " + count);
    count++;
} while (count < 5);
ループ 条件チェック 最低実行回数
while ループの 0回
do-while ループの 1回

break と continue

break

ループを途中で抜けます。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break; // i=5でループ終了
    }
    System.out.println(i);
}
// 0, 1, 2, 3, 4

continue

現在の繰り返しをスキップします。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue; // 偶数をスキップ
    }
    System.out.println(i);
}
// 1, 3, 5, 7, 9

ラベル付きbreak

ネストしたループを一気に抜けます。

outer:
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 1) {
            break outer; // 外側のループも抜ける
        }
        System.out.printf("(%d, %d) ", i, j);
    }
}
// (0, 0) (0, 1) (0, 2) (1, 0)

実践: 数当てゲーム

import java.util.Random;
import java.util.Scanner;

public class NumberGuessing {
    public static void main(String[] args) {
        Random random = new Random();
        int answer = random.nextInt(100) + 1; // 1〜100
        Scanner scanner = new Scanner(System.in);
        int attempts = 0;

        System.out.println("=== 数当てゲーム ===");
        System.out.println("1〜100の数を当ててください。");

        while (true) {
            System.out.print("予想: ");
            int guess = scanner.nextInt();
            attempts++;

            if (guess == answer) {
                System.out.printf("正解!%d回で当たりました!%n", attempts);
                break;
            } else if (guess < answer) {
                System.out.println("もっと大きい数です。");
            } else {
                System.out.println("もっと小さい数です。");
            }
        }

        scanner.close();
    }
}

まとめ

概念 説明
if / else 条件分岐
switch 値による分岐(アロー構文推奨)
for 回数が決まったループ
for-each コレクションの全要素を処理
while 条件が真の間ループ
do-while 最低1回実行するループ
break ループを抜ける
continue 現在の繰り返しをスキップ

重要ポイント

  1. switch式->構文)を使ってbreak漏れを防ぐ
  2. 全要素処理には拡張forを使う
  3. while(true) + break終了条件が複雑なループを書ける
  4. ラベル付きbreakでネストループを一気に抜けられる

練習問題

問題1: 基本

1〜100の数を表示し、3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、両方の倍数の時は「FizzBuzz」と表示するプログラムを作成してください。

問題2: 応用

Scannerを使ってユーザーから数値を繰り返し入力させ、0が入力されたら合計と平均を表示して終了するプログラムを作成してください。

チャレンジ問題

ネストしたforループを使って、以下のような三角形パターンを表示するプログラムを作成してください。

*
**
***
****
*****

参考リンク


次回予告: Day 4では「配列と文字列」について学びます。複数のデータをまとめて扱う方法をマスターしましょう。