Javaのswitch文を徹底解説!case・defaultの書き方と実例まとめ
生徒
「条件分岐といえばif文が有名ですが、他にも便利な書き方があると聞きました。」
先生
「そうですね。特定の値によって処理を分けたいときは、switch文を使うとコードがすっきりと整理されますよ。」
生徒
「if文と何が違うんですか?どんなときに使い分ければいいのか知りたいです。」
先生
「それでは、switch文の基本的な仕組みから実践的な使い方まで、詳しく見ていきましょう!」
1. Javaのswitch文とは何か?
Javaのプログラミングにおいて、条件によって処理を分岐させる方法は大きく分けて二つあります。一つは「if文」、そしてもう一つが今回解説する「switch文」です。switch文は、ある一つの変数や式の値を評価し、その値が一致するケースに基づいて特定の処理を実行するための制御構文です。
例えば、信号機の色が「赤なら止まる」「青なら進む」「黄色なら注意」といったように、一つの対象に対して複数の選択肢がある場合に非常に有効です。if文でも同じことは実現できますが、条件が増えれば増えるほどコードが複雑になりがちです。switch文を利用することで、可読性が高く、後から見返しても理解しやすいプログラムを書くことができます。
初心者のうちは「全部if文で書けばいいのでは?」と思いがちですが、現場のエンジニアは用途に合わせてswitch文を使いこなしています。まずは基本の型をしっかり覚えて、コードを綺麗に保つ技術を身につけていきましょう。特にJavaのバージョンが上がるにつれて、switch文はより強力で便利な機能へと進化を遂げています。
2. switch文の基本構造と書き方
switch文の基本的な構文は、switchキーワードの後に評価したい変数を記述し、その中身をcaseというラベルで区切って記述します。それぞれのケースの最後には、処理を終了してswitchブロックから抜けるためのbreak文を記述するのが一般的です。もしどのケースにも当てはまらない場合の処理を書きたいときは、defaultを使用します。
以下に、最も標準的なswitch文の書き方を示します。この例では、整数の値に応じて表示するメッセージを切り替えています。
public class SwitchBasicExample {
public static void main(String[] args) {
int ranking = 2;
switch (ranking) {
case 1:
System.out.println("金メダルです!おめでとうございます!");
break;
case 2:
System.out.println("銀メダルです!素晴らしい結果です!");
break;
case 3:
System.out.println("銅メダルです!よく頑張りました!");
break;
default:
System.out.println("入賞おめでとうございます!");
break;
}
}
}
実行結果は以下のようになります。
銀メダルです!素晴らしい結果です!
このプログラムでは、変数rankingの値が2であるため、case 2:の処理が実行されます。もし変数の値が10であれば、どのcaseにも一致しないため、最終的にdefault:の処理が動く仕組みになっています。このように、あらかじめ決まった値との比較を行う際に、非常に見通しの良いコードが書けるのがswitch文の魅力です。
3. break文の役割と注意点
switch文を学ぶ上で最も重要なキーワードの一つがbreakです。breakは、現在実行中の処理を中断し、switchブロックの外へ脱出するための命令です。もしこのbreakを書き忘れてしまうと、意図しない動作を引き起こす原因となります。これを「フォールスルー(Fall-through)」と呼びます。
フォールスルーが発生すると、一致したcaseの処理が終わった後も、次のcaseの処理を続けて実行してしまいます。例えば、先ほどのランキングの例でcase 1:のbreakを消すと、1位だった場合に「金メダル」と「銀メダル」の両方のメッセージが表示されてしまうのです。基本的には各caseの末尾に必ずbreakを入れる癖をつけましょう。
ただし、意図的にbreakを書かない手法もあります。例えば、複数のcaseで全く同じ処理を行いたい場合です。「月」の数値を見て、それが「平日」か「休日」かを判定するようなプログラムでは、複数の値をまとめて処理することができます。このように、言語の仕様を正しく理解することで、無駄なコードを省くテクニックも磨かれていきます。
4. defaultを効果的に活用する方法
defaultは、どのcaseにも該当しなかった場合に実行される「その他すべて」を受け持つ特別な場所です。if文でいうところの最後のelseに近い役割を果たします。defaultの記述は必須ではありませんが、予期しない値が変数に入ってきた際のエラーハンドリングとして、記述しておくことが推奨されます。
開発の現場では、想定外の入力があったときに「不正な値です」と警告を出したり、初期値を設定したりするために使われます。また、defaultは慣習的にswitchブロックの一番最後に書くことが多いですが、実は途中に書くことも可能です。しかし、読みやすさを考慮すると最後に配置するのがベストプラクティスと言えるでしょう。初心者の方は、まず「例外的な処理はdefaultに任せる」という意識を持つだけで、バグの少ない堅牢なプログラムが書けるようになります。
5. 文字列や列挙型を使った応用例
Javaの初期のバージョンでは、switch文で扱えるのは整数(intやcharなど)だけでしたが、現在のJavaではString(文字列)やEnum(列挙型)も扱うことができます。これにより、プログラムの表現力が大幅に向上しました。例えば、ユーザーから入力された「コマンド名」を直接比較して処理を分けるといった使い方が可能です。
以下のサンプルコードでは、曜日の文字列を受け取って、その日のゴミ出しの予定を表示するプログラムを作成しました。文字列比較ができるようになったことで、直感的にコードの内容を把握できるようになっています。
public class SwitchStringExample {
public static void main(String[] args) {
String dayOfWeek = "Monday";
switch (dayOfWeek) {
case "Monday":
System.out.println("今日は燃えるゴミの日です。");
break;
case "Wednesday":
System.out.println("今日は資源ゴミの日です。");
break;
case "Friday":
System.out.println("今日は燃えないゴミの日です。");
break;
default:
System.out.println("今日はゴミ出しはありません。");
break;
}
}
}
実行結果は以下の通りです。
今日は燃えるゴミの日です。
このように、文字列を扱う場合でも数値と同じ感覚で記述できるため、非常に汎用性が高いことがわかります。ただし、文字列の場合は「大文字と小文字」を区別するため、"Monday"と"monday"は別物として扱われる点には注意が必要です。確実に判定したい場合は、あらかじめ大文字に統一するなどの工夫を行うのがプロのテクニックです。
6. 複数の値をまとめるcaseの書き方
複数のケースで同じ処理を実行したい場合、caseを並べて記述することで処理を共通化できます。これを活用することで、コードの重複を防ぎ、メンテナンス性を高めることができます。例えば、1月から12月までの月情報から「季節」を判定するようなプログラムを考えてみましょう。
以下の例では、春、夏、秋、冬というカテゴリーに複数の月を割り当てています。caseを縦に並べるだけで、「または(OR)」の条件を簡単に表現できるのです。
public class SeasonChecker {
public static void main(String[] args) {
int month = 8;
String season;
switch (month) {
case 3:
case 4:
case 5:
season = "春";
break;
case 6:
case 7:
case 8:
season = "夏";
break;
case 9:
case 10:
case 11:
season = "秋";
break;
case 12:
case 1:
case 2:
season = "冬";
break;
default:
season = "不明な月";
break;
}
System.out.println(month + "月は" + season + "です。");
}
}
実行結果は以下のようになります。
8月は夏です。
この書き方を知っておくと、条件分岐が大幅にスッキリします。if文でif (month == 6 || month == 7 || month == 8)と書くよりも、構造が明確で読みやすいことがわかりますね。特にビジネスロジックで「特定の区分ごとに処理を分けたい」というシーンでは、このテクニックが非常に役立ちます。
7. 最新のJavaで使えるswitch式について
Java 14以降、従来の「switch文」に加えて「switch式」という新しい書き方が導入されました。これまでのswitch文は「処理を分岐させるための命令」でしたが、switch式は「結果として値を返す」ことができるようになりました。また、矢印演算子(->)を使うことで、煩わしいbreak文を省略できるようになっています。
最新の書き方を使うと、先ほどの季節判定プログラムはさらに短縮されます。breakの書き忘れによるバグを構造的に防ぐことができるため、モダンなJava開発ではこちらの書き方が主流になりつつあります。初心者の方も、基礎を理解した後はぜひこの新しいスタイルに挑戦してみてください。
public class ModernSwitchExample {
public static void main(String[] args) {
String fruit = "Apple";
int price = switch (fruit) {
case "Apple", "Orange" -> 150;
case "Banana" -> 100;
case "Melon" -> 500;
default -> 0;
};
System.out.println(fruit + "の価格は" + price + "円です。");
}
}
実行結果は以下のようになります。
Appleの価格は150円です。
注目すべきは、int price = switch...という形で、switchの結果を直接変数に代入している点です。また、case "Apple", "Orange"のようにカンマ区切りで複数の値を指定できるのも便利な特徴です。コード量が減り、意味が明確になるため、積極的に取り入れたい機能の一つです。
8. if文とswitch文の使い分け基準
プログラミングを学んでいると、必ず「いつif文を使い、いつswitch文を使うべきか」という疑問に直面します。結論から言うと、判断基準は「条件の性質」にあります。if文は、範囲指定(例:100以上かつ200未満)や複雑な論理式(例:AかつB、またはCではない)を扱うのが得意です。
対してswitch文は、特定の変数が「具体的などの値か」を比較することに特化しています。値が明確に決まっているリストがあり、それに基づいて分岐させる場合はswitch文の方が圧倒的に見やすくなります。また、処理の分岐数が多い場合、内部的な最適化によってswitch文の方がわずかに実行速度が速くなることもありますが、現代のコンピュータでは微々たる差です。まずは「他人が読んだときにどちらが意図を理解しやすいか」という可読性を最優先に考えるのが、優れたプログラマへの第一歩です。
9. 実践!プログラムでの活用シーン
実際のアプリケーション開発において、switch文はどのような場面で使われているのでしょうか。代表的な例として「メニュー選択」や「ステータス管理」が挙げられます。例えば、RPGゲームの戦闘シーンを想像してみてください。ユーザーが選んだコマンドが「攻撃」「防御」「魔法」「逃げる」のどれであるかに応じて、実行するメソッドを切り替える際にswitch文は最適です。
また、Webサービスにおいて注文状況を「未決済」「発送準備中」「発送済み」「キャンセル」といったステータスで管理する場合にも、それぞれの状態に応じた表示変更にswitch文が多用されます。このように、システムの状態を定義する「定数」との相性が抜群に良いため、実務レベルのコードでは必ずといっていいほど登場します。基本をマスターすることで、プロが書くような本格的なプログラムの構造を理解できるようになります。