switch文とは?(構文と使い方)【ゼロから始めるJavaの基礎~その19~】

前回まではプログラムに条件分岐を実装する場合に使用する『if文』のご紹介をしてきました。

今回からは、同じように条件分岐を作る際に使用できる『switch文』と呼ばれる構文をご紹介していきます。

『if文』と『switch文』の違いと使い分け方についてはこのトピックの後半でご紹介予定です。

switch文の構文

『switch文』も『if文』と同じように条件分岐を行いたい場合に使用する構文ですが、『if文』とは構文の形やキーワードが異なります。まずはどのような構文なのかを見てみましょう!

【構文】

switch (変数) {

 case 値1:
  『変数の値=値1』の場合に実行する処理1;
  break;

 case 値2:
  『変数の値=値2』の場合に実行する処理1;
  break;

 case 値3:
  『変数の値=値3』の場合に実行する処理1;
  break;

 default;
  どのケースにも合致しなかった場合に実行する処理;

}

少し複雑に見えるかもしれませんが、一つずつ説明していきますので、ご安心くださいね。

まずは『switch』、『case』、『break』、『default』という4つのキーワードに注目してください。

『switch』

『switch文』も『if文』がifから始まるのと同じように『switch』というキーワードからスタートします。(変数)の部分には値を持った変数を置きます。

『case』

『case』は条件判定の目印です。
『case』というキーワードの後ろには変数の値と比較したい値を記述します。

この2つの値が等しい場合には、その次の行に記述した処理が実行されます

ちなみに、値の後ろに記述する記号は『:(コロン)』です。
『;(セミコロン)』ではありませんので気をつけてくださいね。

『break』

『break』は『case』から始まるブロックの終わりに記述するキーワードと思ってください。

『case』から始まる条件判定と、実行する処理の記述までをひとまとまりとして、その後ろに『break』を記述するイメージです。

つまり、『case~break』が条件判定のひとかたまりになっていて、構文ではそのブロックが3つ記述してあるというわけです。

この条件判定のブロックは、分岐したい数に応じて自由に増減させることが出来ます。

『default』

『default』の次の行には、1つ目の『case』ブロックから順に変数の値との比較を行った結果、等しい値がなかった場合に行いたい処理を記述します。

if文でいうと『else{ }』の部分のようなイメージで、必要がない場合、このブロックは記述しなくても構いません

それでは実際の動きをサンプルプログラムで見てみましょう!

【サンプル】

※サンプルプログラムの動かし方はこちら

int menuNo = 2;

switch(menuNo) {

case 1:
	System.out.println("登録機能を呼び出す");
	break;

case 2:
	System.out.println("編集機能を呼び出す");
	break;

case 3:
	System.out.println("削除機能を呼び出す");
	break;
	
case 4:
	System.out.println("検索機能を呼び出す");
	break;

default:
	System.out.println("システムを終了する");	
}

実行結果

今回のサンプルでは1行目で『menuNo』という変数に2を代入して、その値で条件分岐をしています。

2つ目の『case』ブロックで条件が一致しますので、そのブロックに記述されている処理が実行されていますね。

switch文での『break』の記述忘れ

『case』から『break』までが一連の条件分岐のブロックになっているということをご紹介しました。

仮に『break』を記述しなかった場合でも、実はエラーにはならず処理が実行されます

この時、ちゃんと『break』を記述した場合と、しなかった場合でプログラムの動きが変わりますので注意が必要です。

まずはサンプルと、実行結果を見てみてください。

【サンプル】

int menuNo = 1;

switch(menuNo) {

case 1:
	System.out.println("登録機能を呼び出す");

case 2:
	System.out.println("編集機能を呼び出す");

case 3:
	System.out.println("削除機能を呼び出す");
	break;
	
case 4:
	System.out.println("検索機能を呼び出す");
	break;

default:
	System.out.println("システムを終了する");	
}

【実行結果】

実行結果を見てみると1つ目から3つ目の『case』ブロックに記述されている処理が実行されているのが分かりますね。

ところが、4つ目のブロックに記述されている処理は実行されていません

実は『case』ブロックが『break』キーワードによって閉じられていなかった場合、次の『case』ブロックの処理が判定の結果に関わらず自動で実行されてしまいます

そのため、1つ目の『case』ブロックの条件が値と一致して処理が実行されたあと、2つ目、3つ目は条件が一致しないにも関わらず処理が連続で実行されてしまいます。

3つ目のブロックには『break』キーワードが記述されていますので、ここでswitch文を抜けることから、4つ目の処理は実行されません

このように、switch文では『break』キーワードで明示的にswitch文を抜けることを指示しなかった場合、その後に続く処理が無条件で実行されてしまいますので気をつけましょう。

鋭い方はお気づきかもしれませんが、このルールを使って、複雑な処理を実装することも出来ますが、エラーの原因ともなりやすいので現場では実装例を見たことはありません。

基本的には『case』ブロックの終わりには『break』を記述すると覚えておいた方が良いでしょう。

記述しなかった場合にどんな挙動になるのかということだけは一応覚えておいてください。

if文とswitch文の使い分け

ここまで『switch文』の使い方をご紹介してきましたが、条件分岐を行うという点では『switch文』の働きは『if文』と同じですよね。

この2つの構文の違いや、使い分け方について疑問を持っている方もいるかも知れませんが、基本的には『if文』を使うというスタンスでいいと思います。

開発現場でも『switch文』よりは『if文』の方が使用割合は圧倒的に『if文』の方が多いです。

『switch文』の場合は値と等しいかどうかを比較した分岐しか行えないため、そもそも利用できる場面が少ないということもあります。

値と等しいことを比較し、なおかつ項目数が多い場合は『switch文』で記述するのがシンプルで分かりやすいですが、このような特別な場合以外は『if文』を使えば問題ありません。

どちらを使えばよいか迷った場合はとりあえず『if文』で書いてみましょう。

これで『分岐構造』を実装するための構文の紹介は終わりになります。
次回からはもう一つ、プログラムを作るうえで欠かせない『反復構造』についてご紹介をしていきます。

最後までお読みいただきありがとうございました。