条件分岐と言えば if文ですが、一部の条件分岐についてはswitch文で書いたほうが分かりやすいことがあります。
例えば、以下の仕様を考えてみます。
これを 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文で実現してみます。予約語switch、case、breakを使用します。
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の行はインデントをしないことに注意してください。
ここでは 2つ以上の caseで同じ処理をさせたいときの方法と、予約語defaultについて学習します。
プログラムの仕様を以下に定めました。
この仕様を満たすプログラムは以下の通り。
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;を削除してみたものが以下になります。
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;忘れには気をつけましょう。