switch 文
switch 文 とは
値による多分岐を簡潔に書く switch 文を学び、case と break、default の使い方をマスターしよう。
switch 文とは
if-else を何段にもつなげて「値が 1 なら〜、2 なら〜、3 なら〜」のように書くと、コードがすぐに縦に長くなって読みにくくなります。こうした 1 つの値を見て、その値ごとに違う処理を行いたい 場面で活躍するのが switch 文です。Java では古くから用意されていて、C 言語や C++、JavaScript、Go など他の多くの言語にも同じ構文が存在します。
switch文は「値による多分岐」を簡潔に書くための専用構文です。条件式がtrueかfalseかを問うif文と違って、switchは 対象の値そのもの を見て、どのcaseに飛ぶかを決めます。
このレッスンでは、Solution.dayName(int day) メソッドを switch で書きます。1 なら "Monday"、2 なら "Tuesday"、というように、1 から 7 の整数を曜日名に変換するシンプルな課題です。これを if-else で書くと 7 段の階段になってしまいますが、switch を使うと一目で「何を見て分岐しているのか」がわかります。
switch 文の基本文法
switch 文の基本形は次の通りです。
Java
switch (式) {
case 値1:
// 値1 のときの処理
break;
case 値2:
// 値2 のときの処理
break;
default:
// どの case にも当てはまらないときの処理
break;
}登場人物は次のとおりです。
switch (式)— 評価したい値を 1 つ書く。intcharStringenumなどが使えるcase 値:—switchの値が一致したときに飛ぶラベル。値はリテラル (定数) のみbreak;—switchブロックから抜ける。これがないと 次のcaseに流れ込む (後述)default:— どのcaseにも一致しなかったときの処理。省略可能だが、書いておくのが安全
caseの値は コンパイル時に確定する定数 でなければなりません。case x:のように変数を書くとconstant expression requiredエラーになります。case 1:やcase "Monday":のようにリテラル、またはfinalで宣言された定数のみ使えます。
実際に書いてみる
曜日番号 (1 〜 7) を曜日名に変換する処理を switch で書くと次のようになります。
Java
public class Solution {
public static String dayName(int day) {
switch (day) {
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
case 7:
return "Sunday";
default:
return "Invalid";
}
}
}ここでは break; の代わりに return を使っています。メソッドの中で return を書くと、その時点でメソッド全体から抜けるので、switch ブロックからも当然抜けます。return を書く場合は break; は不要、というより 書くとコンパイルエラー になります (到達不能コード扱い)。
比較のため、if-else で書いたバージョンも見てみましょう。
Java
public class SolutionIf {
public static String dayName(int day) {
if (day == 1) return "Monday";
else if (day == 2) return "Tuesday";
else if (day == 3) return "Wednesday";
else if (day == 4) return "Thursday";
else if (day == 5) return "Friday";
else if (day == 6) return "Saturday";
else if (day == 7) return "Sunday";
else return "Invalid";
}
}どちらも結果は同じですが、switch の方が「day という値を 1 つだけ見ている」という意図がはっきりします。if-else だと毎行に day == ... が登場して、読み手が「ずっと day の話だな」と確認しないといけません。
switch の分岐フローを図で確認
switch (day) が 1 から 7 までと default のどこに飛ぶかをフローチャートで表すと次のようになります。
見ての通り、switch は上から順に case をチェックしていき、一致した時点でそのブロックに飛びます。どれにも当てはまらなかったら最後に default に到達します。if-else の階段とほぼ同じ動きですが、専用構文なので Java コンパイラは内部的にジャンプテーブル (添字テーブル) で最適化することがあり、case が多いほど if-else より高速になる可能性があります。
「ジャンプテーブル」は配列のような表で、
caseの値を添字にして直接ジャンプ先を引きます。if-elseの上から順に判定するより、caseの数が多いと圧倒的に速い、という特徴があります。実務では速度より読みやすさでswitchを選ぶことが多いですが、知っておくと得です。
case と break の役割と fall-through
break; の話に戻ります。switch の 最大の落とし穴 が、break を書かないと 次の case に流れ込む という挙動です。これを fall-through (フォールスルー) と呼びます。
Java
switch (day) {
case 1:
System.out.println("Monday");
// break を忘れた!
case 2:
System.out.println("Tuesday");
break;
default:
System.out.println("Other");
}このコードに day = 1 を渡すと、なんと Monday と Tuesday の両方 が出力されます。case 1: のブロックが終わった後も break がないため、そのまま case 2: のブロックに流れ込んで、Tuesday を出力してから break; で抜けるためです。
fall-throughは意図的に使うこともあります。たとえばcase 1: case 2: case 3:のようにbreakを書かずに並べると、「1 か 2 か 3 のどれかなら同じ処理」という書き方ができます。ただし意図せずbreakを忘れた fall-through は ほぼ確実にバグ なので、現代のJava(14+) ではswitch式という新しい構文で fall-through を防ぐ書き方も用意されています。
この課題では case の各ブロックで return を書くので、fall-through の心配はありません。return した時点でメソッドが終了するため、その下の case には絶対に流れません。
default の役割
default: は、どの case にも一致しなかったときに実行されるブロックです。文法上は省略できますが、書かないと 想定外の値が来たときに何も起きずに通り抜ける という危険な状態になります。
Java
switch (day) {
case 1: return "Monday";
case 2: return "Tuesday";
// default なし
}
// ← day が 1 でも 2 でもないとここに来てしまう (戻り値なしでコンパイルエラー)戻り値があるメソッドで default を書き忘れると、コンパイラが「missing return statement」と怒ってくれることが多いです。逆に void メソッドだと黙って通り抜けてしまうので、default は 常に書く 癖を付けておくと安全です。
この課題では 1 〜 7 以外の値 (例えば 0 や 8、負の数) が来たら "Invalid" を返す、と仕様で決まっています。これを default で受けるのが定石です。
switch と if-else の使い分け
両者は似た役割を持ちますが、得意な場面が違います。次のように使い分けるとよいでしょう。
switchが得意 — 1 つの値の 離散的な値 (123... や"OPEN""CLOSED"など) で分岐するときif-elseが得意 —score >= 80、age < 20 && hasLicenseのような 範囲や複数条件の組み合わせ で分岐するとき
「3 つ以下の分岐なら
if-else、4 つ以上ならswitch」という経験則もあります。少ない分岐でswitchを使うと逆に冗長になりがちなので、無理せずif-elseで書きましょう。
よくある間違い
switch 文には新人エンジニアが必ずやらかす落とし穴がいくつかあります。代表的な 4 つを押さえておきましょう。
breakを忘れる — 一番多いミス。case 1:の処理後にbreak;を書かないと、case 2:のブロックに勝手に流れ込みます。returnで抜ける形なら起きませんが、System.out.println(...)などで終わる場合は 必ずbreak;を最後に書くことcaseの値の型ミスマッチ —switch (day)でdayがintなのにcase "1":と書くと、incompatible types: String cannot be converted to intというエラーが出ます。caseの値はswitchの式と 同じ型 にする必要がありますdefaultを書き忘れる — 戻り値があるメソッドだとmissing return statementのコンパイルエラーで気づけますが、voidメソッドだと黙って通り抜けてバグの温床になります。defaultは常に書く習慣を付けましょうswitch式 (Java 14+) との混同 —Java 14から追加されたswitch式 はString s = switch (day) { case 1 -> "Monday"; ... };のように->(アロー) を使う新構文です。従来のswitch文 (case ... :+break;) とは別物で、構文を混ぜると';' expectedなどのエラーが出ます。このレッスンでは古典的なswitch文の方を使います
古典的な
switch文と新しいswitch式は 見た目が似ているが別物 です。アロー->を使うかコロン:を使うかが見分けるポイント。混ぜて書くとコンパイラに怒られます。
やってみよう
それでは右側のエディタで課題に挑戦しましょう。Solution.dayName(int day) メソッドは、1 〜 7 の整数を受け取って、対応する英語の曜日名 ("Monday" 〜 "Sunday") を返します。それ以外の値 (例えば 0、8、-3) が来たら "Invalid" を返してください。
書く手順は次の通りです。
switch (day) { ... }でdayの値を見るswitch文を書くcase 1:case 2:...case 7:でそれぞれ対応する曜日名をreturnするdefault:で"Invalid"をreturnする- 実行してテストがすべて緑になることを確認する
return を使うので break; は書きません。書くと unreachable statement エラーになります。
慣れてきたら、いくつかの応用を試してみてください。たとえば case 1: case 2: case 3: case 4: case 5: return "Weekday"; のように case を並べて「平日」「週末」だけを返すメソッドを別に作ってみると、fall-through を 意図的に使う 書き方が身につきます。switch 文は古い構文ですが、いまも現役で大量のコードに登場します。ここでしっかりマスターしておきましょう。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は 三項演算子 で、値による多分岐を簡潔に書く switch 文を学び、case と break、default の使い方をマスターしよう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- switch の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. switch とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はdayName、引数はint dayの 1 つ、戻り値はStringにすること - 実装には必ず
switch文を使い、case 1:〜case 7:とdefault:を含めること 1〜7で対応する英語の曜日名 (Monday〜Sunday)、それ以外は"Invalid"を返すこと
入出力例
test-cases.txt
dayName(1) → "Monday"
dayName(5) → "Friday"
dayName(7) → "Sunday"
dayName(0) → "Invalid"
dayName(8) → "Invalid"