本文へスキップ
BecomeCoder

Java文法コース · 第4章 制御構文 ― 処理の流れを分岐・繰り返す · レッスン15

switch ― 値ごとに分岐する

ブラウザで完結

導入

「曜日ごとに」「月ごとに」など、1つの値がとりうるパターンがいくつもある場合、if / else if を並べ続けるより switch を使ったほうがすっきり書けます。Javaの switch には、昔からある書き方と、新しい書き方の2種類があります。

説明

まず、昔からある classic 形式case:break;)です。

public class Main {
    public static void main(String[] args) {
        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;
        }
    }
}
  • case 1:day1 のときにここから実行されます。
  • break; … ここで switch を抜けます。break を書き忘れると、次の case までそのまま処理が続いてしまう(フォールスルー)ので要注意です。
  • default: … どの case にも当てはまらないときの受け皿です。

新しい アロー形式->)では break が不要で、しかも値を返す式として使えます。

public class Main {
    public static void main(String[] args) {
        int day = 6;

        String name = switch (day) {
            case 1, 7 -> "週末に近い";
            case 6 -> "土曜日";
            default -> "平日";
        };
        System.out.println(name);
    }
}
  • case 1, 7 -> "..." … カンマで複数の値をまとめて1つの case にできます。
  • -> の右側がそのまま case の結果になり、フォールスルーの心配がありません。String name = switch (...) { ... }; のように変数へ直接代入できるのも大きな利点です。

やってみよう

下のエディタで day の値を変え、classic形式の表示が変わることを確かめましょう。break を1つ消してみて、フォールスルー(次の case まで実行されてしまう)を体験してみるのもよい勉強になります。

演習

int month = 12; を用意し、アロー形式の switch12, 1, 2 なら "冬"3, 4, 5 なら "春"6, 7, 8 なら "夏"9, 10, 11 なら "秋"season に入れて表示してください(結果は )。

ヒント1を見る

String season = switch (month) { case 12, 1, 2 -> "冬"; ... }; の形にします。

ヒント2を見る

default も忘れずに書いておくとコンパイルエラーを防げます(例: default -> "?";)。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。