switch 文
break を 1 つ忘れると、下の case まで動く
同じ変数を == 1 == 2 == 3 と何度も書き並べると、読む側は毎行「まだ同じ変数の話か」と確かめることになります。switch なら見る値を先頭で 1 度書くだけなので、その確認が要りません。
そのかわり、switch には if に無い落とし穴が 1 つあります。
Java
switch (size) {
case 1:
System.out.println("S");
case 2:
System.out.println("M");
break;
default:
System.out.println("L");
}size が 1 のとき、画面には S と M の両方が出ます。case 1: のブロックに break; が無いので、処理はそのまま case 2: のブロックへ流れ落ちるからです。これを fall-through と呼びます。
case は「そこから始める目印」であって、「そこだけ実行する箱」ではありません。止めたい場所には自分で break; を置きます。上の例なら System.out.println("S"); の次の行に 1 行足せば、S だけが出るようになります。
case 1:case 2:と処理を書かずに続けて並べると「1 でも 2 でも同じ処理」という意味になります。fall-through をわざと使う唯一の形です。
return で抜けるなら break は書けない
メソッドの中で return を書くと、その場でメソッドごと終わります。switch からも当然抜けるので、break; は要りません。
Java
case 1:
return "S";ここに break; を足すと、絶対に届かない行になるため unreachable statement で弾かれます。break で抜けるか return で抜けるか、どちらか片方です。
default: は、どの case にも当たらなかったときの行き先です。戻り値のあるメソッドで書き忘れると、値を返さない道が残るので missing return statement になります。
なお Java 14 以降には case 1 -> "S"; と矢印で書く新しい形もあり、そちらでは fall-through が起きません。このレッスンでは case ... : と break の形を使います。
やってみよう
dayName(int day) を完成させてください。1 から 7 の整数を英語の曜日名にして返し、それ以外は "Invalid" を返します。
switch (day)で見る値を 1 度だけ書くcase 1:からcase 7:まで並べ、それぞれの中で曜日名をreturnするdefault:で"Invalid"をreturnする- 実行して
15708の 5 件を通す
return で抜けるので break; は書きません。曜日の綴りは先頭が大文字で、Monday から Sunday までテストと 1 文字ずつ一致している必要があります。ロジックが正しくても綴りで落ちるので、実行前に一度読み直してください。
要件
- クラス名は
Solution、メソッド名はdayName、引数はint dayの 1 つ、戻り値はStringにすること - 実装には必ず
switch文を使い、case 1:〜case 7:とdefault:を含めること 1〜7で対応する英語の曜日名 (Monday〜Sunday)、それ以外は"Invalid"を返すこと
入出力例
dayName(1) → "Monday"
dayName(5) → "Friday"
dayName(7) → "Sunday"
dayName(0) → "Invalid"
dayName(8) → "Invalid"