Javaのプログラムを書くときに、指定した条件に応じて異なる処理を行うことがよくあります。基本的にはif
文を使うこともできますが、複数の条件を扱うときにはswitch
文を使うとコードがすっきりして読みやすくなる場合があります。
switch
文とは、ある値に基づいて異なるコードを実行するための構文です。例えば、曜日を表す数値に応じて「月曜日」「火曜日」といった文字列を表示するようなイメージ。この文を使うと、条件ごとにコードを書く代わりに、まとめてシンプルに書くことができます。
このページでは、switch
文の基本的な使い方についてわかりやすくご説明します。
はじめに、switch
文の構造とそれを使うための基本的なルールをご説明。その後、具体的な例を通して、実際にどのように使うのかを解説していきます。
関連 Javaの1stステップ:基本的な構文ルールを復習する
Java:Switch文の基本
switch
文は、特定の値に基づいて異なるコードを実行するための構文です。
と言葉だけで説明しても分からないと思うので、早速switch
文の基本的な書き方と、その構成要素についてご説明していきます。
Switch文の基本的な構文
まずは、switch
文の基本的な構文ルールから。
switch (式) { case 値1: // 値1の場合の処理 break; case 値2: // 値2の場合の処理 break; // 必要に応じてcaseを追加 default: // どの値にも一致しない場合の処理 }
switch文の基本1:式
switch
文の最初には、評価される「式」を書きます。式と言っても、基本的には数値や文字列の変数などです。ここでの式は、int
、byte
、short
、char
、String
、またはenum
の型を持っている必要(要は、その式を何らかの形で評価できるかどうか)があります。
参考 Javaの1stステップ:基本構文ルール(変数の使い方)
int day = 3; switch (day) { // ここにcaseラベルと処理を書きます }
switch文の基本2:Caseラベル
次に、case
ラベルを使って、評価された式の値に基づく処理を記述します。各case
の後には、値と、それに対応する処理を書きます。
switch (day) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; // 必要に応じて他のcaseを追加 }
↑変数 day の値に応じて、1の場合は「Monday」を。2の場合は「Tuesday」を。3の場合は「Wednesday」を出力するようにしています。
switch文の基本3:Break文
各case
の処理が終わった後には、break
文を書きます。break
文はswitch
文を抜け出すためのものです。つまり、break
にきたらswitch文の処理をやめて次に移るということ。
これを忘れると、次のcase
の処理も実行されてしまう(フォールスルー)ので注意が必要です。
case 1: System.out.println("Monday"); break; // ここでswitch文を抜ける
フォールスルーとは、case
ブロック内にbreak
文を書かずに次のcase
ブロックの処理も続けて実行することです。これを使うと、似たような処理をまとめて書くことができるので、「あえて」フォールスルーを行うこともあります。
以下の例は、day
が1、2、3の場合に「Weekday」と表示されます。このように、複数のcase
が同じ処理を共有する場合にフォールスルーが有効になる場合があります。
int day = 2; switch (day) { case 1: //case 1~2の場合にはbreakしない case 2: case 3: System.out.println("Weekday"); break; case 4: //case 4の場合にもbreakしない case 5: System.out.println("Almost Weekend"); break; case 6: //case 6の場合にもbreakしない case 7: System.out.println("Weekend"); break; default: System.out.println("Invalid day"); }
switch文の基本4:Defaultラベル
最後に、default
ラベルを使って、どのcase
にも一致しなかった場合の処理を書くというのもポイント。これは必須ではなく任意なのですが、指定しておくと安心です。
int day = 3; switch (day) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saturday"); break; case 7: System.out.println("Sunday"); break; default: System.out.println("Invalid day"); }
- 構文:
switch (式) { case 値1: // 処理1; break; case 値2: // 処理2; break; default: // デフォルトの処理; }
- 式:
switch
キーワードの後に評価される式を書く。例:switch (day)
- caseラベル:
- 式の値に基づいて実行されるコードブロックを指定。例:
case 1: // 処理;
- 式の値に基づいて実行されるコードブロックを指定。例:
- break文:
- 各
case
の終了を示し、switch文から抜け出すために使用。例:break;
- 各
- defaultラベル:
- どのcaseラベルにも一致しない場合に実行されるコードブロックを指定。例:
default: // デフォルトの処理;
- どのcaseラベルにも一致しない場合に実行されるコードブロックを指定。例:
- フォールスルー:
break
文を省略して次のcase
の処理も続けて実行させることができる。
switch文とIf文の違い
ここまでswitch文を学んできましたが、実際はどれもif文でも記述できる処理です。じゃ、実際switch文とif文って何が違うの?っていう疑問が浮かぶ方もいるかもしれません。
ので、ここで同じコードをswitch
文とif
文で書くとそれぞれどうなるかを見てみましょう。
サンプル1 Switch文の場合
int day = 3; switch (day) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saturday"); break; case 7: System.out.println("Sunday"); break; default: System.out.println("Invalid day"); }
サンプル2 If文の場合
int day = 3; if (day == 1) { System.out.println("Monday"); } else if (day == 2) { System.out.println("Tuesday"); } else if (day == 3) { System.out.println("Wednesday"); } else if (day == 4) { System.out.println("Thursday"); } else if (day == 5) { System.out.println("Friday"); } else if (day == 6) { System.out.println("Saturday"); } else if (day == 7) { System.out.println("Sunday"); } else { System.out.println("Invalid day"); }
ご覧のようにSwitch文の一番のメリットは、コードが見やすくなることです。特に複数の条件を扱う場合、switch文を使うとコードの構造がシンプルでわかりやすくなります。
また数値や文字列の比較において、switch文はif文より実行速度が速い場合があります。利用されるシーンや条件にも応じて変わるのですが、プログラムのパフォーマンスを改善する施策の一環としてif文→switch文にリファクタリングされる場合もあります。
一方で、switch文にはデメリットもあります。
まず、複雑な条件を扱うのには向いていません。複数の条件を組み合わせた複雑な判定を行う場合、switch文では表現しづらいかったりします。また、switch文で使用できるデータ型は限られており、int、byte、short、char、String、enumのみに対応しています。
Switch文の実践的な使い方と注意点
Javaのswitch文は、特定の条件に基づいて異なる処理を実行するのに非常に便利。最後に、現場でよくある使い方と注意点、ベストプラクティスについて説明します。
実践例1 ユーザー権限に応じたメニュー表示
実際の現場では、ユーザーの権限に応じて異なるメニューを表示したいような場合があります。このような場合にswitch文が役立ちます。
public class UserMenu { public static void main(String[] args) { String role = "editor"; // 例としてユーザーの役割を設定 switch (role) { case "admin": System.out.println("管理者メニューを表示します"); // 管理者向けの機能をここに追加 break; case "editor": System.out.println("編集者メニューを表示します"); // 編集者向けの機能をここに追加 break; case "viewer": System.out.println("閲覧者メニューを表示します"); // 閲覧者向けの機能をここに追加 break; default: System.out.println("無効な役割です"); // 無効な役割の場合の処理をここに追加 } } }
実践例2 商品カテゴリに応じた割引計算
商品カテゴリに応じて異なる割引を適用する場合の例です。
public class DiscountCalculator { public static void main(String[] args) { String category = "electronics"; // 商品カテゴリを設定 double price = 100.0; // 商品の価格 double discountPrice; switch (category) { case "electronics": discountPrice = price * 0.9; // 10%の割引 System.out.println("電子機器カテゴリの割引価格: " + discountPrice); break; case "clothing": discountPrice = price * 0.8; // 20%の割引 System.out.println("衣類カテゴリの割引価格: " + discountPrice); break; case "food": discountPrice = price * 0.95; // 5%の割引 System.out.println("食品カテゴリの割引価格: " + discountPrice); break; default: System.out.println("無効なカテゴリです。割引なしの価格: " + price); // 無効なカテゴリの場合の処理をここに追加 } } }