カテゴリー
Java

Java(Step3-2)

プログラムの流れの分岐

Switch文

if文は、ある条件の判定結果に応じて、プログラムの流れを2つに分岐していました。switch文を用いると、一度に複数の分岐ができます。

switch文

以下に示すのは、キーボードから入力された値に応じてジャンケンの手を表示するプログラミングです。

//FingerFlashing1.java
//読み込んだ値に応じてジャンケンを表示(if文)
import java.util.Scanner;

public class FingerFlashing1 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("何を出しますか?(0…グー、1…チョキ、2…パー):");
        int hand = stdIn.nextInt();

        if(hand == 0)
            System.out.println("グー");
        else if(hand == 1)
            System.out.println("チョキ");
        else if(hand == 2)
            System.out.println("パー");
        stdIn.close();
    }    
}
FingerFlashing1.java実行結果

このプログラムのif文は、handの値によって分岐しています。プログラミング作成時にはhandが何回もタイプするので、煩わしいです。

そこで、分岐を簡潔に表現するのがswitch文(switch statement)になります。switch文は、ある式を評価した値によってプログラムの流れを複数に分岐させる文であり、切り替えスイッチのようなものになります。

次に示すのは、switch文で上のプログラムを書き換えたものになります。

//FingerFlashing2.java
//読み込んだ値に応じてジャンケンを表示(switch文)
import java.util.Scanner;

public class FingerFlashing2 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("何を出しますか?(0…グー、1…チョキ、2…パー):");
        int hand = stdIn.nextInt();

        switch(hand){
        case 0:System.out.println("グー");break;
        case 1:System.out.println("チョキ");break;
        case 2:System.out.println("パー");break;
        }
        stdIn.close();
    }    
}
FingerFlashing2.java実行結果
ラベル

プログラムの流れがswitch文に差し掛かると、まず()内に書かれた制御式の評価が行われます。そして、その結果に応じてswitch文内のどこにプログラムの流れを移すか決定します。もし、制御式のhandの値が1であれば、プログラムの流れは

case 1:   //handが1のときの飛び先を表すラベル

と書かれた目印へと一気に移ります。プログラムの飛び先を示す目印がラベル(label)です。

プログラムの流れがラベルに飛んだあとは、その後ろに置かれた文が順次実行されます。この場合、handが1であれば、まず以下の文が実行されます。

System.out.println("チョキ");

これで、画面に”チョキ”と表示されます。

break文

プログラムの流れが、break文(break statement)と呼ばれる、

break;

に行き着くと、switch文の実行は終了することになります。breakとは「破る」意味の語句で、break文が実行されると、プログラムの流れはswitch文を突き破って抜け出ます。

より、switch文における、ラベルとbreak文の働きの理解を深めるために以下のコードをチェックしましょう。

//SwitchBreak.java
//switch文とbreak文の復習
import java.util.Scanner;

public class SwitchBreak {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);
        System.out.print("整数を入力してください:");
        int n = stdIn.nextInt();

        switch(n){
            case 0:System.out.print("A");
                   System.out.print("B");
                   break;
            case 2:System.out.print("C");
            case 5:System.out.print("D");
                   break;
            case 6:
            case 7:System.out.print("E");
                   break;
            default:System.out.print("F");
                    break;
        }
        System.out.println();
        stdIn.close();
    }
}
SwitchBreak.java実行結果
defaultラベル

今回のプログラムには、

default:    //どのラベルとも一致しないときの飛び先を表すラベル

というラベルがあります。分岐のための制御式を評価した値が、どのcaseとも一致しないときは、プログラムの流れはこのラベルに飛ぶことになります。

選択文

if文とswitch文は、プログラムの流れを分岐させるという点で共通しています。これらをまとめて選択文(selection statement)と呼びます。

単一の式の値によるプログラムの流れの分岐は、if文ではなくswitch文によって実現したほうがよい場合が多いので、分岐処理をする際は読み手に分かりやすい処理を検討するようにしましょう。