Javaのswitchで条件分岐をさせる方法をマスターしよう!
18/12/13 17:38:41 19/05/05 16:29:35
条件分岐はプログラミングにおいて繰り返し文と並ぶ超重要アルゴリズムですが、いくつかの実装方法があります。なかでもif文がもっとも有名かつ使用頻度も高いかと思いますが、その次くらいにswitchを使った条件分岐が有名なのではないでしょうか。
if文が二通りの条件で分岐させていくのに便利な構造をしているのに対し、switchは三通り以上の条件で分岐させるときに便利な構造をしています。if文で実装するとネストが深くなってしまう場合などは、switch文を使用すると便利です。それでは具体的に解説していきます。
switch-caseの基本構文
switch文を記述する際は、条件ごとにcaseを割り当てます。caseというのはそのままの意味で、和訳すると「場合」ということです。文法は以下のようになります。
switch (条件式) {
case 値A:
// 式の値と値Aが一致したときの処理
break;
case 値B:
// 式の値と値Bが一致したときの処理
break;
default:
// 無条件に実行される処理(式の値がどのcaseの値とも一致しなかったときの処理)
}
まずswitchの後ろのかっこのなかに条件式を記述し、caseごとに値を記述して当てはまるかどうかチェックしていきます。そして条件式と値が一致するとcase文のなかの処理が実行されます。
case文のなかにbreakを記述していますが、これはbreakによってswitch文を終了させるためのコードです。breakさせないと後ろのcase文も判定される仕様になっており、この点はif文と異なるポイントです。
if文の場合たとえばif文に合致してif文内の処理が実行されれば、以降のelse文やelse-if文が実行されることはありません。しかし、switch文では以降のcase文の判定も行われる仕様になっているので、それを避けるためにはbreakさせる必要があるのです。
ちなみに、あえてbreakさせずに後ろのcase文の判定を行わせることもあります。たとえば偶数全部に対して処理を行い、なおかつ4の倍数なら別の処理を追加で行う、といった処理があるとします。
この場合偶数判定のcase文と4の倍数かどうかをチェックするcase文を別に用意しておけば、2回チェックして処理を実行できます。最後のdefaultについてですが、これは無条件に実行されます。
case文のなかでbreakさせるとdefaultには入りませんが、case文でbreakさせないと処理がswitch文の最後まで行われるので、defaultに入ります。またどのcase文の条件にも合致しなかった場合もdefaultまで処理が走るので、defaultの処理が実行されます。
ほとんどの場合switch文を記述する際はdefaultも記述しますが、記述しなくても問題はなく、上記のようにあえてcase文のなかでbreakさせない場合などはdefaultも記述しないことがあります。
ただし、breakやdefaultを入れないと思わぬバグにつながりやすいので、実際のプロジェクトなどでは、だいたいswitch文のなかにbreak処理とdefault処理を入れることがルール化されているかと思います。
switch-caseのサンプルコード
上で説明したswitch-caseの構文を元に、サンプルコードを紹介します。
public class SwitchSample {
public static void main(String[] args) {
int num = 2;
switch (num) {
case 1:
System.out.println("1が入力されました");
break;
case 2:
System.out.println("2が入力されました");
break;
case 3:
System.out.println("3が入力されました");
break;
default:
System.out.println("1~3以外が入力されました");
}
}
}
上記のサンプルコードを実行すると、以下のようにコンソール出力されます。
2が入力されました
switch文では変数numのチェックを行っていますが、numには2が入っています。そのため、case 2の処理内容が実行されました。switchの後ろのかっこ内に直接数値や式を入れることも可能ですが、実際にそういった書き方をすることは稀でしょう。
なぜなら、switchの後ろに自分で数字を書くならわざわざcase文で判定する必要がないからです。上のサンプルコードのように、何らかの値が入った変数をチェックして条件分岐させるケースが多いです。
ちなみに、たとえば上のサンプルコードでnumに0が入っていた場合、どのcase文にも合致しないためdefaultの処理が実行されます。
複数のcase文で同じ処理を実行する場合
上の例では、case文それぞれに処理内容を記述していました。しかし、複数のcase文で同じ処理を実行したい場合もあるかと思います。上のサンプルコードでも、case文のなかで出力しているのは変数の中身+“が入力されました”という文字列です。
case文の処理をまとめて、変数の中身を出力するようにすれば、よりシンプルなコードにまとめることが可能です。具体的には以下のようになります。
public class SwitchSample {
public static void main(String[] args) {
int num = 2;
switch (num) {
case 1:
case 2:
case 3:
System.out.println(num+"が入力されました");
break;
default:
System.out.println("1~3以外が入力されました");
}
}
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
2が入力されました
前のサンプルコードと同じ結果になりました。defaultの内容だけ分けておけば、通常処理だったのか例外処理だったのかがわかりやすいです。
case文で文字列を判定する
上で紹介したサンプルコードではcase文で数値の判定を行いました。実際の開発現場でも数値で判定することが多いのですが、文字列で判定することも可能です。Java6以前の環境ではenumを使用していたのですが、Java7からはそのままString型で判定することができます。具体的には以下のようになります。
public class SwitchSample {
public static void main(String[] args) {
String num = “二”;
switch (num) {
case “一”:
case “二”:
case “三”:
System.out.println(num+"が入力されました");
break;
default:
System.out.println("一~三以外が入力されました");
}
}
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
二が入力されました。
String型でも判定できるということです。enumを使った方法は少し難易度が上がるため、今回は割愛します。switch文は数値判定で使用することが多く、またJava7からはString型でもそのまま判定できるので、switch文でenumを使用するケースは少数派です。
switch文を勉強し始めてすぐにenumと組み合わせた使い方を覚える必要はないので、必要に応じてまた改めて調べていただければ良いかと思います。まずは今回紹介した内容を押さえておけば、switch文を自由に使いこなすことができるでしょう。
Javaのフリーランス案件をチェック
人気記事