Javaのswitch文とは?switch-case文を使った条件分岐も解説

switch文は、Java以外にも他のプログラミング言語で使用される文法です。

しかし、Java switch文の書き方は特殊なので、Java初学者にとって難しく感じてしまうでしょう。

そこで本記事では、switch文を理解したいJava初学者の方向けに、switch文について解説していきます。

Java switch文の基本構文から、応用的な使い方まで触れていますので、ぜひ参考にしてみてください。

Javaのswitch文とは?

switch文とは、特定の制御式の値によって、処理の分岐を行う文法です。

似た役割としてif文がありますが、本記事ではJavaのswitch文について紹介します。

サンプルコードをご紹介します。

  int num = 3;
switch (num){
 case 1:
  System.out.println(“値は1です。”);
  break;
 case 2:
  System.out.println(“値は2です。”);
  break;
 case 3:
  System.out.println(“値は3です。”);
  break;
}

上記のサンプルコードでは、「値は3です。」が実行結果です。

変数numの値である3に合致した「case 3」配下の処理が実行されています。

このようにswitch文では、式の値に合致したcaseへ処理を分岐させることが可能です。

Javaにおけるswitch文の基本的な使い方

Java switch文の基本の構文は下記の通りです。

  switch (制御式) {
case 値1:
    処理文
    処理文
    ………
    break;
case 値2:
    処理文
    処理文
    ………
    break;
default:
    処理文
    処理文
}

switchの括弧内には、式や変数の指定が可能です。

制御式の値が、caseラベルで指定した値と一致すると、一致したcaseに処理が移行します。

どのcaseにも一致しない場合、defaultに処理が飛ぶ仕組みです。

そして、各caseラベルの最後にあるbreakによってswitch文から処理が抜け出します。

また、caseラベルは何個でも書けますが、ソースコードの可読性を低下させるので書きすぎには注意しましょう。

式とラベル名に記述できる値の制限

Javaのswitch文において、制御式に使用できるものは、==演算子で比較できる型となります。

つまり、整数型(char・byte・short・int )かString型(String)、列挙型(enum)です。

double型やlong型は利用できません。

もし、使用できない型を使用したい場合は、switchの式で利用できる型に変換してから使用しましょう。

switch文の処理の流れ

あらためてswitch文の処理フローを解説します。

下記のサンプルコードを例に考えてみましょう。

変数valueには、数値が想定されています。

  switch (value) {
            case 1:
            case 2:
                result = "2";
                break;
            case 3:
                result = "3";
                break;
            default:
                result = "そのほかの数値";
        }
System.out.println(result);

caseラベルの役割は、式(value)の値によってswitch文内のどこに処理を移動するかという目印です。

valueの値が1の場合、case 1の場所へ移動しますが、break文が無いのでcase 2の場所まで移動し、case 2の処理が実行されてしまいます。

switch文の処理は、合致したcaseラベルのみではなく、合致したcaseラベルの位置から最後のcaseラベルまで全処理が実行される処理です。

全ての処理を順に実行したくない場合はbreak文を使います。

valueの値が2の場合を見てみましょう。

case 2が終了後、最後にbreak文があるので switch 文の処理が強制的に終了となり、switch文を抜け出します。

case 2より下のcaseラベルに書かれている処理は実行されません。

Javaにおけるswitch文の応用的な使い方

基本的なJava switch文ついて触れたので、次は応用的な使い方をご説明します。

複数のラベルに同じ処理を適用する方法

曜日の文字数を出力する下記のサンプルコードを例に考えましょう。

変数dayには「SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY」のいずれかが入るとします。

      int numLetters = 0;

    // dayには今日の曜日が入るとする
     switch (day) {
        case "MONDAY":
        case "FRIDAY":
        case "SUNDAY":
            numLetters = 6;
            break;
        case "TUESDAY":
            numLetters = 7;
            break;
        case "THURSDAY":
        case "SATURDAY":
            numLetters = 8;
            break;
        case "WEDNESDAY":
            numLetters = 9;
            break;
    }
    System.out.println(numLetters);

参照:https://docs.oracle.com/javase/jp/13/language/switch-expressions.html

変数dayの値がMONDAYの場合、case SUNDAYの処理まで移動し、numLettersに文字数「6」が代入されます。

変数dayの値がFRIDAYの場合でも同様に、case SUNDAYの処理まで移動し、最終的にnumLettersに代入される数値は「6」です。

MONDAY、FRIDAY、SUNDAYは同じ文字数なので、処理をまとめた書き方をしました。

このように、複数のcaseラベルで同じ処理を適用する書き方もできます。

defaultラベルの活用方法

制御式の値が、どのcaseの値にも一致しなければ、defaultに処理が飛びます。

サンプルコードを例に見てみましょう。

   switch (value) {
            case 1:
                result = "1";
                break;
            case 2:
                result = "2";
                break;
            case 3:
                result = "3";
                break;
            default:
                result = "そのほかの数値";
        }
System.out.println(result);

変数valueの値が1の場合、出力結果は「1」です。

しかしvalueの値が4の場合、どのcaseの値にも一致しないのでdefaultに処理が飛びます。

このような役割がdefaultとなります。

default記述は省略することが可能です。

しかし、defaultの記述が無いと、どのcaseラベルにも合致しなかった場合、何も実行せずswitch文から抜けてしまいます。

処理がどこまで進んだか理解するため、またコードの可読性を高めるためにもdefaultは記述しましょう。

breakを使わない記述方法

break文は必須ではなく、省略して書くことも可能です。

サンプルコードを見てみましょう。

  int num = 1;

switch (num){
  case 1:
    System.out.print("飲み放題付き&");
  case 2:
    System.out.println("食べ放題");
}

変数numの値が1なら「飲み放題付き&食べ放題」、数値が2なら「食べ放題」と表示されます。

このようにbreak文は、意図的に記述しないこともできることを覚えておいて下さい。

しかし、もし意図せずbreak文を書き忘れてしまった場合注意が必要です。

break文が無いと、条件と一致したcaseラベルの処理を実行した後、それより下のcaseラベルの処理を全て実行してしまう挙動になる(フォールスルー)ので注意しましょう。

Java switch文で文字列と列挙型を扱う方法

Java switch文で使える型は決まっています。

整数型(char・byte・short・int )かString型(String)、列挙型(enum)です。

ここでは、文字列(String)と列挙型(enum)について説明します。

文字列の値で分岐する方法

Java switch文での文字列の使い方は、数値の場合と変わりません。

前章で扱った、曜日の文字数を出力する下記のサンプルコードを再度見てみましょう。

      int numLetters = 0;
    // dayには今日の曜日が入るとする
    switch (day) {
        case "MONDAY":
        case "FRIDAY":
        case "SUNDAY":
            numLetters = 6;
            break;
        case "TUESDAY":
            numLetters = 7;
            break;
        case "THURSDAY":
        case "SATURDAY":
            numLetters = 8;
            break;
        case "WEDNESDAY":
            numLetters = 9;
            break;
    }
    System.out.println(numLetters);

このようにcaseラベルで「”」を付けると、数値と同様に分岐することが可能です。

列挙型の値で分岐する方法

列挙型で分岐する方法について説明します。

前提として列挙型(enum)がどういうものなのか見ていきましょう。

  protected enum Fruit
{
    Apple, //列挙子
    Orange //列挙子
};

public static void main(String[] args)
{
    Fruit fruit_type = Fruit.Orange; //enumを取得
    System.out.println(fruit_type .toString() );   //Orange

}

enum型を使用する際は、クラスのメソッドのように、「列挙子型名.列挙子名」と記載します。

では前章と同様に、曜日の文字数を出力する下記のサンプルコードを例に考えていきましょう。

  public enum Day { SUNDAY, MONDAY, TUESDAY,
    WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }

    int numLetters = 0;
    switch (Day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            numLetters = 6;
            break;
        case TUESDAY:
            numLetters = 7;
            break;
        case THURSDAY:
        case SATURDAY:
            numLetters = 8;
            break;
        case WEDNESDAY:
            numLetters = 9;
            break;
    }
    System.out.println(numLetters);

Dayという列挙型に7つの曜日が定義されていて、switch文では列挙型内で定義した列挙子の値を判定して分岐しています。

caseラベルに指定する際は、「Day.MONDAY」という書き方ではなく「MONDAY」と列挙子名だけを書くようにしましょう。

文字列と列挙型を使う際の注意点

switch文で文字列を使う時に注意が必要なのがスペルミスです。

caseラベルに指定する文字列のスペルをミスした場合、エラーにもならずそのまま処理がスルーされてしまいます。

結果、default部分の処理しか実行されません。

そのため、どこが原因なのか調査するのに時間がかかってしまいます。

一方列挙型では、caseの値を正確に記述しなければコンパイルエラーが発生し、コンパイルが通りません。

そのため、スペルミスのような単純な間違いは、実行前に取り除けるでしょう。

Java 12以降におけるswitch文の書き方

Java 12以降では、モダンで簡潔な新しいswitch caseの記述が使用できます。

新しいswitch文の書き方は下記のとおりです。

  int num = 3;
switch (num){
 case 1 -> System.out.println(“値は1です。”);
 case 2 -> System.out.println(“値は2です。”);
 case 3 -> System.out.println(“値は3です。”);
}

break文なしでシンプルに記述できます。

従来のswitch文よりも、スッキリとした記述方法なので、可読性が高いです。

Java 12以降を使用している場合は、積極的に新しいswitch文を活用しましょう。

Java switch文と他の制御構造との比較

Java switch文と他の制御構造(if、else、else if)は、役割が似ています。

switchとifのどちらを使うか迷うこともあるでしょう。

そこで、switch文と他の制御構造との比較を解説しています。

if文との比較

Java switch文とif文を比較してみましょう。

まずはJava if文を書いた場合です。

   if (x is "aaa") {
        return 0;
    }
    else if (x is "bbb") {
        return 1;
    }
    else if (x is "ccc") {
        return 2;
    }
    else if (x is "ddd") {
        return 3;
    }
    else if (x is "eee") {
        return 4;
    }

同じ処理内容のswitch文は下記の通りです。

      switch (x) {
        case "aaa": return 0;
        case "bbb": return 1;
        case "ccc": return 2;
        case "ddd": return 3;
        case "eee": return 4;
    }

if文とswitch文を比較した場合、処理内容は同じですが、可読性が高いのはswitch文です。

switch文と比較演算子

if文と同様に、switch文でも比較演算子を使うことが可能です。

  switch (true){
  case age <= 12:
    System.out.println(“私は、12歳以下です。”);
    break;
  case age < 20:
 System.out.println(“私は、20歳以下です。”);
    break;
  default:
 System.out.println(“私の年齢は20歳より上です。”);
    break;
}

このように、比較演算子を使うと、複雑な条件分岐ができます。

switch文とif文の使い分け

switch文とif文それぞれのメリットを理解して、適材適所で使い分けましょう。

switch文のメリットは次の通りです。

  • 可読性が高い
  • 変数が3つ以上の値をとり、値によって処理を振り分けたい時(多分岐)に便利

if文のメリットは下記になります。

  • 複数の変数や条件を組み合わせて分岐しやすい

Javaプログラミングのスキルを活かして収入を増やすなら

なかには、副業での収入獲得やフリーランスへの独立を目的にJavaプログラミングのスキル習得に励んでいる人もいますよね。

ただ、身につけたスキルをどう収入UPに繋げればいいのか、イメージが湧かない人もいるはず。

そんな方は、ぜひフリーランスのミカタをご活用ください。

出典:フリーランスのミカタ

フリーランスのミカタは、平均単価80万円以上の案件を取り揃える、ITエンジニアに特化したフリーランスエージェントです。具体的には、次のような週3回からフルリモートで請け負える案件を豊富に掲載しています。

また希望年収や稼働時間だけでなく、扱うプログラミング言語などを細かく指定して案件を探せるため、自分にあう仕事を見つけやすいサイト仕様になっています。

ただし、上記のような案件は条件として2〜3年の実務経験が求められるケースが多いです。そのため、応募する際はどれくらいの経験が必要なのかを前もってチェックしておきましょう。

フリーランスのミカタを活用すれば、中・長期的な安定収入が得られる案件が見つかりますよ。

どんな案件が掲載されているか気になる人は、下のボタンから自分にあう案件を探してみてください。

まとめ

switch文とは、プログラミング言語において、ある式の値によって分岐を行う文法です。

switch文は、Java以外にもさまざまなプログラミング言語で見られます。

読みやすいソースコードにするためにも、switch文は非常に有効です。

本記事で紹介したswitch文法をぜひいかしてみて下さい。