switchはifと同様の分岐を行う為の構文となります。
使い勝手がいいのはif文ですが、switchを使うことによってコードがすっきりしたり、可読性があがったりします。
もくじ
switchとifの違い
switchはifと違い条件で分岐を行わず、値を利用して分岐を行う構文となっています。
ある変数やデータの状態が指定された値と同一かどうかを判断して分岐を行う為、ifのように比較演算や論理演算などで条件を作成して分岐を行う場合はifを利用することになります。
switchの文法
前項でも触れたように、switchでは条件ではなくなにかしらの値(式)を利用して分岐を行います。式に利用できる型には制限があります。
式の部分に利用できる型 |
---|
byte、short、int、char、String(Java7から)、enum |
switchはcase(の右側)の値が式と同一であるかどうかを判別して処理を行う文法です。
caseは複数記述することができ、通常caseの最後にはbreakと呼ばれる文法を記述します。
(理由は後述)
また、default部分は記述が任意になっており、defaultを追加するとcaseに当てはまらなかった場合の処理を記述することができます。
switchの文法※ | switch(式){
case 値1: 値1に一致した時の処理 ; break; case 値2: 値2に一致した時の処理 ; break; default: どのcaseにも一致しなかった時の処理 ; } |
---|---|
記述例※ | int number = 7;
switch(number){ case 7: System.out.println(“ラッキーセブン”); break; case 8: System.out.println(“末広がり”); break; default: System.out.println(“7か8以外の数字”); } |
※文法や例ではcaseは2つとなっていますが、3つ以上に増やすことも可能です。
※caseの値には変数は記述できませんが、定数であれば記述可能です。
記述例では、numberが7の場合は「ラッキーセブン」と表示、numberが8の場合は「末広がり」と表示、それ以外の場合は「7か8以外の数字」と表示する分岐となっています。
switch文 サンプルプログラム
以下のプログラムを「Number15.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Number15{ public static void main(String[] args){ //現在の月 int current_month = 2; System.out.println("現在は" + current_month + "月です。"); switch(current_month){ case 2: System.out.println("31日はありません。"); break; default: System.out.println("31日まであります。"); } } } |
実行例
c:\work>javac Number15.java
C:\work>java Number15
現在は2月です。
31日はありません。
※実行例はコンパイルから実行までの例を表示しています。
switchを記述する際のポイント
switch文では、「式」「break」の記述がポイントです。
switchの式
式には利用できる型であれば、変数やデータ、演算(結果が式に利用できる型になる)を記述することができます。
例えば、式内には以下のような記述が可能です。caseには式内に記述された型に対応するデータを記述します。
記述例 | 式に対応する型 |
---|---|
switch(5){ | int |
int a = 5;
switch(a){ |
int |
int a = 5;
switch(a + 10){ |
int |
char color = ‘赤’;
switch(color){ |
char |
switch内のbreak
breakは通常、forやwhileといった反復処理の時に利用されますが、switch文の中でも利用ができます。
実はswitch文はcaseの値と合致すると、それ以降のswitchの処理を全て行います。その処理を途中で終了させるのが、breakの役目です。
例えば、以下のように「Number15.java」のbreak;をコメントアウトしてみると、2行表示されてしまいます。
switchはcaseの値と式の値が同一であるかどうかを判定する為、○○以上(以下)、○○~○○といった「複数の値を判別させる」といったことが、caseと式の組み合わせではできません。
しかし、breakの記述箇所を工夫することにより、以下のような記述も可能です。
switch文 サンプルプログラム
「Number15.java」を以下のようにcaseを追加してみましょう。また、current_monthの値の変更とbreak部分のコメントは削除しています。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Number15{ public static void main(String[] args){ //現在の月 int current_month = 9; System.out.println("現在は" + current_month + "月です。"); switch(current_month){ case 2: case 4: case 6: case 9: case 11: System.out.println("31日はありません。"); break; default: System.out.println("31日まであります。"); } } } |
実行例
c:\work>javac Number15.java
C:\work>java Number15
現在は9月です。
31日はありません。
※実行例はコンパイルから実行までの例を表示しています。
Number15.javaの補足説明
Number15は以下のようにcaseが複数行ならんでいます。
case 2:
case 4:
case 6:
case 9:
case 11:
case部分の基本形は各caseの最後にbreakを入れて、「caseに当てはまったら処理を行いbreakで終了」という記述になります。
しかし、上記の様に記述すると、caseが2・4・6・9・11の間にはbreakが無い為、switchの処理は続きます。
「2・4・6・9・11の場合は”31日はありません。”と表示する」という流れになり、表示後にbreakがある為、そこでswitchが終了します。
上記のswitchの記述はifの条件では以下のように置き換えることができます。
if(current_month == 2 || current_month == 6 ||
current_month == 9 || current_month==11 ){
上記の条件はor演算を複数利用しなければならない為、breakを活用したswitchのコードに置き換えることで、コードをすっきりさせることもできます。
switch文 復習問題
- switchの式に記述できないものを選んで下さい。
- 解答群
- 10L
- 5
- ‘a’
- 6 + 6
- switchの式に記述できないものを選んで下さい。
- 解答群
- 10.8
- ‘朝’
- 8 * 8
- 6 – 5 * 7
- switchには複数の○が記述できる。○に入る語句を選んでください。
- 解答群
- default
- case
- else
- 式
- switchにはcaseに当てはまらなかった場合は○を記述して処理を行う。○に入る語句を選んでください。
- 解答群
- break
- 式
- default
- else
- 以下の説明文で正しいものを選んで下さい。
- 解答群
- defaultは必ず記述する必要がある
- breakは必ず記述する必要がある
- defaultの記述は任意である
- breakの記述は任意だが、defaultでは必ず記述しなければならない
- 以下のswitch文で表示される記述を選んで下さい。
12345678char color = '青';switch(color){case '赤': System.out.print("red.");break;case '青': System.out.print("blue.");break;default : System.out.print("etc.");} - 解答群
- red.
- blue.
- red.blue.
- red.blue.etc.
- 以下のswitch文で表示される記述を選んで下さい。
123456char color = '青';switch(color){case '赤': System.out.print("red.");case '青': System.out.print("blue.");default : System.out.print("etc.");} - 解答群
- blue.
- blue.etc.
- red.blue.etc.
- red.etc.
- お疲れ様でした。
まとめ
- switch文を利用すると分岐処理を行える
- switchはifと違い、式で指定された変数やデータがcaseの値と一致するかどうかで分岐を行う
- switchの式で利用できる変数やデータは型に制限がある(byte、short、int、char、String[Java7から]、enum)
- defaultを記述すると、一致しなかった場合の処理が記述できる
- caseで合致した移行の処理はbreakで止める
- breakの記述は必須ではない