switch文は、一つの変数や式の値に基づいて、処理を分岐させたい場合に非常に役立ちます。特に、分岐の数が多く、特定の値が一致するかどうかを判断したいときに、if-else if文を繰り返すよりも簡潔に記述できます。
1. 基本の書式
Java
switch (評価する変数または式) {
case 値A:
// 変数の値が '値A' と一致した場合の処理
System.out.println("値Aの処理を実行");
break; // ★ 処理を終了し、switch文から抜ける
case 値B:
case 値C: // 値Bと値Cが同じ処理の場合、まとめて記述できる
// 変数の値が '値B' または '値C' と一致した場合の処理
System.out.println("値Bまたは値Cの処理を実行");
break;
default:
// どの 'case' にも一致しなかった場合の処理 (省略可能)
System.out.println("一致する値がありませんでした");
break;
}
2. switchで使えるデータ型
switch文で評価できる変数や式の型は限定されています。
- Java 7以降:
byte,short,char,intの整数型、そのラッパー型、String、enum(列挙型)が使用可能です。 - 注意点:
boolean(真偽値) やfloat/double(浮動小数点数) は使用できません。
🛑 break文の役割(フォールスルーを防ぐ)
switch文を使う上で、最も重要なのが**break**文です。
breakの働き
break文は、一致するcaseの処理が完了したときに、switch文のブロック全体から抜けることを命令します。
フォールスルー (Fall-through)
もしbreak文を省略すると、条件に一致したcaseの処理が実行された後、次のcaseラベルの処理も続けて実行されてしまいます。この動作を「フォールスルー」と呼びます。
Java
int month = 1;
switch (month) {
case 1:
System.out.println("正月です");
// breakがないため、次のcase 2の処理も実行される
case 2:
System.out.println("冬です"); // ← これも実行されてしまう
break;
default:
System.out.println("その他の月です");
}
// 出力:
// 正月です
// 冬です
意図的に複数のcaseで同じ処理を行いたい場合(例:上記のcase 値B:とcase 値C:のように)を除き、通常は各caseブロックの最後に**break**を記述する必要があります。
🎯 defaultの役割
defaultは、if文における最後のelseブロックのようなものです。
switch文内のどのcaseラベルの値とも一致しなかった場合に、defaultブロック内の処理が実行されます。defaultは、すべてのcaseラベルの後に記述するのが一般的ですが、記述は省略可能です。
🆕 Java 14以降の新しいswitch式 (Switch Expressions)
Java 14以降では、値を返す**switch式**という新しい書き方が導入され、より安全で簡潔な記述が可能になりました。
Java
int day = 3;
// switch式は、処理の結果を直接変数に代入できる
String dayName = switch (day) {
case 1 -> "月曜日";
case 2 -> "火曜日";
case 3 -> "水曜日";
default -> "その他の曜日";
}; // セミコロンが必要
System.out.println(dayName); // 出力: 水曜日
💡 新しいswitch式のメリット
breakが不要:->(アロー演算子) を使うことで、フォールスルーが起こらず、自動的にswitch式から抜けます。- 値を返せる: 結果を変数に代入できるため、記述が非常に簡潔になります。
学習初期段階では従来のswitch文 (case : と break;) を学ぶことが多いですが、新しい書き方があることも知っておくと便利です。

