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でもないとき”);
}