switch文を使った条件分岐
Java で条件分岐を行う時に利用できる switch 文の使い方について解説します。 switch 文は対象の式を評価した値を、複数の値の候補と比較して一致するラベルの位置へ処理を移すために使います。 if 文でも同じことが可能ですが、対象の値を数多くの値の候補と比較したい場合に簡潔に記述できます。
(Last modified: )
switch文の基本的な使い方
switch 文は式を評価した値を、複数の値の候補と比較して一致したラベルへ処理を移すことができます。書式は次のとおりです。
switch (式){ case 定数1: // 式を評価した値が定数1と一致したときに実行される処理 ... break; case 定数2: // 式を評価した値が定数2と一致したときに実行される処理 ... break; ... }
switch 文では最初に式を評価します。そして case の後に記述されたラベルの値と一致したものがあった場合に、そのラベルの位置へ処理を移します。
次のサンプルをみてください。
int num = 2; switch(num){ case 1: System.out.println("Aクラス"); break; case 2: System.out.println("Bクラス"); break; case 3: System.out.println("Cクラス"); }
switch 文で変数 num の値を評価し、値が 1 または 2 または 3 だった場合に、そのラベルの位置へ処理を移動します。今回の場合は変数が 2 なので、ラベル 2 の位置へ移動したあと「Bクラス」と画面に出力し、そのあとの break 文で switch 文を終了します。
式とラベル名に記述できる値の制限
式で評価した値は整数型( char, byte, short, int )か Stirng 型か列挙型である必要があります。 double 型や整数型でも long 型の値となるような式は利用できません。
例えば式の箇所に long 型の値が格納された変数を記述すると、コンパイル時に「エラー: 不適合な型: 精度が失われる可能性があるlongからintへの変換」というエラーが表示されます。もし double 型や long 型が格納された変数を式に記述する場合は、キャスト演算子を使って int 型に変換してください。
double d = 3.0; switch((int)d){ case xx: ... case xx: ... }
また case のあとに記述するラベル名は定数式である必要があります。変数は指定できないのでご注意ください。
switch文の処理の流れとbreak文について
switch 文は if 文と似ていますが、式の値に応じて実行する処理がそれぞれブロックに分かれて記述されているわけではありません。ブロックは switch 文全体に対してあるだけです。
switch(式){ ... ... ... ... ... } System.out.println("End");
switch 文の中のどの位置へ処理を移すのか目印としてラベルを記述します。
switch(式){ case ラベル1: ... ... case ラベル2: ... ... case ラベル3: ... ... } System.out.println("End");
式を評価した値が例えばラベル2だった場合、ラベル2の位置に処理が移動しそのあとに記述された処理が順番に実行されていきます。ただブロックで分かれているわけではないのでラベル2の下にある処理に加えてラベル3の下にある処理もすべて実行されます。
そこで、ラベル2の位置から処理の実行を行ったあと、ラベル3の前で処理の実行を終了し switch 文を終了させたい場合は、終了させたい位置に break 文を記述します。
switch(式){ case ラベル1: ... ... break; case ラベル2: ... ... break; case ラベル3: ... ... } System.out.println("End");
今度は式を評価した値が例えばラベル2だった場合、ラベル2の位置に処理が移動しそのあとに記述された処理が順番に実行されていきますが、 break 文が実行されると switch 文が強制的に終了となるため、ラベル3以降に書かれている処理は実行されません。
このように break 文は switch 文を強制的に終了させるために記述しているものなので、ラベル毎に実行する最後の処理として記述します。なお最後に記述したラベルについては実行する最後の処理として break 文を記述しなくてもそれ以降の処理がないので記述する必要はありません。
※ break 文は switch 文の他に for 文や while 文を途中で強制的に終了させるために使用します。詳しい使い方については「break文の使い方」を参照されてください。
それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample4-1.java という名前で保存します。
class JSample4_1{ public static void main(String[] args){ int[] classcode = {1,3,2}; String[] name = {"鈴木","本田","遠藤"}; for (int i = 0; i < 3; i++){ System.out.print(name[i] + "さんは"); switch(classcode[i]){ case 1: System.out.println("Aクラスです"); break; case 2: System.out.println("Bクラスです"); break; case 3: System.out.println("Cクラスです"); } } } }
コンパイルを行います。
javac -encoding UTF-8 JSample4_1.java
その後で、次のように実行してください。
java JSample4_1
配列に格納された 3 つの数値を for 文を使った順に取り出します。取り出した値を switch 文を使って条件分岐し、数値毎に異なるメッセージを画面に表示しました・
defaultラベルを利用する
switch 文で default ラベルを使用すると、式を評価した値がいずれのラベルとも一致しない場合のラベルとして使用することができます。
switch (式){ case 定数1: // 式を評価した値が定数1と一致したときに実行される処理 ... break; case 定数2: // 式を評価した値が定数2と一致したときに実行される処理 ... break; ... default: // 他のすべてのラベルと一致しないときに実行される処理 ... }
次のサンプルをみてください。
int num = 2; switch(num){ case 5: System.out.println("一等賞"); break; case 2: System.out.println("二等賞"); break; default: System.out.println("残念賞"); }
変数 num の値を評価し、 5 か 4 であった場合はそれぞれ対応するラベルの位置へ処理が移りますが、それ以外の場合は default ラベルの位置へ処理が移ります。
複数のラベルに対して同じ処理を行う
switch 文におけるラベルは、どこから処理を始めるのかの目印のようなものです。ラベル毎に別々の処理を記述する必要はなく、複数のラベルを続けて記述することもできます。
次のサンプルを見てください。
int num = 2; switch(num){ case 1: case 3: case 5: System.out.println("大当たり"); break; case 2: case 4: System.out.println("残念賞"); }
変数 num の値を評価し、 1 か 3 か 5 だった場合はそれぞれのラベルの位置へ処理が移りますが、いずれの場合もラベルの位置から break 文を実行するか switch 文の最後までの処理を順に実行していくので「大当たり」と画面に表示する処理を実行することになります。同じように 2 か 4 だった場合は「残念賞」と画面に表示する処理を実行します。
このように複数のラベルを続けて記述し、ラベル毎に break 文を記述しないようすることで、複数の値と一致した場合に同じ処理を実行することができます。
-- --
Java で条件分岐を行う時に利用できる switch 文の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。