Swtich式とSwitch文の違い

docs

「switch文」はJavaのプログラミングで条件によって処理を分けたいときに使う、とっても便利な機能だよ。Javaプログラミングの学習を進めていくと、「switch文」の他に、なんだか似ている「switch式」というものがあることに気づくはず。

今回はJavaの「switch式」について、「switch文」との違いに注目しながら、Java初心者さんにも分かりやすく解説していくね!


switch文、覚えてる?

以前の記事(条件がたくさんある時、どうする? switch文でスマートに解決! | ToolDocs)で「switch文」について解説したのを覚えてるかな? 「switch文」は、こんな風に書くんだ。

Java

int signal = 1; // 1:青, 2:黄, 3:赤

switch (signal) {
    case 1:
        System.out.println("進め!");
        break;
    case 2:
        System.out.println("注意!");
        break;
    case 3:
        System.out.println("止まれ!");
        break;
    default:
        System.out.println("エラー: 不明な信号です");
        break;
}

このコードでは、signalの値によって表示するメッセージを変えているよね。「switch文」の特徴は、caseの後にコロン(:)があって、処理の最後にbreak;を書くこと。そして、それぞれのcaseで実行したい処理を書くんだ。


switch式ってなんだ?

さて、今回の主役「switch式」の登場! 「switch式」は、Java 14から正式に導入された新しい機能なんだ。見た目は「switch文」にそっくりなんだけど、大きな違いがあるよ。それは、「switch式は値を返す」ということ。

まずはコードを見てみよう。さっきの「switch文」と同じことを「switch式」で書いてみるね。

Java

int signal = 1; // 1:青, 2:黄, 3:赤

String message = switch (signal) {
    case 1 -> "進め!";
    case 2 -> "注意!";
    case 3 -> "止まれ!";
    default -> "エラー: 不明な信号です";
};

System.out.println(message);

どうかな? 結構スッキリした印象じゃない? 「switch文」との違いを見ていこう。

1. アロー演算子(->)を使う

「switch式」では、caseの後にコロン(:)ではなく、アロー演算子(->)を使うんだ。このアロー演算子の右側に、そのcaseで返したい値を直接書くことができるよ。

2. break;がいらない

アロー演算子を使うと、break;を書く必要がなくなるんだ。これは「switch文」でよくある「break;を書き忘れて意図しないcaseの処理まで実行されちゃう」っていうミス(フォールスルーって言うよ)を防げるから、すごく便利なんだ。

3. 値を返せる

一番のポイントはここ! 「switch式」は、評価した結果の値を返すことができるんだ。上の例だと、signalの値に応じて返された文字列がmessage変数に代入されているよね。

これが「switch文」との決定的な違いだよ。「switch文」は処理を実行するだけで、値を返すことはできないんだ。


switch文とswitch式の使い分け

じゃあ、どんなときに「switch文」を使って、どんなときに「switch式」を使えばいいんだろう?

switch文が向いているケース

  • 値を返さずに、特定の処理を実行したい場合 例えば、ファイルの保存処理とか、データベースへの書き込みとか、何か状態を変更するような処理の場合だね。値を返す必要がないなら、「switch文」でも十分だよ。

Java

// 例:ユーザーの操作に応じて処理を実行
String action = "save";

switch (action) {
    case "save":
        System.out.println("ファイルを保存しました。");
        // ファイル保存の具体的な処理(値を返す必要なし)
        break;
    case "delete":
        System.out.println("ファイルを削除しました。");
        // ファイル削除の具体的な処理
        break;
    default:
        System.out.println("不明な操作です。");
        break;
}

switch式が向いているケース

  • 条件に応じて異なる値を生成したい場合 「switch式」の最大のメリットは、値を返せること。だから、条件によって結果の値を切り替えたいときに大活躍するよ。

Java

// 例:曜日に応じてメッセージを生成
String dayOfWeek = "Monday";
String greeting = switch (dayOfWeek) {
    case "Monday" -> "月曜日、頑張ろう!";
    case "Friday" -> "華金だね!";
    case "Sunday" -> "良い休日を!";
    default -> "特にない日だね。";
};
System.out.println(greeting);
  • コードをより簡潔に書きたい場合 「switch式」を使うと、同じ処理を「switch文」で書くよりも行数が減って、コードがスッキリすることが多いよ。特に、返したい値が単純な場合は効果が大きいね。

switch式のもう少し詳しい使い方

複数の値をまとめて処理

caseで複数の値をまとめて指定することもできるよ。カンマ(,)で区切って書くんだ。

Java

int day = 6; // 1:月, ..., 7:日
String typeOfDay = switch (day) {
    case 1, 2, 3, 4, 5 -> "平日";
    case 6, 7 -> "週末";
    default -> "不正な値";
};
System.out.println(typeOfDay); // 出力: 週末

複雑な処理で値を返す場合

アロー演算子(->)の右側に書くのは、単一の値だけじゃなくて、ブロック({})で囲んだ処理も書けるよ。その場合は、最後にyieldキーワードを使って値を返すんだ。

Java

int score = 85;
String grade = switch (score / 10) { // スコアを10で割って評価
    case 10, 9 -> {
        System.out.println("素晴らしいスコアです!");
        yield "A";
    }
    case 8 -> {
        System.out.println("良いスコアです!");
        yield "B";
    }
    case 7 -> {
        System.out.println("まずまずのスコアです。");
        yield "C";
    }
    default -> {
        System.out.println("もう少し頑張りましょう。");
        yield "D";
    }
};
System.out.println("あなたの評価は: " + grade);

この例だと、scoreが85だから、score / 10は8になるよね。だからcase 8のブロックが実行されて、「良いスコアです!」と表示された後、"B"grade変数に代入されるんだ。

yieldは「switch式」の中で値を返すときに使う特別なキーワードだよ。「switch式」の中で複雑な計算をして、その結果を返したいときに使うと便利だね。


まとめ

今回の記事では、「switch式」について「switch文」との違いを比較しながら見てきたよ。

  • switch文」は、条件に応じて処理を実行するもの。:break;を使う。
  • switch式」は、条件に応じて値を返すもの。->を使う。break;は不要。
  • 「switch式」はJava 14から導入された新しい機能で、コードをより簡潔に書ける。
  • 複雑な処理の結果を返す場合は、ブロックを使ってyieldキーワードで値を返す。

「switch式」は、Javaのコードをより分かりやすく、そして安全に書くための強力なツールだよ。最初は少し戸惑うかもしれないけど、慣れてくるとその便利さに気づくはず! ぜひ実際にコードを書いて、色々なパターンを試してみてね。

次回の記事も、Javaの便利な機能について解説していくから、お楽しみに!(ToolDocs | 様々なツールや技術情報を紹介します

コメント

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