【Java】Javaのif文・switch文で条件分岐を書く基本を解説

Java

こんにちは、かつコーチです。

プログラムに「もし〇〇なら△△する」という判断をさせたいとき、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, 初心者向け, 基本文法

タイトルとURLをコピーしました