switch文を使いこなそう! 超初心者のJavaの勉強

2020-04-05

Javaでいろいろできるようになってきたのに、switch文はあまり使ったことがない。
というより使い方・使い道がよくわからない。
少しでも慣れるべくswitch文についてきちんと調べてみようと思います。

※ざっくり環境はMacでeclipseを使っています。
※動作確認は面倒な時はpaizaで動かしています。

switch文とは

if文と似ていますが、条件によって分岐するというよりは値によって分岐する文です。
switch-case文と言う方もいます。

switch文の書き方

switch (条件式){
case 値: 実行する文;
break;
case 値: 実行する文;
break;
}

else if文よりもスマートな分岐が可能なのがswitch文と言われています。

case 値:の部分はcase文といい、いくつでも必要な数だけ作成できます。
caseの後ろに値と “:”(コロン)を付け、そのあとに実行する処理を書きます。
“:”で終える文は一般的にラベルと呼ばれます。
※case文はcaseラベル、以下に出てくるdefaultはdefaultラベルとなります。

case文の最後に書かれている「break」はswitch文の外へ抜ける働きがあります。基本的には書きますが、書かない場合下にあるcaseの処理も実行されます。
break文を書かないことで、「または(or)」の処理を作ることもできます。

「1の場合は○○する」のように値により処理が決まります。「2以上」などの分岐はできません。

細かな条件には向いていませんが、単純な分岐が switch 文では便利です。

※switch文はif文と異なり{ }は省略できません。

caseの書き方

条件式では以下の型を返す値である必要があります。変数(定数はOK)は書けません。

  • char
  • byte
  • short
  • int
  • String
  • enum
  • Character
  • Short
  • Byte
  • Integer

整数型はint型以下とそのラッパークラスが使えます。また文字と文字列、列挙型が扱えます。
StringはSE7から使えるようになりました。

※ 浮動小数点は使えない i.e. : float, double
※ 真偽値は使えない i.e. : boolean
※ 変数は扱えないがfinal宣言された定数であれば使用可能

case 書き方の例

  • case 1 :
    int、byte、short、Integer、Byte、Short
  • case ‘y’ :
    char、Character
  • case "火曜日" :
    String、enum
  • case '\u2500' :
    char、Character

case ダメな例

  • case num :
    変数は使えない(定数除く)
  • case 3.5 :
    小数点のある数値は使えない
  • case 12L:
    longは使えない
  • case 1>0 :
    比較はできない
  • case 1 ;
    セミコロンは使えない

理解深めるためにいくつかswitchを使った例文を書きながらswitchの理解を深めていきたいと思います。
eclipse、paizaで動きを確認してみるとわかりやすいと思います。

シンプルなswitch文 : 1, 2, それ以外に分ける

int num = 1;
switch (num) {
case 1:
System.out.println("num==1のとき"); //実行される
break;
case 2:
System.out.println("num==2のとき");
break;
default:
System.out.println("numが1でも2でもないとき");
}

default: はcaseに当てはまらない、“その他”となります。if文のelseのようなものです。
default文は省略することも可能です。
※defaultは基本的に最後に書くので最後にあればbreak文は省略できます。

定数を使ってswitch文を作る

int num = 2;
final int two = 2; //定数
switch (num) {
case 1:
System.out.println("num==1のとき");
break;
case two:
System.out.println("num==2のとき"); // 実行される
break;
default:
System.out.println("numが1でも2でもないとき");
}

switch文でbreakを省略してorを作る

int num = 0;
switch (num) {
case 0: //実行されるがbreakがないのでcase1の処理へ
case 1:
System.out.println("num== 0 or 1 のとき"); //実行される
break;
case 2:
System.out.println("num==2のとき");
break;
default:
System.out.println("numが0でも1でも2でもないとき");
}

breakを意図的に省略するとor文のように扱うことができます。
全てにbreakがない場合、defaultまで実行されます。

入力に応じた分岐

いっきに難易度をあげてみました。解説はできないので動かして遊ぶようです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
        try{
            System.out.println("今日は何曜日?");
            String day = a.readLine();
            switch(day){
            case "月曜日":
                System.out.println("月曜日、週の初め気合いいれて行きましょう");
                break;
            case "火曜日":
                System.out.println("火曜日、今日も1日頑張りましょう");
                break;
            case "水曜日":
                System.out.println("水曜日、運動して気分転換もいいですよ");
                break;
            case "木曜日":
                System.out.println("木曜日、あともう少しで週末ですね");
                break;
            case "金曜日":
                System.out.println("金曜日、Happy Friday!!");
                break;
            case "土曜日":
            case "日曜日":
                System.out.println("おやすみを満喫しましょう");
                break;
            default:
                System.out.println("曜日を漢字で入力お願いいたします i.e. 月曜日");
            }
        }catch(IOException e){
            System.out.println(e);
        }
    }
}

配列の中身をswitch文で分岐

いつ使うかわからないけれど、配列の中身をswitch文で回す。

char[] valuetoo = { 'a', 'b', 'c', 'd', 'e', 'f'};
for (char c : valuetoo){ // 'a', 'b', 'c', 'd', 'e', 'f'を順番に取り出してcへ代入
switch (c){
case 'a':
System.out.println("the character found is 'a'");
break;
case 'b':
System.out.println("the character found is 'b'");
break;
case 'c':case 'd':case 'e':
System.out.println("the character found is 'c' or 'd' or 'e'");
break;
default:
System.out.println("the characters are not found 'abcde'");
}
}

参考サイト:Java - how to use char array in switch statement?

ネストしたswitch

いつ使うかわからないけれど、switchネストする。

int num = 2;
switch (num) {
case 1:
System.out.println("num==1のとき");
break;
case 2: // 実行される
System.out.println("num==2のときネストする");
int i = 1;
switch (i) { //ネスト開始
case 0:
System.out.println("i==0のとき"); //実行される
break;
case 1:
System.out.println("i==1のとき");
break;
case 2:
System.out.println("i==2のとき");
break;
} //ネスト終了
break;
case 3:
System.out.println("num==3のとき");
break;
default:
System.out.println("num==1でも2でも3でもないとき");
}

Java

Posted by Nakamoto