【Java】Switch文・Switch式とは

## はじめに

  Java Silverの学習を進めている際、Switch文、Switch式について学ぶ機会がありました。

  条件分岐処理は普段if文を使って書くことが大半なので、備忘録としてまとめてみようと思います。
  
  ※誤りありましたら、ご指摘いただけますと幸いです。

## 想定読者
  初学者の方  
  普段Javaを使用している方

## Switch文とは  
  Java14で正式に追加された、複数の条件分岐を簡潔に記述するための制御構造のことを言います。
  特定の変数の値に基づいて異なるコードブロックを実行することができます。
  if文と似ていますが、条件分岐が多くなる場合は、Switch文を使用した方が可動性は向上するかと思います。


## 実際の使い方
  実際の使い方を見ていきましょう。
  ここでは2つの書き方を取り上げます。

#### 1, オーソドックスな書き方
```java
int day = 3;

switch (day) {
    case 1:
        System.out.println("Monday");
        break;
    case 2:
        System.out.println("Tuesday");
        break;
    case 3:
        System.out.println("Wednesday");
        break;
    case 4:
        System.out.println("Thursday");
        break;
    case 5:
        System.out.println("Friday");
        break;
    case 6:
        System.out.println("Saturday");
        break;
    case 7:
        System.out.println("Sunday");
        break;
    default:
        System.out.println("Error");
        break;
}
```

```:出力結果
Wednesday
```

  上記がオーソドックスなSwitch文の書き方になります。
  今回はint型の変数dayに1~7まで値が設定され、1から順番に対応して曜日が出力されるケースです。
  
  まず、switch()に評価される式を代入します。今回はdayです。

  その後、caseに続いて条件として、今回はdayの値を記述します。この時、文末はコロン **（`:`）** になるので要注意です。

  caseで条件が合致した場合はcase内に処理を記述します。今回は出力するのみです。
  どの条件にも一致しない場合の処理は`default:`以降に記述できます。`default:`の記述は任意です。

  最後に`break;`を記述し、次のcaseを記述していきます。
  ちなみにこの`break;`ですが、記述を忘れると、それ以降のcase処理もすべて実行されてしまう、フォールスルーが発生してしまいます。

  下記コードを見てみましょう。




```java
int day = 3;

switch (day) {
    case 1:
        System.out.println("Monday");
    case 2:
        System.out.println("Tuesday");
    case 3:
        System.out.println("Wednesday");
    case 4:
        System.out.println("Thursday");
    case 5:
        System.out.println("Friday");
    case 6:
        System.out.println("Saturday");
    case 7:
        System.out.println("Sunday");
    default:
        System.out.println("Error");
}
```

```:出力結果
Wednesday
Thursday
Friday
Saturday
Sunday
Error
```

  上記のように、各caseの最後に`break;`をつけ忘れるとフォールスルーが発生しています。
  今回はday=3でしたので、Wednesdayのcaseで条件が合致、その後に`break;`をつけていないことで、それに続くcaseやdefaultの処理が全て実行されてしまいました。


#### 2, ->を使用する
```java
int day = 3;

switch (day) {
    case 1 -> System.out.println("Monday");
    case 2 -> System.out.println("Tuesday");
    case 3 -> System.out.println("Wednesday");
    case 4 -> System.out.println("Thursday");
    case 5 -> System.out.println("Friday");
    case 6 -> System.out.println("Saturday");
    case 7 -> System.out.println("Sunday");
    default -> System.out.println("Error");
};
```

```:出力結果
Wednesday
```

例①と全く同じ式を、「->」を使用して書き直した例です。
非常にコンパクトで見やすくなりました。

この形は、先程と異なりbreak;が不要なので、書き忘れもなくなると思います。
今回、「->」の後に{}はありませんが、複数処理記載したい時は{}必須なので注意してください。

## Switch式とは  
  Switch文とは異なり、こちらは式になるので、実行結果の値を直接変数に代入したり、メソッドに引数に渡したりすることが可能になっています。

## 実際の使い方
  実際の使い方を見ていきましょう。
  ここでも2つの書き方を取り上げます。

  ちなみにSwitch式では、Switch文と異なり必ず値が必要となるため、defaultを省略した場合、スイッチされる値がすべてのcaseラベルに一致しない場合に例外がスローされる可能性があります。
  
  そのため、通常はdefaultケースを含めることが推奨されます。

#### 1, yieldを使用した書き方
```java
int day = 3;
        
System.out.println("Today is " + 
    switch (day) {
        case 1: yield "Monday";
        case 2: yield "Tuesday";
        case 3: yield "Wednesday";
        case 4: yield "Thursday";
        case 5: yield "Friday";
        case 6: yield "Satursday";
        case 7: yield "Sunday";
        default: yield "Error";
    } );
```

```:出力結果
Today is Wednesday
```

  こちらはyieldを使用した書き方です。
  `case`の後に「`:`」を使用する場合は、`yield`に続けて戻す値を指定します。


#### 2, ->を使用した書き方

```java

int day = 8;
        
System.out.println("Today is " + 
    switch (day) {
        case 1 -> "Monday";
        case 2 -> "Tuesday";
        case 3 -> "Wednesday";
        case 4 -> "Thursday";
        case 5 -> "Friday";
        case 6 -> "Satursday";
        case 7 -> "Sunday";
        default -> {System.out.println("1~7までの値を入力してください");
                    yield "Error";}
    } );
```

```:出力結果
1~7までの値を入力してください
Today is Error
```

  こちらは「`->`」を使用した書き方です。
  
  処理の後に戻す値を直接記述できますが、今回のdefaultの処理のように処理が複数にわたる場合については、yieldを使用する必要があります。

## まとめ
  Switch文は、if文に比べて直感的に見やすく、条件が多岐にわたる場合はこちらの方が見やすいケースもあるかと思いました。
  
  まだ登場してからそこまで時間が経っていない分、目にする機会は少ないかもしれませんが、理解しておくとインプットするスピードも上がると思うので、知識として覚えておきたいと思います。