こんにちは、かつコーチです。
プログラムに「もし〇〇なら△△する」という判断をさせたいとき、Javaではif文とswitch文という2種類の条件分岐の書き方が使えます。
この記事では基本の使い方に加えて、Java 14以降で導入された新しいswitch文の書き方まで紹介します。
条件分岐とは?
if文とswitch文の役割
- if文:条件の真偽(true/false)によって処理を分岐させる基本の構文
- switch文:1つの変数の値によって、複数の処理を振り分ける構文
条件が2〜3パターン程度ならif文、同じ変数の値で5パターン以上に分けたい場合はswitch文の方が見通しがよくなります。
なぜ使い分けが必要なのか
すべてをif文で書くこともできますが、条件分岐が増えるほどelse ifが連なって読みにくくなります。
「1つの値に応じて処理を振り分ける」というケースに限れば、switch文の方が意図が伝わりやすいコードになります。
基本の書き方:if文
if・else ifの基本形
public class Main {
public static void main(String[] args) {
int score = 75;
if (score >= 90) {
System.out.println("評価: A");
} else if (score >= 70) {
System.out.println("評価: B");
} else if (score >= 50) {
System.out.println("評価: C");
} else {
System.out.println("評価: D");
}
}
}
条件は上から順に評価され、最初にtrueになったブロックだけが実行されます。
境界値(70や50)を書く順番を間違えると意図しない評価になるため、大きい値から順に条件を並べるのが定石です。
三項演算子で簡潔に書く
int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
三項演算子(条件 ? 真の場合の値 : 偽の場合の値)は、単純な値の振り分けをif文より短く書けます。
ただしネストして使うと可読性が落ちるため、単純な2択の場合に限定して使うのがおすすめです。
基本の書き方:switch文
従来のswitch文
String dayOfWeek = "TUE";
switch (dayOfWeek) {
case "MON":
System.out.println("月曜日です");
break;
case "TUE":
System.out.println("火曜日です");
break;
default:
System.out.println("それ以外の曜日です");
}
各caseの末尾にbreakを書き忘れると、次のcaseの処理まで実行され続けてしまいます。
これをフォールスルーと呼び、従来のswitch文でもっともハマりやすい落とし穴です。
Java 14以降のswitch式(アロー構文)
Java 21系では、以下のようなアロー構文(->)を使ったswitch式が推奨されます。
String dayOfWeek = "TUE";
String result = switch (dayOfWeek) {
case "MON" -> "月曜日です";
case "TUE" -> "火曜日です";
default -> "それ以外の曜日です";
};
System.out.println(result);
アロー構文にはbreakが不要で、フォールスルーが起こりません。
さらにswitch自体が値を返す式として使えるため、変数への代入もそのまま書けます。
新しくコードを書くなら、こちらのアロー構文を優先しましょう。
よくあるつまずきポイント・エラー対処
breakを忘れてハマった一次情報
私が実際に従来のswitch文で書いたコードで、以下のようなミスをしました。
❌ Before
int month = 2;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("冬です");
case 3:
case 4:
case 5:
System.out.println("春です");
break;
}
month = 2のとき、期待は「冬です」だけの出力でしたが、breakを書き忘れたために「冬です」に続けて「春です」まで出力されてしまいました。
実行時にもコンパイル時にもエラーにならず、正しく実行されたように見えてしまう点が厄介です。
✅ After
int month = 2;
switch (month) {
case 12, 1, 2 -> System.out.println("冬です");
case 3, 4, 5 -> System.out.println("春です");
default -> System.out.println("その他の季節です");
}
アロー構文とカンマ区切りの複数case指定を使えば、フォールスルーの心配なく同じ処理を安全に書けます。
Java 21を前提にするなら、最初からこの書き方に慣れておくことをおすすめします。
応用・一歩先の使い方
パターンマッチングを使ったswitch(Java 21)
Java 21では、switch式の中でオブジェクトの型に応じた分岐(パターンマッチング)も書けるようになりました。
Object obj = "かつコーチ";
String description = switch (obj) {
case Integer i -> "整数です: " + i;
case String s -> "文字列です: " + s;
default -> "不明な型です";
};
System.out.println(description);
型ごとにキャストなしで分岐処理を書けるため、従来のinstanceofとif文の組み合わせよりも簡潔に書けます。
中級以降でオブジェクト指向を学ぶ際に再度扱うので、ここでは「こういう書き方もある」と知っておくだけで十分です。
まとめ
この記事のポイント
- if文は条件の真偽で分岐、switch文は1つの値で複数分岐する場合に向いている
- 従来のswitch文はbreak忘れによるフォールスルーに注意が必要
- Java 14以降のアロー構文(switch式)はbreak不要でフォールスルーが起きない
- Java 21ではパターンマッチングによる型ベースの分岐も可能
次に読むべき記事
- 演算子の基本(算術・比較・論理)
- for文・while文で繰り返し処理
タグ: Java, 初心者向け, 基本文法