はじめに
Java Silverの学習を進めている際、Switch文、Switch式について学ぶ機会がありました。
条件分岐処理は普段if文を使って書くことが大半なので、備忘録としてまとめてみようと思います。
※誤りありましたら、ご指摘いただけますと幸いです。
想定読者
初学者の方
普段Javaを使用している方
Switch文とは
Java14で正式に追加された、複数の条件分岐を簡潔に記述するための制御構造のことを言います。
特定の変数の値に基づいて異なるコードブロックを実行することができます。
if文と似ていますが、条件分岐が多くなる場合は、Switch文を使用した方が可動性は向上するかと思います。
実際の使い方
実際の使い方を見ていきましょう。
ここでは2つの書き方を取り上げます。
1, オーソドックスな書き方
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
case 5:
System.out.println("Friday");
break;
case 6:
System.out.println("Saturday");
break;
case 7:
System.out.println("Sunday");
break;
default:
System.out.println("Error");
break;
}
Wednesday
上記がオーソドックスなSwitch文の書き方になります。
今回はint型の変数dayに1~7まで値が設定され、1から順番に対応して曜日が出力されるケースです。
まず、switch()に評価される式を代入します。今回はdayです。
その後、caseに続いて条件として、今回はdayの値を記述します。この時、文末はコロン (:
) になるので要注意です。
caseで条件が合致した場合はcase内に処理を記述します。今回は出力するのみです。
どの条件にも一致しない場合の処理はdefault:
以降に記述できます。default:
の記述は任意です。
最後にbreak;
を記述し、次のcaseを記述していきます。
ちなみにこのbreak;
ですが、記述を忘れると、それ以降のcase処理もすべて実行されてしまう、フォールスルーが発生してしまいます。
下記コードを見てみましょう。
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
case 2:
System.out.println("Tuesday");
case 3:
System.out.println("Wednesday");
case 4:
System.out.println("Thursday");
case 5:
System.out.println("Friday");
case 6:
System.out.println("Saturday");
case 7:
System.out.println("Sunday");
default:
System.out.println("Error");
}
Wednesday
Thursday
Friday
Saturday
Sunday
Error
上記のように、各caseの最後にbreak;
をつけ忘れるとフォールスルーが発生しています。
今回はday=3でしたので、Wednesdayのcaseで条件が合致、その後にbreak;
をつけていないことで、それに続くcaseやdefaultの処理が全て実行されてしまいました。
2, ->を使用する
int day = 3;
switch (day) {
case 1 -> System.out.println("Monday");
case 2 -> System.out.println("Tuesday");
case 3 -> System.out.println("Wednesday");
case 4 -> System.out.println("Thursday");
case 5 -> System.out.println("Friday");
case 6 -> System.out.println("Saturday");
case 7 -> System.out.println("Sunday");
default -> System.out.println("Error");
};
Wednesday
例①と全く同じ式を、「->」を使用して書き直した例です。
非常にコンパクトで見やすくなりました。
この形は、先程と異なりbreak;が不要なので、書き忘れもなくなると思います。
今回、「->」の後に{}はありませんが、複数処理記載したい時は{}必須なので注意してください。
Switch式とは
Switch文とは異なり、こちらは式になるので、実行結果の値を直接変数に代入したり、メソッドに引数に渡したりすることが可能になっています。
実際の使い方
実際の使い方を見ていきましょう。
ここでも2つの書き方を取り上げます。
ちなみにSwitch式では、Switch文と異なり必ず値が必要となるため、defaultを省略した場合、スイッチされる値がすべてのcaseラベルに一致しない場合に例外がスローされる可能性があります。
そのため、通常はdefaultケースを含めることが推奨されます。
1, yieldを使用した書き方
int day = 3;
System.out.println("Today is " +
switch (day) {
case 1: yield "Monday";
case 2: yield "Tuesday";
case 3: yield "Wednesday";
case 4: yield "Thursday";
case 5: yield "Friday";
case 6: yield "Satursday";
case 7: yield "Sunday";
default: yield "Error";
} );
Today is Wednesday
こちらはyieldを使用した書き方です。
case
の後に「:
」を使用する場合は、yield
に続けて戻す値を指定します。
2, ->を使用した書き方
int day = 8;
System.out.println("Today is " +
switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6 -> "Satursday";
case 7 -> "Sunday";
default -> {System.out.println("1~7までの値を入力してください");
yield "Error";}
} );
1~7までの値を入力してください
Today is Error
こちらは「->
」を使用した書き方です。
処理の後に戻す値を直接記述できますが、今回のdefaultの処理のように処理が複数にわたる場合については、yieldを使用する必要があります。
まとめ
Switch文は、if文に比べて直感的に見やすく、条件が多岐にわたる場合はこちらの方が見やすいケースもあるかと思いました。
まだ登場してからそこまで時間が経っていない分、目にする機会は少ないかもしれませんが、理解しておくとインプットするスピードも上がると思うので、知識として覚えておきたいと思います。