読み込み中...

Javaのswitch文!初心者向け10選の使い方とサンプルコード

Javaのswitch文を学ぶ初心者のためのイラスト Java
この記事は約27分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaのswitch文は、ひとつの値に対して複数の分岐を作る制御構文です。条件が増えるほどifelse ifの連鎖は読みづらくなるため、分岐対象が同じ変数ならswitchに置き換えると意図を追いやすくなります。

初心者が最初に押さえたいのは、casedefaultbreakの役割です。その基本を外さなければ、文字列、enumswitch式、パターンマッチングまで同じ考え方で広げられます。

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文の基本構造と使い方
  • 初心者がつまずきやすいbreakdefault、重複caseの注意点
  • 文字列、enum、Lambda式、switch式を使ったサンプルコード
  • パターンマッチングやメソッド呼び出しを使う応用とカスタマイズ
  • TypeScript、Python、JavaScriptとの違いを踏まえた最適化の考え方

Javaのswitch文とは

Javaのswitch文は、switchの括弧内に置いた式の値を評価し、対応するcaseへ処理を移す構文です。公式ドキュメントによれば、従来のswitch文は複数の実行経路を持つ制御文として説明され、byteshortcharintStringenumなどを扱えます。

そのため、同じ変数を何度も比較する処理では、Javaのswitch文が読みやすい候補になります。OracleのThe switch Statementでも、if-then-elseと異なる複数経路の制御として整理されているのが基本です。

一方、条件式が範囲判定や複雑な真偽値の組み合わせなら、ifのほうが自然です。たとえばscore >= 80user != null && user.isActive()のような条件は、値の一致を前提にするswitchよりifで表すほうが扱いやすくなります。

分類主な構文向く場面注意点関連する使い方
基本分岐casebreak値ごとに処理を切り替えるbreak忘れでフォールスルー初心者向けの基本
既定処理default該当しない値を拾う入力値の想定漏れ注意点の確認
複数ラベル空のcaseを並べる複数値で同じ処理意図しない通過最適化の第一歩
文字列判定Stringcaseコマンド名や区分名nullで例外入力チェック
列挙型enum固定された種類値追加時の分岐漏れ応用しやすい設計
switch式->と戻り値値を代入したい処理Java 14以降を想定カスタマイズしやすい
パターンcase String s型で処理を変えるJava 21以降を基準高度な応用

switch文の基本構造

基本構造では、switchの式がcaseの値と一致した位置から処理が始まります。breakに到達すると分岐全体を抜け、どのcaseにも合わない場合はdefaultへ進みます。

// switch文の基本構造
switch (式) {
  case 値1:
    // 値1に一致した場合の処理
    break;
  case 値2:
    // 値2に一致した場合の処理
    break;
  default:
    // どのcaseにも一致しない場合の処理
}

結果: 期待される動きは、式の値に一致したcaseだけが選ばれ、一致がなければdefaultの処理へ進む流れです。

この形を覚えると、Javaのswitch文の使い方はかなり整理しやすくなるのが目安です。特に初心者は、caseの後ろに置く値が定数として扱われる点と、breakで処理範囲を閉じる点を分けて理解すると混乱しにくくなります。

その基本は、public static void mainの中で短いサンプルコードを動かす形で学ぶと定着しやすいです。Javaのメソッドやクラス構造が曖昧な場合は、Javaのオーバーライド解説も参照すると、処理のまとまりを考える助けになります。

switch文の詳細な使い方

Javaのswitch文の詳細な使い方では、整数、複数ラベル、default、文字列を順に確認すると全体像がつかめますが、これは押さえたい点です。サンプルコードごとに分岐対象を少しずつ変えると、intcharStringの違いも自然に見えてきます。

公式ドキュメントのSwitch Expressions and Statementsでは、case L ->形式やyieldにも触れています。ただし、初心者が最初に書く通常のswitch文では、コロン形式のcasebreakを正確に読むことが先になるのがポイントです。

サンプルコード1:基本的なswitch文の使用

基本的なswitch文では、numberの値に応じて出力内容を切り替えます。このサンプルコードは、Javaのswitch文を初めて読む初心者にも、case 1case 2case 3の対応関係が見えやすい形です。

public class Main {
  public static void main(String[] args) {
    int number = 2;
    switch (number) {
      case 1:
        System.out.println("numberは1です");
        break;
      case 2:
        System.out.println("numberは2です");
        break;
      case 3:
        System.out.println("numberは3です");
        break;
      default:
        System.out.println("numberは1, 2, 3以外です");
    }
  }
}

結果: 期待される出力は「numberは2です」です。

このコードでは、int型のnumber2なので、case 2System.out.printlnが対象になります。その後にbreakへ到達するため、case 3defaultには進みません。

サンプルコード2:複数のcaseラベルを持つswitch文

複数の値で同じ処理を行う場合は、caseを続けて書き、処理本体を共有できます。この使い方は重複コードを減らす最適化として扱えますが、意図が読み取れる並べ方にする必要があるのが一般的です。

public class Main {
  public static void main(String[] args) {
    int score = 85;
    switch (score / 10) {
      case 10:
      case 9:
        System.out.println("成績はAです");
        break;
      case 8:
        System.out.println("成績はBです");
        break;
      case 7:
        System.out.println("成績はCです");
        break;
      default:
        System.out.println("成績はDです");
    }
  }
}

結果: 期待される出力は「成績はBです」です。

このサンプルコードでは、score / 108になるため、case 8が選ばれます。一方、case 10case 9は処理を共有しており、90点台と100点を同じ評価にまとめる応用になっています。

サンプルコード3:default節の使用

defaultは、想定したcaseに一致しない値を受け止める役割を持ちますし、これが一つの目安です。入力値が外部から来る処理では、想定外の値を黙って無視しないための注意点として押さえたい要素です。

public class Main {
  public static void main(String[] args) {
    char grade = 'F';
    switch (grade) {
      case 'A':
        System.out.println("優秀です");
        break;
      case 'B':
        System.out.println("良いです");
        break;
      case 'C':
        System.out.println("普通です");
        break;
      default:
        System.out.println("不明な成績です");
    }
  }
}

結果: 期待される出力は「不明な成績です」です。

この例では、grade'A''B''C'のいずれにも一致しません。そのため、Javaのswitch文はdefaultへ進み、未知の値に対するメッセージを返します。

⚠️ 注意: defaultを省略できる場面もありますが、初心者の学習用コードでは残しておくと想定外の入力を見落としにくくなります。特にStringや外部入力を扱う場合は、エラー処理やログ出力と組み合わせる設計が現実的です。

サンプルコード4:文字列を使ったswitch文

Java 7以降では、Stringをswitch文の対象にできるのが現実的です。コマンド名、季節名、区分コードのように、文字列で分岐したい処理では自然な使い方になります。

public class Main {
  public static void main(String[] args) {
    String season = "Spring";
    switch (season) {
      case "Spring":
        System.out.println("春です");
        break;
      case "Summer":
        System.out.println("夏です");
        break;
      case "Autumn":
        System.out.println("秋です");
        break;
      case "Winter":
        System.out.println("冬です");
        break;
      default:
        System.out.println("不明な季節です");
    }
  }
}

結果: 期待される出力は「春です」です。

このサンプルコードでは、season"Spring"なので、対応するcaseが選ばれます。ただし、seasonnullの場合はNullPointerExceptionにつながるため、事前にif (season == null)で分けるなどの対処が必要です。

switch文の応用例

Javaのswitch文は、基本を押さえると応用の幅が広がります。enumConsumerswitch式、パターンマッチングを組み合わせると、分岐後に値を返したり、型ごとに処理を分けたりできると整理できます。

その応用では、構文の短さだけで判断せず、読み手が意図を追えるかを基準にします。初心者にとっては、サンプルコードの行数よりも、どの値がどの処理に結び付くかが明確な構造のほうが学習しやすくなります。

サンプルコード5:enum型と組み合わせたswitch文

enumは、決まった候補だけを値として扱いたいときに使いると理解できます。Javaのswitch文と組み合わせると、文字列の打ち間違いを避けながら、季節や状態のような固定値を分岐できます。

enum Season {
  SPRING, SUMMER, AUTUMN, WINTER
}

public class Main {
  public static void main(String[] args) {
    Season season = Season.SPRING;

    switch (season) {
      case SPRING:
        System.out.println("花が咲きます");
        break;
      case SUMMER:
        System.out.println("暑くなります");
        break;
      case AUTUMN:
        System.out.println("葉が落ちます");
        break;
      case WINTER:
        System.out.println("雪が降ります");
        break;
    }
  }
}

結果: 期待される出力は「花が咲きます」です。

このコードでは、Season.SPRINGcase SPRINGに一致します。enumの候補が増えた場合は、分岐側も見直す必要があるため、状態追加時の注意点として覚えておくとよいです。

サンプルコード6:Lambda式と組み合わせた使い方

Java 8以降のLambda式を使うと、分岐の結果として処理そのものを変数へ入れられます。この使い方では、Consumer<String>にアクション別の処理を代入し、後からacceptで呼び出すると覚えるとよいでしょう。

import java.util.function.Consumer;

public class Main {
  public static void main(String[] args) {
    String action = "RUN";

    Consumer<String> operation = switch (action) {
      case "RUN" -> (x) -> System.out.println(x + " is running");
      case "JUMP" -> (x) -> System.out.println(x + " is jumping");
      case "WALK" -> (x) -> System.out.println(x + " is walking");
      default -> (x) -> System.out.println("Unknown action: " + x);
    };

    operation.accept("John");
  }
}

結果: 期待される出力は「John is running」です。

このサンプルコードでは、action"RUN"なので、走る処理を表すLambda式がoperationへ入ります。一方、分岐ごとに処理が大きくなる場合は、Lambda式を詰め込まず、メソッド参照や専用メソッドへ分けるカスタマイズが読みやすくなります。

サンプルコード7:switch式を使った戻り値の取得

switch式は、分岐の結果を値として返せる構文です。Java 14以降では標準機能として扱えるため、分岐結果をStringintへ代入したい処理で使いやすくなると考えられます。

public class Main {
  public static void main(String[] args) {
    String season = "春";

    // switch式で戻り値を取得
    String message = switch (season) {
      case "春" -> "花が咲きます";
      case "夏" -> "暑くなります";
      case "秋" -> "葉が落ちます";
      case "冬" -> "雪が降ります";
      default -> "該当なし";
    };

    System.out.println("この季節は:" + message);
  }
}

結果: 期待される出力は「この季節は:花が咲きます」です。

この例では、->の右側に置いた文字列がmessageへ入ります。従来のcase:形式よりbreak忘れが起きにくく、分岐の結果をひとつの値へ集約する最適化にも向いています。

サンプルコード8:パターンマッチングを活用したswitch文

Java 21では、パターンマッチングを使ったswitchが正式な機能として扱われますが、覚えておくと役立つでしょう。OpenJDKのJEP 441では、switchにパターンを拡張し、複雑なデータ指向の問い合わせを表現しやすくする目的が示されています。

public class Main {
  public static void main(String[] args) {
    Object obj = "Java";

    switch (obj) {
      case Integer i -> System.out.println("整数値:" + i);
      case String s -> System.out.println("文字列:" + s);
      default -> System.out.println("その他の型");
    }
  }
}

結果: 期待される出力は「文字列:Java」です。

このコードでは、Object型のobjが実際にはStringなので、case String sが選ばれます。ただし、パターンマッチングは学習順としては応用側に置き、基本のcasedefaultを理解した後に扱うほうが無理なく進められます。

💡 Tips: Javaの新しい構文を使う場合は、プロジェクトのsourceCompatibilitytargetCompatibility--releaseの設定も合わせて確認すると言えるでしょう。構文自体を知っていても、ビルド設定が古いとコンパイルできない場合があります。

注意点と対処法

Javaのswitch文には、初心者がつまずきやすい注意点があります。代表的なのはcaseラベルの重複、break忘れ、Stringnull、バージョン差による構文の可否です。

その対処法は、コンパイルエラーになるものと、コンパイルは通るが意図と違う動きをするものを分けて考えることです。重複caseはコンパイル時に止まりますが、フォールスルーは構文として許されるため、レビュー時に見落とされやすくなるのが基本です。

switch文の落とし穴

caseラベルは同じswitchブロック内で重複できません。次のサンプルコードは、意図的にcase 1を重ねた例で、Javaコンパイラが重複を検出します。

public class Main {
  public static void main(String[] args) {
    int num = 1;

    // caseラベルの重複
    switch (num) {
      case 1:
        System.out.println("1です");
        break;
      case 1:  // 重複
        System.out.println("重複している1です");
        break;
      default:
        System.out.println("その他です");
    }
  }
}

結果: 期待される結果はコンパイルエラーです。caseラベルが重複しているため、通常の出力は得られません。

この問題は、caseの値を一意にすることで解消できます。似た値を同じ処理にまとめたい場合は、重複させるのではなく、複数のcaseを連続させるか、Java 14以降のcase 1, 2 ->のような表現を検討します。

break文の重要性

breakがない場合、一致したcaseの後ろにある処理へ流れるフォールスルーが起きますし、ここを基本と考えるとよいでしょう。意図して使うこともできますが、初心者のサンプルコードでは誤動作の原因として現れることが多いです。

public class Main {
  public static void main(String[] args) {
    int num = 1;

    // break文の欠落
    switch (num) {
      case 1:
        System.out.println("1です");
        // break文がない
      case 2:
        System.out.println("2です");
        break;
      default:
        System.out.println("その他です");
    }
  }
}

結果: 期待される出力は「1です」と「2です」の2行です。

この動きは、case 1の処理後にbreakがないため、case 2の処理も続けて評価されることから起きます。意図的なフォールスルーでなければ、各caseの末尾にbreakを置くか、->形式のswitch式へ切り替えると対処できます。

nullを扱うときの注意点

Stringを使ったJavaのswitch文では、対象がnullになるとNullPointerExceptionが発生するのが目安です。この注意点は、フォーム入力、設定ファイル、外部APIの戻り値を扱う処理で特に見落とされやすいです。

public class Main {
  public static void main(String[] args) {
    String command = null;

    if (command == null) {
      System.out.println("コマンドが未指定です");
      return;
    }

    switch (command) {
      case "start":
        System.out.println("開始します");
        break;
      case "stop":
        System.out.println("停止します");
        break;
      default:
        System.out.println("不明なコマンドです");
    }
  }
}

結果: 期待される出力は「コマンドが未指定です」です。

このサンプルコードでは、switchへ入る前にnullを判定しています。そのため、commandが未設定でも例外ではなく明示的なメッセージへ流れ、入力チェックとしての基本を満たせます。

⚠️ 注意: Java 21のパターンマッチングを使うswitchではcase nullを扱える場面があるのがポイントです。ただし、従来のString分岐と混同すると読み手が迷うため、採用するJavaバージョンを明示してから使うのが現実的です。

カスタマイズ方法

Javaのswitch文をカスタマイズするときは、分岐内にすべての処理を書くのではなく、メソッド呼び出しや条件の追加で役割を分けます。こうした書き方は、サンプルコードが大きくなったときの読みやすさと保守性に直結します。

そのため、カスタマイズの基本は「分岐は選択を担当し、詳細な処理は別メソッドへ渡す」と整理できるのが一般的です。メソッドの引数や戻り値に慣れていない場合は、Javaアノテーションの解説のように、宣言と処理対象の関係を読む練習も役立ちます。

サンプルコード9:カスタマイズされたswitch文の作成例

分岐ごとにメソッドを呼び出す形にすると、switch文本体は処理の選択に集中できます。演算の種類をoperationで受け取り、足し算、引き算、掛け算を別メソッドへ分けるサンプルコードです。

public class Main {
  public static void main(String[] args) {
    String operation = "add";

    // カスタマイズされたswitch文
    switch (operation) {
      case "add":
        performAddition(5, 3);
        break;
      case "subtract":
        performSubtraction(5, 3);
        break;
      case "multiply":
        performMultiplication(5, 3);
        break;
      default:
        System.out.println("無効な操作です");
    }
  }

  public static void performAddition(int a, int b) {
    System.out.println("足し算の結果:" + (a + b));
  }

  public static void performSubtraction(int a, int b) {
    System.out.println("引き算の結果:" + (a - b));
  }

  public static void performMultiplication(int a, int b) {
    System.out.println("掛け算の結果:" + (a * b));
  }
}

結果: 期待される出力は「足し算の結果:8」です。

このコードでは、operation"add"なのでperformAdditionが呼び出されます。一方、処理名が増えすぎる場合は、Mapに関数を登録する設計や、クラスで責務を分ける設計もカスタマイズ候補になります。

サンプルコード10:switch文の拡張の考え方

switch文の中で追加条件を判定したい場合は、ifを組み合わせる方法があるのが現実的です。偶数か奇数かをnum % 2で分けた後、偶数の中でも5より大きいかを判断する例です。

public class Main {
  public static void main(String[] args) {
    int num = 10;

    // switch文の拡張
    switch (num % 2) {
      case 0:
        System.out.println(num + "は偶数です");
        if (num > 5) {
          System.out.println("また、5より大きい偶数です");
        }
        break;
      case 1:
        System.out.println(num + "は奇数です");
        break;
      default:
        System.out.println("無効な数字です");
    }
  }
}

結果: 期待される出力は「10は偶数です」と「また、5より大きい偶数です」の2行です。

この応用では、switchが大分類、ifが補助条件を担当しています。ただし、条件が深くネストするほど読みにくくなるため、複雑な判定は専用メソッドへ切り出す最適化が有効です。

yieldを使うswitch式のカスタマイズ

switch式で複数行の処理を行いながら値を返したい場合は、yieldを使います。->の右側にブロックを置き、最後に返す値をyieldで示す形です。

public class Main {
  public static void main(String[] args) {
    int rank = 2;

    String label = switch (rank) {
      case 1 -> "Gold";
      case 2 -> {
        String prefix = "Silver";
        yield prefix + " Member";
      }
      case 3 -> "Bronze";
      default -> "Guest";
    };

    System.out.println(label);
  }
}

結果: 期待される出力は「Silver Member」です。

このサンプルコードでは、case 2の中でprefixを作り、yieldlabelに渡しています。短い値の切り替えなら単純な->で十分ですが、途中で加工が必要な場合はこの使い方が扱いやすくなります。

Java以外の言語でのswitch文

Javaのswitch文を理解した後は、TypeScript、Python、JavaScriptとの違いを見ると、言語ごとの設計が整理できると整理できます。名前が似ていても、型チェック、比較方法、代替構文は同じではありません。

一方、どの言語でも共通するのは、ひとつの値を複数候補と比べる処理に向いている点です。JavaScriptのswitchについては、MDNのswitchで、case句へ制御が移る仕組みが説明されています。

TypeScriptのswitch文との違い

TypeScriptのswitchは、見た目の構文がJavaとよく似ています。違いは、let day: stringのような型注釈により、開発時に型の不一致を検出しやすい点です。

let day: string = "Monday";

// TypeScriptにおけるswitch文
switch(day) {
    case "Monday":
        console.log("今日は月曜日です");
        break;
    case "Tuesday":
        console.log("今日は火曜日です");
        break;
    default:
        console.log("不明な日です");
}

結果: 期待される出力は「今日は月曜日です」です。

このコードでは、day"Monday"なので最初のcaseが選ばれます。Javaと同じくbreakを使うため、初心者が構文を比較するときはフォールスルーの扱いを共通の注意点として確認できます。

Pythonのswitch文相当の機能

Pythonには、Javaの従来型switch文と同じ名前の構文はありません。単純な条件分岐ではifelifelseを使い、Python 3.10以降では用途に応じてmatch文も検討されますし、ここがポイントです。

day = "Monday"

# Pythonにおけるswitch文相当の処理
if day == "Monday":
    print("今日は月曜日です")
elif day == "Tuesday":
    print("今日は火曜日です")
else:
    print("不明な日です")

結果: 期待される出力は「今日は月曜日です」です。

この例では、dayと文字列を順に比較しています。Javaのswitch文より冗長に見える場合がありますが、範囲条件や複雑な真偽条件を混ぜるなら、if-elif-elseのほうが自然に表現できます。

JavaScriptのswitch文の特徴

JavaScriptのswitchは、構文上はJavaに近い形です。ただし、比較は厳密等価に基づくため、5"5"は別の値として扱われますが、これは押さえたい点です。

let value = "5";

// JavaScriptにおけるswitch文
switch(value) {
    case 5:
        console.log("数値の5です");
        break;
    case "5":
        console.log("文字列の5です");
        break;
    default:
        console.log("それ以外です");
}

結果: 期待される出力は「文字列の5です」です。

このサンプルコードでは、valueが文字列の"5"なので、数値のcase 5ではなく文字列のcase "5"に一致します。JavaScriptでは=====の違いが別の学習項目になるため、switch文の比較も型を意識して読む必要があります。

ℹ️ 補足: Java、TypeScript、JavaScriptはいずれもbreak忘れに注意が必要です。Pythonのif-elif-elseには同じ形のフォールスルーはありませんが、条件の順序によって到達する分岐が変わる点は共通の注意点です。

まとめ

Javaのswitch文は、同じ値を複数の候補と比較する処理を読みやすく整理できると理解できます。初心者は、switchcasedefaultbreakの基本を固めると、サンプルコードの分岐を追いやすくなります。

その基本が身についたら、StringenumConsumerswitch式、yield、パターンマッチングへ応用できます。Javaのバージョンによって使える構文が変わるため、学習時はJDKの設定と公式ドキュメントを合わせて確認することが欠かせません。

一方、注意点としては、break忘れ、case重複、null、複雑すぎるネストがあると覚えるとよいでしょう。対処法として、defaultで想定外の値を拾い、処理が膨らむ場合はメソッド分割やswitch式による最適化を検討すると、保守しやすいコードに近づきます。

Javaの基礎を広げるなら、日付判定ではJavaでうるう年を判定する解説、文字の扱いではJavaエスケープ処理の解説も合わせて読むと、条件分岐とデータ処理の接点が見えます。switch文の使い方を単独で覚えるより、入力、判定、出力の流れとして整理するほうが実務的な理解につながりますし、これが一つの目安です。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。