if文の条件分岐以外にも、処理手順を分岐する方法がある。Javaではswitch文がこれだ。
switchはif文で書くと面倒だと思うような、簡単ながら量の多い比較をするのに適している。このページではswitch文の使い方をまとめているので、使い方をマスターしていただければと思う。
目次
Javaのswitch文の使い方
Javaのswitch文は、いくつかのケースを想定して、それに基づいて実行することをswitchできる文法だ。
if文との違い
if-else文はふたつの内のひとつの文を選んで実行したが、switch文はいくつかの文の中から実行する文のひとつを選ぶことができる。
わかりにくいと思うので、ちょっと解説しておこう。
例えば、fruitsという変数に「apple」が入っていたら「りんご」を出力したい。「grape」が入っていたら「ぶどう」を出力したい。「orange」が入っていたら「みかん」を出力したいとしよう。
if文で書くと、if書いて、if-elseを書いて、、、と若干面倒だ。これが3つであればまだましだが、10個あったらどうだろうか? 書きたくなくなるだろう。
switch文で書くと、簡単になる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						switch ("apple") { 	case "apple": 		System.out.println("りんご"); 		break; 	case "orage": 		System.out.println("みかん"); 		break; 	…… 	case 定数n: 		文n; 		break; }  | 
					
こんな感じでcaseを増やしていけばいい。
正確な文法は次のようになる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						switch ( 式 ) { 	case 定数1: 		文1; 		break; 	case 定数2: 		文2; 		break; 	…… 	case 定数n: 		文n; 		break; }  | 
					
式の部分は、char型、byte型、short型、int型、Character型、Byte型、Short型、Integer型、String型、 enum型のいずれかになる。
サンプルプログラムを見ていただけるとなんとなくわかるだおう。
式に続いてswitch文の本体がある。ブロック{ }で囲まれた部分だ。このブロックは、caseと定数によってラベルが付けられている。どの「case」にも定数が必要だ。
ラベルとcase定数は、switch文で関連づけられていると言われている。式の値と等しい定数を持つcaseが、式の値に対応するラベルになる。
では、文の実行はどのように行われるのだろうか。それは、式がある値のとき、その値に対応するラベルが選ばれる。そして、それに続く文が実行され、switch文はbreakで終わる。
では、この点をサンプルプログラムで確認してみよう。
式がint型のサンプルプログラム
このサンプルプログラムは、式にint型の変数numberを使っている。この変数の値に対応するラベルに続く文、文字列の表示が行われる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						public class SwitchByIntTypeValue {     public static void main (String[] args){         int number = 2;//[1]         switch (number) {//[2]             case 1://[3]                 System.out.println("[4] number = 1");                 break;//[5]             case 2://[6]                 System.out.println("[7] number = 2");                 break;//[8]             case 3://[9]                 System.out.println("[10] number = 3");                 break;//[11]             case 4://[12]                 System.out.println("[13] number = 4");                 break;//[14]             case 5://[15]                 System.out.println("[16] number = 5");                 break;//[17]         }     } }  | 
					
実行結果
| 
					 1  | 
						[7] number = 2  | 
					
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1]変数numberを宣言し、初期値の2を代入する。
 - [2][3][4] もしnumberが1ならば、「number = 1」を表示する。
 - [5] 中断して、switch文を終わる。
 - [2][6][7] もしnumberが2ならば、「number = 2」を表示する。
 - [8] 中断して、switch文を終わる。
 - [2][9][10] もしnumberが3ならば、「number = 3」を表示する。
 - [11] 中断して、switch文を終わる。
 - [2][12][13] もしnumberが4ならば、「number = 4」を表示する。
 - [14] 中断して、switch文を終わる。
 - [2][15][16] もしnumberが5ならば、「number = 5」を表示する。
 - [17] 中断して、switch文を終わる。
 
式がchar型のサンプルプログラム
このサンプルプログラムは、式にchar型の変数characterを使っている。この変数の値に対応するラベルに続く文、文字列の表示が行われる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						public class SwitchByCharacterTypeValue {     public static void main (String[] args){         char character = 'C';//[1]         switch (character) {//[2]             case 'A'://[3]                 System.out.println("[4] character = A");                 break;//[5]             case 'B'://[6]                 System.out.println("[7] character = B");                 break;//[8]             case 'C'://[9]                 System.out.println("[10] character = C");                 break;//[11]             case 'D'://[12]                 System.out.println("[13] character = D");                 break;//[14]             case 'E'://[15]                 System.out.println("[16] character = E");                 break;//[17]         }     } }  | 
					
実行結果
| 
					 1  | 
						[10] character = C  | 
					
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1]変数characterを宣言し、初期値の 'C'を代入する。
 - [2][3][4] もしcharacterが 'A'ならば、「character = A」を表示する。
 - [5] 中断して、switch文を終わる。
 - [2][6][7] もしがcharacterが'B'ならば、「character = B 」を表示する。
 - [8] 中断して、switch文を終わる。
 - [2][9][10] もしcharacterが'C'ならば、「character = C」を表示する。
 - [11] 中断して、switch文を終わる。
 - [2][12][13] もしcharacterが'D'ならば、「character = D」を表示する。
 - [14] 中断して、switch文を終わる。
 - [2][15][16] もしnumberが'E'ならば、「character = E」を表示する。
 - [17] 中断して、switch文を終わる。
 
式がString型のサンプルプログラム
このサンプルプログラムは、式にString型の変数Stringを使っている。この変数の値に対応するラベルに続く文、文字列の表示が行われる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						public class SwitchByStringTypeValue {     public static void main (String[] args){         String String = "水曜日";//[1]         switch (String) {//[2]             case "月曜日"://[3]                 System.out.println("[4] string = 月曜日");                 break;//[5]             case "火曜日"://[6]                 System.out.println("[7] string = 火曜日");                 break;//[8]             case "水曜日"://[9]                 System.out.println("[10] string = 水曜日");                 break;//[11]             case "木曜日"://[12]                 System.out.println("[13] string = 木曜日");                 break;//[14]             case "金曜日"://[15]                 System.out.println("[16] string = 金曜日");                 break;//[17]             case "土曜日"://[18]                 System.out.println("[19] string = 土曜日");                 break;//[20]             case "日曜日"://[21]                 System.out.println("[22] string = 日曜日");                 break;//[23]         }     } }  | 
					
実行結果
| 
					 1  | 
						[10] string = 水曜日  | 
					
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1]変数stringを宣言し、初期値の "月曜日"を代入する。
 - [2][3][4] もしstringが"月曜日" ならば、「string = 月曜日」を表示する。
 - [5] 中断して、switch文を終わる。
 - [2][6][7] もしstringが”火曜日”ならば、「string = 火曜日 」を表示する。
 - [8] 中断して、switch文を終わる。
 - [2][9][10] もしstringが”水曜日”ならば、「string = 水曜日 」を表示する。
 - [11] 中断して、switch文を終わる。
 - [2][12][13] もしstringが”木曜日”ならば、「string = 木曜日 」を表示する。
 - [14] 中断して、switch文を終わる。
 - [2][15][16] もしstringが”金曜日”ならば、「string = 金曜日 」を表示する。
 - [17] 中断して、switch文を終わる。
 - [2][18][19] もしstringが”土曜日”ならば、「string = 土曜日 」を表示する。
 - [20] 中断して、switch文を終わる。
 - [2][21][22] もしstringが”日曜日”ならば、「string = 日曜日 」を表示する。
 - [23] 中断して、switch文を終わる。
 
switch文で書くべきケース
switch文をどんな場面で使うかを考えてみよう。例えば、値のひとつひとつに対応した処理があると、if文で書くことを思いつくかもしれない。最初のサンプルプログラム「式がint型のサンプルプログラム」を、if文を使って書くと次のようになる。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						        int number = 2;//[1]         if (number == 1) {             System.out.println("[4] number = 1");         } else if (number == 2) {             System.out.println("[4] number = 2");         } else if (number == 3) {             System.out.println("[4] number = 3");         } else if (number == 4) {             System.out.println("[4] number = 4");         } else if (number == 5) {             System.out.println("[4] number = 5");         }  | 
					
コードの中にbreakがないので、if文を使ったほうがコンパクトに書ける気がして、このほうがいいと思ってしまうこともある。しかし、「3」と書くところを誤って「2」としてしまったらどうなるだろう。switch文はエラーになる。しかし、if文のほうはエラーにならない。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						switch文:       switch (number) {             …..             case 2:                 System.out.println("number = 2");                 break;           // case 2:   ←エラーになる                 System.out.println(" number = 3");                 break;             ….. } if文:       …..       } else if (number == 2) {             System.out.println("[4] number = 2");       } else if (number == 2) {             System.out.println("[4] number = 3");       …..  | 
					
つまり、if文ではこうした誤りが発見されないのだ。それで、ひとつひとつの値に対応した処理をする場合は、switch文を使うことを勧めたい。
まとめ
switch文の使い方がなんとなくわかっただろうか?
switchは使いたい場面が必ず出てくる。そのときになって思い出してもいいが、できる限り使い方を覚えておこう。

                    

