WisdomSoft - for your serial experiences.

3.3 switch文

特定の値を対象に、プログラムを多分岐させる switch 文について解説します。エラー数値の解析やメッセージ処理などに役に立ちます。

3.3.1 多分岐制御

if 文は 1 つの条件の結果からプログラムを分岐させることができましたが、条件の結果、多くの処理に分かれるような場合は必ずしも適切とは限りません。もちろん、if-else 形式の文を入れ子にすることで実現することはできますが、複雑なソースになってしまうことがあります。

そこで、1 つの条件から、多くの結果に分かれる処理の場合は if 文ではなく switch 文を使います。switch 文は boolean ではなく数値を分析して、その値から実行するべきコードを選択することができます。switch 文は次のような構造になります。

switch文
switch (式文) {
case 定数式1:
	ブロック文
	...
case 定数式2:
	ブロック文
	...
default:
	ブロック文
	...
}

switch に指定する式文の型は、byte、char、short、int 型のいずれかでなければなりません。switch 文に指定した整数型の式は case キーワードに続く定数式と比較され、等しいブロック文までジャンプします。case 定数式はいくつでも指定することが可能ですが、定数式の結果が同じ値になる case を重複させて定義することはできません。また 定数式は switch で指定した式の型に対して代入可能な型でなければなりません。

default は switch 文に対して常に 1 つだけしていすることができます。式文と case 定数式の比較の結果、一致する値が存在しなかった場合に default のブロック文が実行されます。default は省略することができます。

case と default の順番は自由です。通常、default はその性質から最後に配置されることが多いのですが、case にまたがってもコンパイルすることは可能です。case に指定することができるのは定数式であり、変数を指定することができないことに注意してください。

コード1
class Test {
	public static void main(String args[]) {
		int iValue = 1;

		switch(iValue) {
		case 0:
			System.out.println("switch case 0");
		case 1:
			System.out.println("switch case 1");
		default:
			System.out.println("switch default");
		case 2:
			System.out.println("switch 2");
		}
	}
}
実行結果
>java Test
switch case 1
switch default
switch 2

コード1は整数値 1 を格納した変数 iValue を switch の式に与えてプログラムを分岐させています。switch は式に与えられた値 1 に等しいcase 定数式に移動するため、プログラムは case 0 を無視して、case 1 のブロックまで移動します。ここで System.out.println("switch case 1"); が実行されるのは理解できると思いますが、実行結果を見るとその後のブロック文まで実行されていることがわかります。これはなぜでしょうか。

switch 文は、与えられた式から適切な case または default ブロックにジャンプするだけなのです。そのため、ジャンプ後はそれ以降の case や default ブロックも実行されてしまうのです。しかし、多くの場合、この性質は歓迎されません。コード1の場合も、case 1 のブロックのみが実行されることを期待しているものであり、それ以降のブロックが実行されることは望ましいことではありません。

この問題を解決するには、ブロックの最後に break 文を指定します。break 文は現在実行している文の集合の外に制御を移行するという意味があるキーワードで、switch 文のブロック内で指定すれば、switch 文から制御を抜け出すことができます。break 文の詳細については、繰り返し制御についても知っておくべきなので「3.8 break文とcontinue文」で説明します。

コード2
class Test {
	public static void main(String args[]) {
		switch(1) {
		case 0:
			System.out.println("switch case 0");
			break;	//switch から抜け出す
		case 1:
			System.out.println("switch case 1");
			break;	//switch から抜け出す
		default:
			System.out.println("switch default");
			break;	//なくても良い
		}
	}
}
実行結果
>java Test
switch case 1

コード2は実行結果を見てわかるように、case ブロック文を実行した後 break 文の効果によって switch 文の外に抜け出しています。これで、それ以下の switch ブロックが実行されるという問題を解消することができました。