Java switchの使い方

この記事のポイント

Javaのswitch文は、複数の条件分岐を整理して記述できる構文です。

この記事を読むと、次のようなことが身に付きます。

  • 1つの変数に対して複数の値を効率よく振り分ける方法がわかる
  • 従来の書き方とJava 14以降の新しい書き方の両方を習得できる
  • 実務でよく使われる実用的なswitch文のプログラム例を知る

この記事を通して、switch文の正しい使い方をマスターすれば、枝分かれの多い複雑なプログラムも読みやすく整理できるようになります。

目次

switchとは?

Javaのswitch文は、変数の値に応じて処理を枝分かれさせるための構文です。

たくさんの選択肢があるときに「もしAならこの処理、Bならこの処理、Cなら……」とif-else文をいくつもつなげて書くと、コードが長くなり読みづらくなってしまいます。switch文を使うと、このような複数の条件分岐をすっきりと整理して記述できます。

評価する式の値と各caseで指定した値を比べ、一致した場所の処理を実行する仕組みです。

switch文の特徴

  • 一つの変数や式の値に基づいて複数の選択肢から実行する処理を選べる
  • case節を並べることで複雑な分岐も直感的に記述できる
  • どの条件にも当てはまらない場合の処理はdefault節に記述する
  • 整数型String、列挙型などの値を比較の対象にできる
  • Java 14以降では矢印演算子を用いたより簡潔な書き方も導入されている

switch文プログラムの流れを整理し、特定の条件に応じた動作を効率よく実現するために欠かせない機能です。

【関連】
Javaをもっと詳しく学ぶならpaizaラーニング

基本構文

switch文は、switchキーワードのあとに判定したい値をカッコ「()」で囲み、波カッコ「{}」の中にcase節を並べて書きます。各case節にはコロン「:」を付け、処理の最後にはbreak文を記述します。break文を書くことで、あとに続くcase節の処理が実行されるのを防ぎます。

まずは、数値や文字列を使って分岐させる基本的なプログラムを見ていきましょう。

public class Main { public static void main(String[] args) { int number = 2; switch (number) { case 1: System.out.println("1が選ばれました"); break; case 2: System.out.println("2が選ばれました"); break; case 3: System.out.println("3が選ばれました"); break; default: System.out.println("その他の数値です"); } } }

出力結果

2が選ばれました

この例では、変数に入った数値に応じて出力するメッセージを切り替えています。まず、変数numberに代入された「2」をswitch文で判定します。case 1から順番に値を比較し、一致したcase 2の中にある処理が実行されます。最後にbreak文があるため、そのあとの処理は行わずにswitch文を抜けます。

次に、文字列を使った書き方を紹介します。

public class Main { public static void main(String[] args) { String fruit = "りんご"; switch (fruit) { case "みかん": System.out.println("冬の果物です"); break; case "りんご": System.out.println("秋の果物です"); break; case "すいか": System.out.println("夏の果物です"); break; default: System.out.println("季節不明の果物です"); } } }

出力結果

秋の果物です

この例では、String型の変数を使って果物の名前に応じた季節を表示しています。プログラムの構造は数値のときと同じです。変数fruitの値が「りんご」なので、case "りんご"の部分が実行されます。どのcaseにも当てはまらないときは、default節の処理が実行される仕組みです。

Java 14以降では、アロー演算子「->」を使ったより簡潔な記法も利用できます。

public class Main { public static void main(String[] args) { int day = 3; String dayType = switch (day) { case 1, 2, 3, 4, 5 -> "平日"; case 6, 7 -> "休日"; default -> "不正な値"; }; System.out.println(dayType); } }

出力結果

平日

この例では、switch式と呼ばれる新しい書き方で平日の判定を行っています。アロー演算子を使うとbreak文を書く必要がなく、複数の値をカンマで区切って一行にまとめられるのが特徴です。判定した結果をそのまま変数dayTypeに代入できるため、全体がすっきりとまとまります。

実用例

switch文は、現場の開発でも多くの場面で使われています。ここでは、よくあるシーンを想定したプログラムを紹介します。

それぞれの例では、従来の基本的な書き方から、Java 14以降で使える便利な新しい記法まで幅広く取り上げました。まずはプログラム全体の動きを確認し、そのあとの解説で一つひとつの仕組みを理解していきましょう。

曜日に応じたメッセージ表示

曜日を表す数値を受け取り、その日に合わせたメッセージを表示するプログラムです。

public class Main { public static void main(String[] args) { int dayOfWeek = 1; switch (dayOfWeek) { case 1: System.out.println("月曜日です。今週も頑張りましょう"); break; case 5: System.out.println("金曜日です。もうすぐ週末ですね"); break; case 6: case 7: System.out.println("週末です。ゆっくり休みましょう"); break; default: System.out.println("平日です"); } } }

出力結果

月曜日です。今週も頑張りましょう

この例では、1から7までの数値で曜日を判断してメッセージを出力しています。まず、変数dayOfWeekの値が「1」のため、最初のcase 1に一致して月曜日のメッセージが表示されます。case 6とcase 7のようにcase節を続けて書くと、土曜日と日曜日のどちらでも同じ処理を実行させることができます。

季節判定処理

月の数値を見て、その月がどの季節に当てはまるかを判定します。

public class Main { public static void main(String[] args) { int month = 7; String season = switch (month) { case 3, 4, 5 -> "春"; case 6, 7, 8 -> "夏"; case 9, 10, 11 -> "秋"; case 12, 1, 2 -> "冬"; default -> "不正な月"; }; System.out.println(month + "月は" + season + "です"); } }

出力結果

7月は夏です

この例では、Java 14以降の新しい構文を使って月ごとの季節を変数に代入しています。まず、変数monthの「7」を判定し、case 6, 7, 8のグループに一致するため「夏」という文字列が選ばれます。カンマを使うことで、3ヶ月分をまとめて一つのグループとして扱えるため、コードが読みやすくなります。

動物の鳴き声判定

動物の名前をもとに、その動物の鳴き声を表示するプログラムです。

public class Main { public static void main(String[] args) { String animal = "ネコ"; String sound = switch (animal) { case "イヌ" -> "ワンワン"; case "ネコ" -> "ニャー"; case "ウシ" -> "モー"; case "ブタ" -> "ブーブー"; default -> "不明な動物"; }; System.out.println(animal + "は" + sound + "と鳴きます"); } }

出力結果

ネコはニャーと鳴きます

この例では、文字列型の変数を使って動物の鳴き声を判定しています。まず、変数animalの中身が「ネコ」であることを確認し、対応する「ニャー」という値を返しています。equalsメソッドを使った比較と同じように、文字列の内容を正確に判定して処理を振り分けています。

グレード評価の変換

数値によるグレードを文字評価に変換する処理です。

public class Main { public static void main(String[] args) { int grade = 85; char evaluation = switch (grade / 10) { case 10, 9 -> 'A'; case 8 -> 'B'; case 7 -> 'C'; case 6 -> 'D'; default -> 'F'; }; System.out.println("点数: " + grade + " 評価: " + evaluation); } }

出力結果

点数: 85 評価: B

この例では、計算式の結果を使って成績の評価を決定しています。まず、点数を10で割ることで、80点台なら「8」、90点台なら「9」という数値を作り出します。85点を10で割ると「8」になるため、case 8の評価である「B」が選ばれます。このように計算結果を直接判定に使えるのがswitch文の便利な点です。

コマンド処理の振り分け

ユーザーからの入力コマンドに応じて、処理を振り分けます。

public class Main { public static void main(String[] args) { String command = "save"; switch (command) { case "save": System.out.println("データを保存しています"); break; case "load": System.out.println("データを読み込んでいます"); break; case "exit": System.out.println("プログラムを終了します"); break; default: System.out.println("不明なコマンドです"); } } }

出力結果

データを保存しています

この例では、特定の命令(コマンド)を受け取ってシステムを動かす流れを再現しています。まず、変数commandに「save」という指示が入っているため、データの保存処理が実行されます。もし定義されていないコマンドが入力された場合は、default節でエラーメッセージを出すことで、不測の事態にも対応できる仕組みになっています。

拡張子による処理分岐

ファイルの拡張子に応じて、適切な処理タイプを判定します。

public class Main { public static void main(String[] args) { String fileName = "document.pdf"; String extension = fileName.substring(fileName.lastIndexOf(".") + 1); String fileType = switch (extension.toLowerCase()) { case "jpg", "png", "gif" -> "画像ファイル"; case "pdf", "doc", "txt" -> "文書ファイル"; case "mp3", "wav" -> "音声ファイル"; case "mp4", "avi" -> "動画ファイル"; default -> "不明なファイル"; }; System.out.println(fileType + "です: " + fileName); } }

出力結果

文書ファイルです: document.pdf

この例では、ファイル名から取り出した拡張子を判定してファイルの種類を決めています。まず、プログラムでドットのあとの文字列を抜き出し、小文字に変換して変数に格納します。今回の「pdf」は文書ファイルのグループに含まれるため、文書ファイルとして出力されます。複数の拡張子を一つのcaseにまとめることで、似た形式のファイルを効率よく分類しています。

月の日数計算

年月を指定して、その月が何日まであるかを計算します。

public class Main { public static void main(String[] args) { int month = 2; int year = 2024; int days = switch (month) { case 1, 3, 5, 7, 8, 10, 12 -> 31; case 4, 6, 9, 11 -> 30; case 2 -> (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ? 29 : 28; default -> -1; }; System.out.println(year + "年" + month + "月は" + days + "日です"); } }

出力結果

2024年2月は29日です

この例では、月ごとの日数の違いをswitch文で判定しています。まず、1月から12月までの月を日数の長さでグループ分けします。2月の場合は、うるう年かどうかを計算する複雑な条件式をcase節の中に記述しています。2024年はうるう年の条件を満たすため、計算の結果として「29」という正しい日数が導き出されます。

エラーコード変換

システムが発生させた数値のエラーコードを、人が読みやすい言葉に翻訳します。

public class Main { public static void main(String[] args) { int errorCode = 404; String message = switch (errorCode) { case 200 -> "正常に処理されました"; case 400 -> "リクエストが不正です"; case 404 -> "ページが見つかりません"; case 500 -> "サーバーエラーが発生しました"; default -> "未定義のエラー: " + errorCode; }; System.out.println("エラーコード " + errorCode + ": " + message); } }

出力結果

エラーコード 404: ページが見つかりません

この例では、Webサイトなどでよく見かける数値のコードから、エラーの内容を判定しています。まず、変数errorCodeの「404」を調べ、対応する「ページが見つかりません」というメッセージを取得します。もし知らない番号が来ても、default節で番号をそのまま表示させることで、原因が何であるかを把握しやすくしています。

まとめ

Javaのswitch文は、複数の条件分岐を効率的に記述するための構文です。if-else文をいくつもつなげるよりも、コードの構造が分かりやすくなります。

switch文が活用できる場面は次のようなケースです。

switch文が活躍する場面

  • メニューの選択項目や状態管理に応じた条件分岐をしたいとき
  • ファイルの形式やデータの種類によって処理を振り分けたいとき
  • エラーコードや数値をわかりやすいメッセージに変換したいとき

switch文を用いる上で、押さえておきたいポイントを覚えておきましょう。

重要なポイント

  • 従来の書き方ではbreak文を忘れないように記述する
  • アロー演算子を使うとbreak文が不要で簡潔に記述できる
  • default節を用意して予期しない値にも対応させる

従来の構文に加えて、Java 14以降では新しい書き方も導入され、より短いコードで記述できるようになりました。紹介した実用例を参考に、状況に応じて適切にswitch文を活用してください。

複雑な条件を処理するコードは、実際の開発現場でよく使用されます。マスターしておけば役立つこと間違いなしです。

ぜひswitch文をマスターして、より実用的なプログラムを作成できるようになりましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェック

  1. paizaラーニングトップ
  2. リファレンス
  3. Javaのリファレンス記事一覧
  4. Java switchの使い方