switch 文

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

switch 文 とは

値による多分岐を簡潔に書く switch 文を学び、case と break、default の使い方をマスターしよう。

switch 文とは

if-else を何段にもつなげて「値が 1 なら〜、2 なら〜、3 なら〜」のように書くと、コードがすぐに縦に長くなって読みにくくなります。こうした 1 つの値を見て、その値ごとに違う処理を行いたい 場面で活躍するのが switch 文です。Java では古くから用意されていて、C 言語や C++JavaScriptGo など他の多くの言語にも同じ構文が存在します。

switch 文は「値による多分岐」を簡潔に書くための専用構文です。条件式が truefalse かを問う if 文と違って、switch対象の値そのもの を見て、どの case に飛ぶかを決めます。

このレッスンでは、Solution.dayName(int day) メソッドを switch で書きます。1 なら "Monday"2 なら "Tuesday"、というように、1 から 7 の整数を曜日名に変換するシンプルな課題です。これを if-else で書くと 7 段の階段になってしまいますが、switch を使うと一目で「何を見て分岐しているのか」がわかります。

switch 文の基本文法

switch 文の基本形は次の通りです。

Java

switch () { case1: // 値1 のときの処理 break; case2: // 値2 のときの処理 break; default: // どの case にも当てはまらないときの処理 break; }

登場人物は次のとおりです。

  • switch (式) — 評価したい値を 1 つ書く。int char String enum などが使える
  • case 値:switch の値が一致したときに飛ぶラベル。値はリテラル (定数) のみ
  • break;switch ブロックから抜ける。これがないと 次の case に流れ込む (後述)
  • default: — どの case にも一致しなかったときの処理。省略可能だが、書いておくのが安全

case の値は コンパイル時に確定する定数 でなければなりません。case x: のように変数を書くと constant expression required エラーになります。case 1:case "Monday": のようにリテラル、または final で宣言された定数のみ使えます。

実際に書いてみる

曜日番号 (17) を曜日名に変換する処理を 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 のどこに飛ぶかをフローチャートで表すと次のようになります。

diagram (will load when visible)

見ての通り、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 を渡すと、なんと MondayTuesday の両方 が出力されます。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常に書く 癖を付けておくと安全です。

この課題では 17 以外の値 (例えば 08、負の数) が来たら "Invalid" を返す、と仕様で決まっています。これを default で受けるのが定石です。

switch と if-else の使い分け

両者は似た役割を持ちますが、得意な場面が違います。次のように使い分けるとよいでしょう。

  • switch が得意 — 1 つの値の 離散的な値 (1 2 3 ... や "OPEN" "CLOSED" など) で分岐するとき
  • if-else が得意score >= 80age < 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)dayint なのに case "1": と書くと、incompatible types: String cannot be converted to int というエラーが出ます。case の値は switch の式と 同じ型 にする必要があります
  • default を書き忘れる — 戻り値があるメソッドだと missing return statement のコンパイルエラーで気づけますが、void メソッドだと黙って通り抜けてバグの温床になります。default は常に書く習慣を付けましょう
  • switch 式 (Java 14+) との混同Java 14 から追加された switchString s = switch (day) { case 1 -> "Monday"; ... }; のように -> (アロー) を使う新構文です。従来の switch 文 (case ... : + break;) とは別物で、構文を混ぜると ';' expected などのエラーが出ます。このレッスンでは古典的な switch 文の方を使います

古典的な switch 文と新しい switch 式は 見た目が似ているが別物 です。アロー -> を使うかコロン : を使うかが見分けるポイント。混ぜて書くとコンパイラに怒られます。

やってみよう

それでは右側のエディタで課題に挑戦しましょう。Solution.dayName(int day) メソッドは、17 の整数を受け取って、対応する英語の曜日名 ("Monday""Sunday") を返します。それ以外の値 (例えば 08-3) が来たら "Invalid" を返してください。

書く手順は次の通りです。

  1. switch (day) { ... }day の値を見る switch 文を書く
  2. case 1: case 2: ... case 7: でそれぞれ対応する曜日名を return する
  3. default:"Invalid"return する
  4. 実行してテストがすべて緑になることを確認する

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 つができることを確認しましょう。

  1. switch の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. switch とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は dayName、引数は int day の 1 つ、戻り値は String にすること
  2. 実装には必ず switch 文を使い、case 1:case 7:default: を含めること
  3. 17 で対応する英語の曜日名 (MondaySunday)、それ以外は "Invalid" を返すこと

入出力例

test-cases.txt

dayName(1)"Monday" dayName(5)"Friday" dayName(7)"Sunday" dayName(0)"Invalid" dayName(8)"Invalid"

ヒント

main.java
main.java
学習モード

メモ

switch 文

⌘S で保存