こんにちは。「Javaを復習する初心者」です。
EclipseでJava入門の第8回目です。今回はswitch-case文の解説をしようと思います。
パッケージlesson8を作ってその中にMain.javaを作ってください。public static void main(String[] args)メソッドが必要なので、作成するようにしてください。「新規Javaクラス」ダイアログで「どのメソッド・スタブを作成しますか?」という項目で「public static void main(String[] args)」にチェックをいれると以下のようにクラスが作られます。チェックを忘れた場合はコピーアンドペーストしても大丈夫です。
ソース
package lesson7;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
}
}
switch文の補完
7行目に「switch」と入力して、Ctrl + スペースキーを押します。自動保管機能のウィンドウが出てきます。一番上の項目が選ばれているので、その状態でEnterキーを押します。
以下のようにソースが補完されます。
ソース
package lesson8;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
switch (key) {
case value:
break;
default:
break;
}
}
}
7行目の「key」と8行目の「value」に赤線が引かれていると思います。keyに指定できる変数はいくつかありますが、そのひとつはint型です。keyがint型の変数だとします。valueの値が「どの値の場合」という指定valueです。valueの箇所はint型に収まる数値を記述します。つまり、「1」や「2」です。
基本的な使い方
switch-case文はif文に似ていて、大雑把にいうとkeyが特定の値の時に何を実行するかという条件分岐を記述する構文です。
Caseラベル
以下、単純な例です。
ソース
package lesson8;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
int key = 1;
switch (key) {
case 1:
System.out.println("Hello.");
System.out.println("Taro.");
break;
default:
System.out.println("Good.");
break;
}
System.out.println("End.");
}
}
上記を実行すると以下のようにコンソールに出力されます。
結果
Hello.
Taro.
End.
説明の便宜上、「Case 1:」を「値1のCaseラベル」という事にします。
処理の流れは以下です。
- keyの値が評価される。
- 「値1のCaseラベル」に処理がジャンプする。
- 「break;」まで処理が実行され、swicth文のブロックを抜ける。
上記はkeyの値が宣言時に「1」で初期化されているからです。
default
「int key = 2;」とした場合は、以下のように出力されます。
結果
Good.
End.
この場合、次のような処理の流れです。
- keyの値が評価される。
- keyの値に等しいCaseラベルがないため、「default:」の行に処理がジャンプする。
- 「break;」まで処理が実行され、swicth文のブロックを抜ける。
ジャンプすべきCaseラベルがない場合、「default:」の行に処理がジャンプするというのがポイントです。
caseを増やす
switch文の箇所について、keyの値に対して、次のような処理をしたいとします。
- keyが1の場合、「1です」と出力する
- keyが2の場合、「2です」と出力する
- 上記以外の場合、「1でも2でもありません」と出力する
keyが2の場合の処理を追加するには、以下のように「case 2:」と「break;」を追加し、間に処理を記述します。
ソース
switch (key) {
case 1:
System.out.println("1です。");
break;
case 2:
System.out.println("2です。");
break;
default:
System.out.println("1でも2でもありません.");
break;
}
上記のようにcaseラベルを追加することで分岐を増やすことができます。
「break;」に注意
switch文ではcaseラベルに処理がジャンプした後、「break;」まで処理されます。そのため、「break;」の有無で処理の流れが変わります。
以下は「case 1」の後に「break;」を記述していないプログラムです。
ソース
package lesson8;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
int key = 1;
switch (key) {
case 1:
System.out.println("Hello.");
case 2:
System.out.println("Taro");
break;
default:
System.out.println("Good");
break;
}
System.out.println("End.");
}
}
結果
Hello.
Taro
End.
処理の流れは、値1のcaseラベルに移り、「break;」まで実行されます。「case 2:」というのはジャンプ先のラベルであるので特も処理はなく、そのあとの「Taro」の出力がされます。
String型
String型は文字列を扱うクラスです。switch文に使用することができます。他にもEnum型というのが使えるのですが、それは省略します。
以下の例は、成績に応じてメッセージを表示するという例です。
ソース
package lesson8;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
String key = "A";
switch (key) {
case "S":
System.out.println("大変よくできました。");
break;
case "A":
case "B":
System.out.println("よくできました。");
break;
case "C":
System.out.println("がんばりましょう。");
break;
}
}
}
keyが”S”、”A”、”B”、”C”のどれかの場合、メッセージが出力されます。「default:」は省略可能で、上記では記述してません。なのでkeyが”D”などの場合はメッセージは出力されません。
“A”と”B”の場合は同じメッセージを出力しています。「case “A”:」の直後に「case “B”:」を記述していることに注意してください。