読み込み中...

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

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

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

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

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

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

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

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

はじめに

この記事を読めば、Javaでよく使用される制御構文であるswitch文を効果的に使えるようになります。

switch文をうまく使いこなせると、コードがスッキリと整理され、可読性も高まります。

本記事では、Javaのswitch文の基本から応用まで、初心者にもわかるように網羅的に解説しています。

●Javaのswitch文とは

Javaにおけるswitch文は、多分岐の処理を簡潔に記述するための制御構文です。

if-else文が連なるような場合に特に有用です。

switch文を使うと、コードが見やすくなり、バグも少なくなる可能性が高まります。

○switch文の基本構造

基本的なswitch文は次のような形をしています。

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

このコードでは、switch文を用いて、与えられた式の値に応じて異なる処理を実行します。

この例では、式が「値1」に一致したら、その後の「値1に一致した場合の処理」が実行されます。

同様に、式が「値2」に一致したら、「値2に一致した場合の処理」が実行されます。

もし、どのcaseにも一致しない場合は、default節の処理が実行されます。

このように、switch文を使うことで、複数の条件に基づいて処理を行いたい場合に、より簡潔で読みやすいコードを書くことができます。

●switch文の詳細な使い方

Javaのswitch文は、見た目のシンプルさからは想像がつかないほど多機能です。

ここでは、具体的なサンプルコードを交えて、その詳細な使い方をご紹介します。

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

まず初めに、最も基本的なswitch文から始めます。

こちらは、整数型の変数に応じた処理を行います。

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以外です");
    }
  }
}

このサンプルコードでは、int型の変数numberが与えられ、その値に応じて異なる出力をするswitch文を作成しています。

breakは、一致したcaseブロックが実行された後、switch文を終了させるためのキーワードです。

もしbreakがなければ、次のcaseブロックも実行されてしまいます。

このコードを実行すると、変数numberの値が2であるため、「numberは2です」と表示されます。

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

Javaの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です");
    }
  }
}

このサンプルコードでは、成績に応じて評価(A, B, C, D)を出力します。

90点以上と100点(score / 10が9と10)は同じ「成績はAです」という出力になるので、case 10:case 9:が並んでいます。

実行結果としては、scoreが85であり、score / 10の結果が8になるため、「成績はBです」と表示されます。

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

Javaのswitch文において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("不明な成績です");
    }
  }
}

このコードは、char型の変数gradeを判定して、それに応じて異なるメッセージを出力するものです。

default節は、変数gradeが’A’, ‘B’, ‘C’以外の場合に「不明な成績です」と出力されます。

breakは使われていませんが、default節はswitch文の最後に来るため、この場合は省略しても問題ありません。

このサンプルコードを実行すると、gradeの値が’F’なので「不明な成績です」と出力されます。

default節が機能したことになります。

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

Java7以降では、整数型だけでなく、文字列も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に応じて季節を表示しています。

ここでは、「春です」と表示されるでしょう。

Javaでswitch文を使う際、文字列での判定も可能ですが、内部的には文字列のハッシュコードが比較されます。

そのため、null値が変数に入るとNullPointerExceptionが発生する点に注意が必要です。

●switch文の応用例

Javaのswitch文は多くのプログラミング初心者にとって、コードを効率的に書く上で非常に便利な構文の一つです。

ただし、その応用範囲は基本的な使い方以上に広がっています。

ここでは、より高度な応用例をいくつか解説します。

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

Javaにおけるenum(列挙型)は、事前に定義された有限の値の集合を表現する特別なクラスです。

enum型を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というenum型を作成し、その中で四季を定義しています。

mainメソッド内のswitch文では、このSeason型の変数seasonを用いて条件分岐を行っています。

こうすることで、コードがより読みやすくなり、プログラムのメンテナンス性も向上します。

このコードを実行すると「花が咲きます」と表示されます。

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

Java 8からLambda式(ラムダ式)が導入されました。

ラムダ式とは、無名関数(名前のない関数)を簡潔に記述できる機能です。

Lambda式をswitch文と組み合わせることで、より短いコードで同じ処理を表現することが可能です。

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");
  }
}

このコードでは、Lambda式を使ってアクション(RUN, JUMP, WALKなど)に応じた処理をConsumerインターフェース型のoperationに代入しています。

そして、operation.accept("John");でその処理を実行しています。

この場合、”John is running”と出力されるでしょう。

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

Javaの近いバージョンでは、switch式という新しい機能が導入されました。

これによって、switch文をより短く書くことができるだけでなく、戻り値も取得できるようになっています。

これは非常に便利で、コードの可読性と効率性が高まります。

例として次のサンプルコードをご覧ください。

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);
  }
}

このサンプルコードでは、switch式を用いて文字列seasonの内容に応じて、異なるメッセージをString型のmessage変数に代入しています。

そして、その値を出力しています。特に注意すべきは、caseとそれに続く処理が「->」で短縮されている点です。

これにより、戻り値がmessage変数に直接代入されています。

このコードを実行すると、「この季節は:花が咲きます」と表示されます。

このように、switch式を使うとコードが短くなり、かつ明確な戻り値を取得することができます。

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

Java 17以降で使えるようになった新しい特性として、パターンマッチングがあります。

これを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("その他の型");
    }
  }
}

このコードでは、Object型のobj変数に格納された値がInteger型であれば、その値をiに代入し、String型であればsに代入しています。

その後、それぞれのケースで処理が分岐されます。

このコードを実行すると、「文字列:Java」と表示されます。パターンマッチングを用いることで、非常に直感的かつ柔軟に型に応じた処理が可能になります。

●注意点と対処法

Javaのswitch文を使う際には、いくつかの注意点があります。

初心者がよく犯す過ちも多く、それらを理解して回避することが重要です。

○switch文の落とし穴

switch文は非常に便利な制御文ですが、特定の状況で予想外の動作を引き起こす可能性があります。

特にcaseラベルの重複や、break文の欠落が該当します。

caseラベルの重複が問題を引き起こすサンプルコードを紹介します。

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ラベルが一意になるようにする必要があります。

○break文の重要性

break文の欠落もまた、よく見られる問題です。break文がないと、一度caseに一致した後の処理が続けて実行されてしまいます(フォールスルー)。

下記のコードでは、break文が欠落しているために意図しない動作が発生します。

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です」と両方が出力されます。

これはbreak文がないために、case 1の処理が完了した後にcase 2の処理も実行されてしまうからです。

このようなフォールスルーを避けるためには、各case節の最後にbreak文を必ず追加するようにしましょう。

●カスタマイズ方法

Javaのswitch文は基本的な使い方から応用例まで、多岐に渡る用途があります。

ここでは、更に高度なカスタマイズ方法について取り上げます。

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

Javaでswitch文をカスタマイズする一例として、条件に応じて異なるメソッドを呼び出す機能を考えてみましょう。

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));
  }
}

このコードでは、文字列operationに応じて、異なる算術処理を行うメソッドを呼び出します。

ここでのポイントはcase節内で直接メソッドを呼び出している点です。

具体的には、”add”の場合にはperformAdditionメソッドを、”subtract”の場合にはperformSubtractionメソッドを、”multiply”の場合にはperformMultiplicationメソッドを呼び出します。

実行すると、”足し算の結果:8″と出力されます。

これは、operation変数が”add”であるため、performAdditionメソッドが呼び出され、その結果が表示されるからです。

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

Javaのswitch文はそのままでも非常に便利ですが、より柔軟な処理を実現するために、独自のロジックを組み込むことも考えられます。

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("無効な数字です");
    }
  }
}

このサンプルでは、switch文の中で更にif文を使用しています。

このように、switch文内で条件を更に細かく制御することも可能です。

このコードを実行すると、”10は偶数です”と”また、5より大きい偶数です”の2つのメッセージが出力されます。

こちらは、numが偶数であり、さらに5よりも大きいためです。

●Java以外の言語でのswitch文

Javaのswitch文の多様性とその応用例について理解を深めたところで、他のプログラミング言語におけるswitch文との比較を行いましょう。

○TypeScriptのswitch文との違い

TypeScriptは、より強固な型付けとクラスベースのオブジェクト指向プログラミングを可能にします。

しかし、switch文に関しては、基本的な構文はJavaと非常によく似ています。

let day: string = "Monday";

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

このコードでは、変数dayに格納された曜日に応じて異なるメッセージを出力します。Javaと同じく、break文も必要です。

しかし、TypeScriptでは静的型チェックが強化されているため、型の不整合が早期に検出されます。

このコードを実行すると、コンソールに「今日は月曜日です」と出力されることになります。

これは、day変数が”Monday”であるためです。

○Pythonのswitch文相当の機能

Pythonには、JavaやTypeScriptにおけるswitch文に相当する直接的な機能はありません。

代わりにif-elif-elseブロックが一般的に用いられます。

day = "Monday"

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

このコードではday変数の値に応じて、特定のメッセージを出力します。

実行すると、”今日は月曜日です”と出力されます。これはdayが”Monday”に設定されているためです。

○JavaScriptのswitch文の特徴

JavaScriptのswitch文も、基本的な使い方ではJavaと非常に似ています。

ただし、JavaScriptではcase文での型比較が厳密でない(===ではなく==で比較される)点が特徴です。

let value = "5";

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

このJavaScriptのコードを実行すると、「文字列の5です」と出力されます。

この例では、case 5:valueが数値の5である場合にマッチし、case "5":valueが文字列の”5″である場合にマッチします。

まとめ

これまでに解説してきたように、Javaのswitch文は多様なプログラム制御の局面で効率的な道具となり得ます。

基本的な使い方から、より高度な応用例、そして他のプログラミング言語との比較までを扱いました。

switch文の特性やそれに関連するキーワード(case, default, breakなど)を理解することで、読者の皆様もJavaプログラミングのスキルを一段階引き上げられるでしょう。

この記事が、Javaのswitch文を効率よく、かつ柔軟に使用するための指針となれば幸いです。

プログラミングは常に進化していますので、基本的な制御構造から応用技術まで、継続的な学びと実践が不可欠です。

最後までお読みいただきありがとうございました。