はじめに
Javaのswitch文は、ひとつの値に対して複数の分岐を作る制御構文です。条件が増えるほどifとelse ifの連鎖は読みづらくなるため、分岐対象が同じ変数ならswitchに置き換えると意図を追いやすくなります。
初心者が最初に押さえたいのは、case、default、breakの役割です。その基本を外さなければ、文字列、enum、switch式、パターンマッチングまで同じ考え方で広げられます。
Javaの制御構文全体を整理したい場合は、関連する型やメソッドの理解も役立ちますし、ここがポイントです。たとえば配列やコレクションを扱う場面では、Java List型完全ガイドと合わせると、分岐後のデータ処理までつなげて理解できます。
- Java SE 21 / JDK 21を基準に記述
- 一部の構文はJava 7、Java 8、Java 14、Java 21以降の差分を本文内で補足
- TypeScript 5系、Python 3.12、ECMAScript 2024相当の構文も比較対象として扱います
- Javaのswitch文の基本構造と使い方
- 初心者がつまずきやすい
break、default、重複caseの注意点 - 文字列、
enum、Lambda式、switch式を使ったサンプルコード - パターンマッチングやメソッド呼び出しを使う応用とカスタマイズ
- TypeScript、Python、JavaScriptとの違いを踏まえた最適化の考え方
Javaのswitch文とは
Javaのswitch文は、switchの括弧内に置いた式の値を評価し、対応するcaseへ処理を移す構文です。公式ドキュメントによれば、従来のswitch文は複数の実行経路を持つ制御文として説明され、byte、short、char、int、String、enumなどを扱えます。
そのため、同じ変数を何度も比較する処理では、Javaのswitch文が読みやすい候補になります。OracleのThe switch Statementでも、if-then-elseと異なる複数経路の制御として整理されているのが基本です。
一方、条件式が範囲判定や複雑な真偽値の組み合わせなら、ifのほうが自然です。たとえばscore >= 80やuser != null && user.isActive()のような条件は、値の一致を前提にするswitchよりifで表すほうが扱いやすくなります。
| 分類 | 主な構文 | 向く場面 | 注意点 | 関連する使い方 |
|---|---|---|---|---|
| 基本分岐 | caseとbreak | 値ごとに処理を切り替える | break忘れでフォールスルー | 初心者向けの基本 |
| 既定処理 | default | 該当しない値を拾う | 入力値の想定漏れ | 注意点の確認 |
| 複数ラベル | 空のcaseを並べる | 複数値で同じ処理 | 意図しない通過 | 最適化の第一歩 |
| 文字列判定 | Stringのcase | コマンド名や区分名 | nullで例外 | 入力チェック |
| 列挙型 | enum | 固定された種類 | 値追加時の分岐漏れ | 応用しやすい設計 |
| switch式 | ->と戻り値 | 値を代入したい処理 | Java 14以降を想定 | カスタマイズしやすい |
| パターン | case String s | 型で処理を変える | Java 21以降を基準 | 高度な応用 |
switch文の基本構造
基本構造では、switchの式がcaseの値と一致した位置から処理が始まります。breakに到達すると分岐全体を抜け、どのcaseにも合わない場合はdefaultへ進みます。
結果: 期待される動きは、式の値に一致したcaseだけが選ばれ、一致がなければdefaultの処理へ進む流れです。
この形を覚えると、Javaのswitch文の使い方はかなり整理しやすくなるのが目安です。特に初心者は、caseの後ろに置く値が定数として扱われる点と、breakで処理範囲を閉じる点を分けて理解すると混乱しにくくなります。
その基本は、public static void mainの中で短いサンプルコードを動かす形で学ぶと定着しやすいです。Javaのメソッドやクラス構造が曖昧な場合は、Javaのオーバーライド解説も参照すると、処理のまとまりを考える助けになります。
switch文の詳細な使い方
Javaのswitch文の詳細な使い方では、整数、複数ラベル、default、文字列を順に確認すると全体像がつかめますが、これは押さえたい点です。サンプルコードごとに分岐対象を少しずつ変えると、int、char、Stringの違いも自然に見えてきます。
公式ドキュメントのSwitch Expressions and Statementsでは、case L ->形式やyieldにも触れています。ただし、初心者が最初に書く通常のswitch文では、コロン形式のcaseとbreakを正確に読むことが先になるのがポイントです。
サンプルコード1:基本的なswitch文の使用
基本的なswitch文では、numberの値に応じて出力内容を切り替えます。このサンプルコードは、Javaのswitch文を初めて読む初心者にも、case 1、case 2、case 3の対応関係が見えやすい形です。
結果: 期待される出力は「numberは2です」です。
このコードでは、int型のnumberが2なので、case 2のSystem.out.printlnが対象になります。その後にbreakへ到達するため、case 3やdefaultには進みません。
サンプルコード2:複数のcaseラベルを持つswitch文
複数の値で同じ処理を行う場合は、caseを続けて書き、処理本体を共有できます。この使い方は重複コードを減らす最適化として扱えますが、意図が読み取れる並べ方にする必要があるのが一般的です。
結果: 期待される出力は「成績はBです」です。
このサンプルコードでは、score / 10が8になるため、case 8が選ばれます。一方、case 10とcase 9は処理を共有しており、90点台と100点を同じ評価にまとめる応用になっています。
サンプルコード3:default節の使用
defaultは、想定したcaseに一致しない値を受け止める役割を持ちますし、これが一つの目安です。入力値が外部から来る処理では、想定外の値を黙って無視しないための注意点として押さえたい要素です。
結果: 期待される出力は「不明な成績です」です。
この例では、gradeが'A'、'B'、'C'のいずれにも一致しません。そのため、Javaのswitch文はdefaultへ進み、未知の値に対するメッセージを返します。
defaultを省略できる場面もありますが、初心者の学習用コードでは残しておくと想定外の入力を見落としにくくなります。特にStringや外部入力を扱う場合は、エラー処理やログ出力と組み合わせる設計が現実的です。サンプルコード4:文字列を使ったswitch文
Java 7以降では、Stringをswitch文の対象にできるのが現実的です。コマンド名、季節名、区分コードのように、文字列で分岐したい処理では自然な使い方になります。
結果: 期待される出力は「春です」です。
このサンプルコードでは、seasonが"Spring"なので、対応するcaseが選ばれます。ただし、seasonがnullの場合はNullPointerExceptionにつながるため、事前にif (season == null)で分けるなどの対処が必要です。
switch文の応用例
Javaのswitch文は、基本を押さえると応用の幅が広がります。enum、Consumer、switch式、パターンマッチングを組み合わせると、分岐後に値を返したり、型ごとに処理を分けたりできると整理できます。
その応用では、構文の短さだけで判断せず、読み手が意図を追えるかを基準にします。初心者にとっては、サンプルコードの行数よりも、どの値がどの処理に結び付くかが明確な構造のほうが学習しやすくなります。
サンプルコード5:enum型と組み合わせたswitch文
enumは、決まった候補だけを値として扱いたいときに使いると理解できます。Javaのswitch文と組み合わせると、文字列の打ち間違いを避けながら、季節や状態のような固定値を分岐できます。
結果: 期待される出力は「花が咲きます」です。
このコードでは、Season.SPRINGがcase SPRINGに一致します。enumの候補が増えた場合は、分岐側も見直す必要があるため、状態追加時の注意点として覚えておくとよいです。
サンプルコード6:Lambda式と組み合わせた使い方
Java 8以降のLambda式を使うと、分岐の結果として処理そのものを変数へ入れられます。この使い方では、Consumer<String>にアクション別の処理を代入し、後からacceptで呼び出すると覚えるとよいでしょう。
結果: 期待される出力は「John is running」です。
このサンプルコードでは、actionが"RUN"なので、走る処理を表すLambda式がoperationへ入ります。一方、分岐ごとに処理が大きくなる場合は、Lambda式を詰め込まず、メソッド参照や専用メソッドへ分けるカスタマイズが読みやすくなります。
サンプルコード7:switch式を使った戻り値の取得
switch式は、分岐の結果を値として返せる構文です。Java 14以降では標準機能として扱えるため、分岐結果をStringやintへ代入したい処理で使いやすくなると考えられます。
結果: 期待される出力は「この季節は:花が咲きます」です。
この例では、->の右側に置いた文字列がmessageへ入ります。従来のcase:形式よりbreak忘れが起きにくく、分岐の結果をひとつの値へ集約する最適化にも向いています。
サンプルコード8:パターンマッチングを活用したswitch文
Java 21では、パターンマッチングを使ったswitchが正式な機能として扱われますが、覚えておくと役立つでしょう。OpenJDKのJEP 441では、switchにパターンを拡張し、複雑なデータ指向の問い合わせを表現しやすくする目的が示されています。
結果: 期待される出力は「文字列:Java」です。
このコードでは、Object型のobjが実際にはStringなので、case String sが選ばれます。ただし、パターンマッチングは学習順としては応用側に置き、基本のcaseとdefaultを理解した後に扱うほうが無理なく進められます。
💡 Tips: Javaの新しい構文を使う場合は、プロジェクトのsourceCompatibility、targetCompatibility、--releaseの設定も合わせて確認すると言えるでしょう。構文自体を知っていても、ビルド設定が古いとコンパイルできない場合があります。
注意点と対処法
Javaのswitch文には、初心者がつまずきやすい注意点があります。代表的なのはcaseラベルの重複、break忘れ、Stringのnull、バージョン差による構文の可否です。
その対処法は、コンパイルエラーになるものと、コンパイルは通るが意図と違う動きをするものを分けて考えることです。重複caseはコンパイル時に止まりますが、フォールスルーは構文として許されるため、レビュー時に見落とされやすくなるのが基本です。
switch文の落とし穴
caseラベルは同じswitchブロック内で重複できません。次のサンプルコードは、意図的にcase 1を重ねた例で、Javaコンパイラが重複を検出します。
結果: 期待される結果はコンパイルエラーです。caseラベルが重複しているため、通常の出力は得られません。
この問題は、caseの値を一意にすることで解消できます。似た値を同じ処理にまとめたい場合は、重複させるのではなく、複数のcaseを連続させるか、Java 14以降のcase 1, 2 ->のような表現を検討します。
break文の重要性
breakがない場合、一致したcaseの後ろにある処理へ流れるフォールスルーが起きますし、ここを基本と考えるとよいでしょう。意図して使うこともできますが、初心者のサンプルコードでは誤動作の原因として現れることが多いです。
結果: 期待される出力は「1です」と「2です」の2行です。
この動きは、case 1の処理後にbreakがないため、case 2の処理も続けて評価されることから起きます。意図的なフォールスルーでなければ、各caseの末尾にbreakを置くか、->形式のswitch式へ切り替えると対処できます。
nullを扱うときの注意点
Stringを使ったJavaのswitch文では、対象がnullになるとNullPointerExceptionが発生するのが目安です。この注意点は、フォーム入力、設定ファイル、外部APIの戻り値を扱う処理で特に見落とされやすいです。
結果: 期待される出力は「コマンドが未指定です」です。
このサンプルコードでは、switchへ入る前にnullを判定しています。そのため、commandが未設定でも例外ではなく明示的なメッセージへ流れ、入力チェックとしての基本を満たせます。
switchではcase nullを扱える場面があるのがポイントです。ただし、従来のString分岐と混同すると読み手が迷うため、採用するJavaバージョンを明示してから使うのが現実的です。カスタマイズ方法
Javaのswitch文をカスタマイズするときは、分岐内にすべての処理を書くのではなく、メソッド呼び出しや条件の追加で役割を分けます。こうした書き方は、サンプルコードが大きくなったときの読みやすさと保守性に直結します。
そのため、カスタマイズの基本は「分岐は選択を担当し、詳細な処理は別メソッドへ渡す」と整理できるのが一般的です。メソッドの引数や戻り値に慣れていない場合は、Javaアノテーションの解説のように、宣言と処理対象の関係を読む練習も役立ちます。
サンプルコード9:カスタマイズされたswitch文の作成例
分岐ごとにメソッドを呼び出す形にすると、switch文本体は処理の選択に集中できます。演算の種類をoperationで受け取り、足し算、引き算、掛け算を別メソッドへ分けるサンプルコードです。
結果: 期待される出力は「足し算の結果:8」です。
このコードでは、operationが"add"なのでperformAdditionが呼び出されます。一方、処理名が増えすぎる場合は、Mapに関数を登録する設計や、クラスで責務を分ける設計もカスタマイズ候補になります。
サンプルコード10:switch文の拡張の考え方
switch文の中で追加条件を判定したい場合は、ifを組み合わせる方法があるのが現実的です。偶数か奇数かをnum % 2で分けた後、偶数の中でも5より大きいかを判断する例です。
結果: 期待される出力は「10は偶数です」と「また、5より大きい偶数です」の2行です。
この応用では、switchが大分類、ifが補助条件を担当しています。ただし、条件が深くネストするほど読みにくくなるため、複雑な判定は専用メソッドへ切り出す最適化が有効です。
yieldを使うswitch式のカスタマイズ
switch式で複数行の処理を行いながら値を返したい場合は、yieldを使います。->の右側にブロックを置き、最後に返す値をyieldで示す形です。
結果: 期待される出力は「Silver Member」です。
このサンプルコードでは、case 2の中でprefixを作り、yieldでlabelに渡しています。短い値の切り替えなら単純な->で十分ですが、途中で加工が必要な場合はこの使い方が扱いやすくなります。
Java以外の言語でのswitch文
Javaのswitch文を理解した後は、TypeScript、Python、JavaScriptとの違いを見ると、言語ごとの設計が整理できると整理できます。名前が似ていても、型チェック、比較方法、代替構文は同じではありません。
一方、どの言語でも共通するのは、ひとつの値を複数候補と比べる処理に向いている点です。JavaScriptのswitchについては、MDNのswitchで、case句へ制御が移る仕組みが説明されています。
TypeScriptのswitch文との違い
TypeScriptのswitchは、見た目の構文がJavaとよく似ています。違いは、let day: stringのような型注釈により、開発時に型の不一致を検出しやすい点です。
結果: 期待される出力は「今日は月曜日です」です。
このコードでは、dayが"Monday"なので最初のcaseが選ばれます。Javaと同じくbreakを使うため、初心者が構文を比較するときはフォールスルーの扱いを共通の注意点として確認できます。
Pythonのswitch文相当の機能
Pythonには、Javaの従来型switch文と同じ名前の構文はありません。単純な条件分岐ではif、elif、elseを使い、Python 3.10以降では用途に応じてmatch文も検討されますし、ここがポイントです。
結果: 期待される出力は「今日は月曜日です」です。
この例では、dayと文字列を順に比較しています。Javaのswitch文より冗長に見える場合がありますが、範囲条件や複雑な真偽条件を混ぜるなら、if-elif-elseのほうが自然に表現できます。
JavaScriptのswitch文の特徴
JavaScriptのswitchは、構文上はJavaに近い形です。ただし、比較は厳密等価に基づくため、5と"5"は別の値として扱われますが、これは押さえたい点です。
結果: 期待される出力は「文字列の5です」です。
このサンプルコードでは、valueが文字列の"5"なので、数値のcase 5ではなく文字列のcase "5"に一致します。JavaScriptでは==と===の違いが別の学習項目になるため、switch文の比較も型を意識して読む必要があります。
break忘れに注意が必要です。Pythonのif-elif-elseには同じ形のフォールスルーはありませんが、条件の順序によって到達する分岐が変わる点は共通の注意点です。まとめ
Javaのswitch文は、同じ値を複数の候補と比較する処理を読みやすく整理できると理解できます。初心者は、switch、case、default、breakの基本を固めると、サンプルコードの分岐を追いやすくなります。
その基本が身についたら、String、enum、Consumer、switch式、yield、パターンマッチングへ応用できます。Javaのバージョンによって使える構文が変わるため、学習時はJDKの設定と公式ドキュメントを合わせて確認することが欠かせません。
一方、注意点としては、break忘れ、case重複、null、複雑すぎるネストがあると覚えるとよいでしょう。対処法として、defaultで想定外の値を拾い、処理が膨らむ場合はメソッド分割やswitch式による最適化を検討すると、保守しやすいコードに近づきます。
Javaの基礎を広げるなら、日付判定ではJavaでうるう年を判定する解説、文字の扱いではJavaエスケープ処理の解説も合わせて読むと、条件分岐とデータ処理の接点が見えます。switch文の使い方を単独で覚えるより、入力、判定、出力の流れとして整理するほうが実務的な理解につながりますし、これが一つの目安です。
関連記事
- Java List型完全ガイド!初心者でもマスターできる7つのステップ
- Javaアノテーションの12選!初心者から上級者まで徹底ガイド
- Javaでうるう年を判定!初心者でも分かる9ステップ解説
- Javaエスケープ処理の10ステップマスターガイド
- Javaでマスターする!オーバーライドのたった7つのステップ
※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。


