【Javaの基礎】条件分岐(switch)

 

こんにちは、現役SEの「とも」です。

今回は、条件分岐のswitchについて説明します。

switchはif文とは異なり、switch()の中に記載された「値」に応じてそれぞれの処理を振り分ける条件分岐になります。

 

早速、構文を見ていきましょう

 

switchの構文

 
switch(値){
  case 定数1:
      // 処理1
    break;
  case 定数2:
      // 処理2
    break;
  default:
      // デフォルト処理
    break;
}
	

switchは、値と合致する定数の処理を実施します。

上の構文で言うと、「値」が「定数1」なら「処理1」を実行、「値」が「定数2」なら「処理2」を実行、という動きになります。

「値」が「定数1」にも「定数2」にも合致しない場合は、「default」が実行されます。

 

  • 分岐させたい条件数だけ、「case~break;」を記載できます。
  • 「default」の分岐の記載は任意で、記載がない場合「何も処理されない」事になります。

 

なお、「値」に記載できる型は、数値の「int型」文字列の「String型」列挙型「enum」のみとなります。

 

caseには定数しか設定できないため、それぞれの分岐で様々な条件式が使用できるif文に比べると柔軟性では劣ります

でも、変数の値によってたくさんの分岐がある場合にはスッキリと見やすく書けます

 

以下で、それぞれの型のサンプルについて記載します。

 

数値(int型)による分岐

 
int condValue = 1;
final int COND_TYPE_1 = 1;

switch(condValue){
  case COND_TYPE_1:             // 定数での記載可
      System.out.println("タイプは1でした");
    break;
  case 2:             // リテラルでの記載可
      System.out.println("値は2でした");
    break;
  default:
      System.out.println("値はその他でした");
    break;
}
	

 

整数型の変数を使って処理を振り分けるタイプです。

  • byte、short型でも、暗黙的にint型にキャストされるため使用できます
  • ただし、long型だけは明示的にキャストしないと使用できません
  • caseで設定する定数では、リテラルと定数が使用できます。

 

文字列による分岐

 
String condValue = "りんご";
final String COND_TYPE_APPLE = "りんご";

switch( condValue){
  case COND_TYPE_APPLE:            // 定数での記載可
      System.out.println("リンゴの処理です");
    break;
  case "みかん":            // リテラルでの記載可
      System.out.println("みかんの処理です");
    break;
  default:
      System.out.println("値はその他でした");
    break;
}
	

 

String型の変数を使って文字列で処理を振り分けるタイプです。

  • caseで設定する定数では、リテラルと定数が使用できます。

 

列挙型による分岐

 
public enum FruitType {
APPLE,
ORANGE
}

public static void main(String[] args) {

    FruitType type = FruitType.APPLE;

    switch( type){
    case FruitType.APPLE:
    System.out.println("APPLEの処理です");
    break;
    case FruitType.ORANGE:
    System.out.println("ORANGEの処理です");
    break;
    default:
    System.out.println("その他の処理です");
    break;
  }
}
	

 

enum型の変数を使ってenumで定義された値で処理を振り分けるタイプです。

  • enum型については別の記事で書きますので、一旦はenum型も使えるんだと覚えておいてください。

 

特殊な記載方法

通常ではあまり使用しませんが、以下のような記載をすることもできます。

  • breakを記載しない
  • switch()内で式を入れる

 

breakを記載しない場合の動きについて

「break」を記載しない事によって、次の「case」や「default」の処理を実行することができます。

 
String condValue = "りんご";

switch( condValue){
  case "りんご":
      System.out.println("リンゴの処理です");
//    break; ←コメントアウト
  case "みかん":
      System.out.println("みかんの処理です");
//    break; ←コメントアウト
  default:
      System.out.println("値はその他でした");
    break;
}
	

 

以下のように、実行結果はすべてのケースの処理が実行されています。

【実行後のコンソール表示】

 
リンゴの処理です
みかんの処理です
値はその他でした
	

 

breakを記載しない事でその次のケースを実行する動きとなりますが、個人的にはこのような記載方法は潜在的にバグのもとになるので、使用しない方がいいと思います。

 

同じ処理をしたい場合は、下のようにメソッドに処理を移して、caseの処理からはメソッドを呼ぶようにしましょう。

メソッドについては、別の記事にて記載します。

 
// 共通メソッドを定義
private static void comFunc( String name) {
    // 共通処理
    System.out.printf("%sの処理です\r\n", name);
  }

// メイン処理
public static void main(String[] args) {

  String condValue = "りんご";

  switch( condValue){
    case "りんご":
        comFunc("りんご");
      break;
    case "みかん":
        comFunc("みかん");
      break;
    default:
        System.out.println("値はその他でした");
      break;
  }
}
	

 

switch()内で式を入れる

switchのカッコ内には、変数だけでなく計算式を入れることもできます。

その場合、計算後の値で処理の振り分けが行われます

  • 文字列でも同様に、複数の文字列の結合結果で評価することができます。
 
int baseValue = 1;
int condValue = 1;

switch( baseValue + condValue){  // ← 計算式
  case 1:             // 定数での記載可
      System.out.println("値は1でした");
    break;
  case 2:             // リテラルでの記載可
      System.out.println("値は2でした");
    break;
  default:
      System.out.println("値はその他でした");
    break;
}
	

 

【実行後のコンソール表示】

 
値は2でした