2019/02/06
条件分岐といえばif文を思い浮かべると思いますが、switch文を使って条件分岐を作ることも出来ます。
if文については既に理解していることを前提に説明しますので、if文についての理解が足らない人は先にif文って何?を読むようにして下さい。
sponsored link
switchとは
まずswitch文の簡単な例を見てみましょう。
int num = 2; switch(num){ case 1: System.out.println("もっと頑張りましょう"); break; case 2: System.out.println("普通です"); break; case 3: System.out.println("大変よく出来ました"); break; }
numの値によって、まさにスイッチで切り替えるように処理内容を分岐させています。numが2なので実行すると「普通です」が出力されるのがなんとなく想像できると思います。
もしこれをif文で書こうと思ったら、
int num = 2; if(num==1){ System.out.println("もっと頑張りましょう"); }else if(num==2){ System.out.println("普通です"); }else if(num==3){ System.out.println("大変よく出来ました"); }
こうなります。else if(num==○)が何個も続くとなんとなく読みにくく感じませんか?switchだと上記のようにcaseを使うことで、switchの後ろの( )の中に入れた変数の値ごとに分岐させることが出来ます。
最後に、その他をつけることも出来ます。defaultを使います。
int num = 2;
switch(num){
case 1:
System.out.println("もっと頑張りましょう");
break;
case 2:
System.out.println("普通です");
break;
case 3:
System.out.println("大変よく出来ました");
break;
default:
System.out.println("評価不能です");
}
if文だと最後にelseをつければ、その他になりますよね。
int num = 2;
if(num==1){
System.out.println("もっと頑張りましょう");
}else if(num==2){
System.out.println("普通です");
}else if(num==3){
System.out.println("大変よく出来ました");
}else{
System.out.println("評価不能です");
}
このように、switch文でもif文と同じような分岐を作ることができます。ある変数の値によって処理を分岐させたい場合なんかは、if文よりもswitch文を使って書いた方がちょっとスッキリします。
switch(変数){ case 値1: 変数が値1だった場合の処理 break; case 値2: 変数が値2だった場合の処理 break; ・ ・ ・ default: 変数の値がどのcaseにも当たらなかった場合の処理 }
原則として、各caseの処理の最後にbreakを付ける必要があります。breakについては次節で詳しく説明します。
if文とswitch文の違い
同じような処理ができるif文とswitch文ですが、もちろん違いはあります。その違いに着目しながら、もう少しswitch文の理解を深めましょう。
if文だと( )の中に入れる条件式は必ずbooleanである必要があります。一方、switch文の場合後ろの( )の中は条件式(boolean)ではなく変数そのものが入っています。その変数の中身によっていずれかのcaseを選択して実行されるようになっています。
ただし、そのcaseだけを選択して実行させようと思ったら、breakを書くのを忘れてはいけません。どういうことか説明します。
例えば、こんなswitch文を見て下さい。breakが無い場合です。
int num = 2; switch(num){ case 1: System.out.println("もっと頑張りましょう"); case 2: System.out.println("普通です"); case 3: System.out.println("大変良く出来ました"); default: System.out.println("評価不能です"); }
これで実行すると、
普通です 大変良く出来ました 評価不能です
と出力されます。numは2であるにも関わらず、「普通です」だけでなく、「大変良く出来ました」も「評価不能です」も出力されています。
どうなってるかお分かりでしょうか?caseというのはあくまで「そこに跳ぶ」というだけで、それ以降のcaseもお構いなしに全部実行してしまうんです。
そんなことになったら、caseごとに処理を分岐させることが出来ないので、各caseの最後にbreakを書くことでswitch文をそこで抜けるという処理を行う必要があるわけです。
if文だと各分岐はブロックで囲われているのでそんなことは起きませんし、複数のブロックが実行されることは絶対にありえません(条件式がtrueになった時点でそのブロックを実行したらそのif文を勝手に抜けます)。
if(){ //ブロック }else if(){ //ブロック }else{ //ブロック }
しかしswitch文は1つのブロック内で行う分岐なので、勝手に抜けてはくれません。意図的にブロックを抜けるにはbreakが必須だということです。
switch(){ //ブロックは1つ }
※ちなみに、defaultの処理後はブロックの最後なのでbreakを書いても書かなくても同じです。
いちいちbreakなんて書かなくても普通にcase単位で実行してくれればいいのですが、残念ながらそういう仕様にはなっていません。しかしながらこの面倒なbreak処理ですが、実はそれを逆手に取ることで非常に柔軟な分岐を作ることができます。
int num = 2; switch(num){ case 1: case 2: System.out.println("numは1か2です"); case 3: System.out.println("numは3です"); break; default: System.out.println("numは1、2、3以外です"); }
こんな風に、あえてbreakを使わずに、case 1とcase 2で同じ処理をさせることも出来ます。仕切りをぶち抜いた感じです。使いようによっては便利に使えます。
switchで使える変数の型
ここまでの例ではswitchの( )の中の変数にはint型を使っていました。実はここに入るのは何でもOKというわけではありません。
switchの判定に使える変数の型は、
- byte
- char
- short
- int
- String (JDK 1.7以降)
- enum (JDK 1.5以降)
の6つです。基本データ型は全部使えるというわけではないので注意しましょう。
switchの後ろの( )に入れた変数の型と、各caseで示す値の型が異なっている場合は、コンパイルは通りません。
int num = 2; switch(num){ case 1: case "2": ←コンパイルエラー }
もし、switchの後ろの( )に入れた変数が、nullだとコンパイルは通りますが、実行時に例外(NullPointerException)が投げられて止まります。
String str;
switch(str){ ←実行時エラー
}
初期化のし忘れ等には気をつけなければなりません。
以上、switchの構文はif文よりも便利に使える場面もあるので参考にして下さい。
switch(変数){ case 値1: 変数が値1だった場合の処理 break; case 値2: 変数が値2だった場合の処理 break; ・ ・ ・ default: 変数の値がどのcaseにも当たらなかった場合の処理 }
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス