switch文

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


if文と switch文

条件分岐と言えば if文ですが、一部の条件分岐についてはswitch文で書いたほうが分かりやすいことがあります。

例えば、以下の仕様を考えてみます。

  • ユーザに入園何年目か聞く。
  • 1の場合は年少、2の場合は年中、3の場合は年長と表示する。
  • それら以外の値が入力されたときには何も表示しない。

これを if文を用いて実装すると、以下のようなプログラムになります。

E201/MySystem.java(ライブラリをそのまま利用します)

E201/E201.java

/**
 * 園児の組を表示します(if文を使用)
 */
public class E201 {
	
	/**
	 * メインメソッド
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int now;
		
		now = MySystem.in.getInt("入園何年目ですか");
		
		if(now == 1) {
			System.out.println("年少ですね");
		} else if(now == 2) {
			System.out.println("年中ですね");
		} else if(now == 3) {
			System.out.println("年長ですね");
		}
	}
}

同じプログラムを switch文で実現してみます。予約語switchcasebreakを使用します。

E202/MySystem.java(ライブラリをそのまま利用します)

E202/E202.java

/**
 * 園児の組を表示します(switch文を使用)
 */
public class E202 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int now;
		
		now = MySystem.in.getInt("入園何年目ですか");
		
		switch(now) {
		case 1:
			System.out.println("年少ですね");
			break;
		case 2:
			System.out.println("年中ですね");
			break;
		case 3:
			System.out.println("年長ですね");
			break;
		}
	}
}

実行結果の例は以下の通り。

入園何年目ですか? 2
年中ですね
入園何年目ですか? 6

switch文のほうがすっきりしているように感じられるでしょうか。もし気に入ったなら使ってみてください。

なお、switch文の中のインデントは少し特殊です。caseの行はインデントをしないことに注意してください。

複数の caseと default

ここでは 2つ以上の caseで同じ処理をさせたいときの方法と、予約語defaultについて学習します。

プログラムの仕様を以下に定めました。

  • ユーザに小学校何年生か質問する。
  • 1,2の場合は低学年と、3,4の場合は中学年と、5,6の場合は高学年と表示する。
  • 上記以外の値が入力されたときは、異常表示する。

この仕様を満たすプログラムは以下の通り。

E203/MySystem.java(ライブラリをそのまま利用します)

E203/E203.java

/**
 * 小学生の呼び名を表示します。
 */
public class E203 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int now;
		
		now = MySystem.in.getInt("小学何年生ですか");
		
		switch(now) {
		case 1:
		case 2:
			System.out.println("低学年ですね");
			break;
		case 3:
		case 4:
			System.out.println("中学年ですね");
			break;
		case 5:
		case 6:
			System.out.println("高学年ですね");
			break;
		default:
			System.out.println("異常な値が入力されました");
			break;
		}
	}
}

実行結果の例は以下の通り。

小学何年生ですか? 5
高学年ですね
小学何年生ですか? 100
異常な値が入力されました

caseで複数の値を指定したい場合は、このように複数並べます。また、defaultは、どのcaseにも該当しなかった場合に処理を記述します。if文で言うところのelseのような存在ですね。

breakを付け忘れると?

気をつけていないとよくやってしまうことが、break;の書き忘れです。書き忘れてもビルドエラーにはならないため、気づかないままでいてバグの原因になることがあります。

さきほどのプログラムを基にbreak;を削除してみたものが以下になります。

E204/MySystem.java(ライブラリをそのまま利用します)

E204/E204.java

/**
 * 小学生の呼び名を表示します。
 * breakつけ忘れのため、バグあり。
 */
public class E204 {

	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int now;
		
		now = MySystem.in.getInt("小学何年生ですか");
		
		switch(now) {
		case 1:
		case 2:
			System.out.println("低学年ですね");
		case 3:
		case 4:
			System.out.println("中学年ですね");
		case 5:
		case 6:
			System.out.println("高学年ですね");
		default:
			System.out.println("異常な値が入力されました");
		}
	}
}

実行結果の例は以下の通り。

小学何年生ですか? 1
低学年ですね
中学年ですね
高学年ですね
異常な値が入力されました

ご覧のようにバグが発生しています。せっかくcaseで捉えたものの、break;の書き忘れによって、次へ次へとプログラムが実行されてしまっています。break;忘れには気をつけましょう。

最終更新: 2013/01/31 , 公開: 2013/01/31
▲top