switch 文

6.7 switch 文

 if 文では、ある条件の判定結果に基づいて、プログラムの流れを 2 つに分岐しましたが、switch 文を用いるとプログラムの流れを 2 つよりも多く分岐することができます。

書式:switch 基本構文

 if 文では、条件式の解は true か false のどちらかである必要がありました。しかし、switch 文の場合は、式には変数や計算式が当てはまります。ただし、その解に有効な型は、byte、short、char、int、String に限られていますので、注意が必要です。
 switch 文では、式の解と case の定数を上から順に比較し、等しかった場合にその case の次の処理から順に行われます。break 文が実行されると、switch 文をそこで抜けます。式の解がどの case の定数とも等しくなかった場合は、default の次の処理から順に実行されます。
 switch 文の処理の流れをフローチャートにすると、図 6.7.1 のようになります。

図 6.7.1 : switch 文基本構文


 次に説明するように、default や一番最後の条件式以外から break を省略すると、処理の流れが変わってしまうので注意して下さい。

default や一番最後の条件式以外から break を省略した場合

 この switch 文の処理の流れをフローチャートにすると、図 6.7.2 のようになります。break 文がないので、途中で switch 文を抜けることができません。

図 6.7.2 : break 文のない switch 文


case 1 と式の解が等しい場合
 処理① → 処理② → 処理③ → 処理④ と実行されます。
case 2 と式の解が等しい場合
 処理② → 処理③ → 処理④ と実行されます。
case 3 と式の解が等しい場合
 処理③ → 処理④ と実行されます。
式の解がどの case とも等しくない場合
 処理④のみ実行されます。

ポイント

・ 複数の条件によって処理を分岐する場合、switch 文を使うことができる。
・ ただし、break 文の有無で、意図した処理と違う動きをすることがあるので注意する必要がある。
・ switch 文の式に使える変数や計算式の解の型 byte、short、char、int、String のみである。
・ 条件を判断する case に定数しか使えない。


定数とは

 定数とは「変更できない値」のことを指します。該当するもとのして「リテラル」と「final 変数」があります。
 リテラルはプログラム上に直接書かれた数値や文字列を指します。
 ※「int i = 100;」の「100」や「String s = “文字列”;」の「”文字列”」という値の部分のことです。
 「変数」は後から値を代入することで格納されている値を変更する事ができましたが、Java では、初期化の時の値に固定され、値を変更できない「定数」として扱う final 変数があります。詳細は「Java 基礎テキスト」で説明します。
 なお、定数として扱う変数名は全て大文字で記述し、単語と単語の間をアンダースコア(_)で繋ぎます。

6.7.1 break を含む switch 文を使ったプログラム

 break を含む switch 文を使ったプログラムを作成し、break がある場合と無い場合で動きがどのように変わるのかを確認しましょう。

① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :SwitchStatement
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ SwitchStatement.java

package jp.co.f1.intro.ch6;
	
import java.util.Scanner;

public class SwitchStatement {

	public static void main(String[] args) {

     System.out.println("1.お茶 2.コーヒー 3.紅茶 4.ミネラルウォーター"); 
     System.out.print("お好きな飲み物の番号を入力して下さい。>"); 
	
     Scanner scan = new Scanner(System.in); 
     int num = scan.nextInt(); 
	
     switch(num) { 
     case 1: 
        System.out.println("100 円になります。"); 
        break; 
     case 2: 
        System.out.println("200 円になります。"); 
        break; 
     case 3: 
        System.out.println("300 円になります。"); 
        break; 
     case 4: 
        System.out.println("400 円になります。"); 
        break; 
     default : 
        System.out.println("番号が不正です。"); 
        break; 	
	
     }
	   
  }
	
}

実行結果

2を入力した場合


6を入力した場合

解説

  12 行目はキーボード入力の準備を行います。13 行目は、キーボードから数値の入力を求め、int 型の変数 numに代入しています。
   12: Scanner scan = new Scanner(System.in);
   13: int num = scan.nextInt();

 15~31 行目までが switch 文です。
 先ほどのキーボード入力で「2」を入力した場合を例に説明します。13 行目でキーボードから「2」を入力しEnter キーを押すと、変数 num には 2 が代入されます。
 15行目でswitch文の式を変数numとします。16行目では定数1と変数numの値である2は一致しないため、次の case 文に飛びます。19 行目では定数 2 と変数 num の値である 2 は等しいので、次の行である 20 行目を実行し、「200 円になります」と表示します。さらに次の行である 21 行目へ進むと break 文があるため、ここで switch文を抜けます。
 この流れをフローチャートにすると、図 6.7.3 になります。
   15: switch(num) {
   16: case 1:
   17:  System.out.println("100 円になります。");
   18:  break;
   19: case 2:
   20:  System.out.println("200 円になります。");
   21:   break;
   22: case 3:
   23:  System.out.println("300 円になります。");
   24:  break;
   25: case 4:
   26:  System.out.println("400 円になります。");
   27:  break;
   28: default :
   29:   System.out.println("番号が不正です。");
   30:  break;
   31: }

図 6.7.3 : SwitchStatement のフローチャート


6.7.2 case に break を含まない switch 文を使ったプログラム

 switch 文のある条件に一致した時に break 文がなかった場合、そこから次の break がある場所まで全て実行されることを確認します。

① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch6
③ 名前 :SwitchNoBreak
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ SwitchNoBreak.java

package jp.co.f1.intro.ch6;
	
import java.util.Scanner; 

public class SwitchNoBreak {

	public static void main(String[] args) {

     System.out.print("お好きな月を入力して下さい。>"); 
	
     Scanner scan = new Scanner(System.in); 	
     int month = scan.nextInt(); 
	
     switch(month) { 
     case 3: 
     case 4: 
     case 5: 
        System.out.println(month + "月は春です。"); 
        break; 
     case 6: 
     case 7: 
     case 8: 
        System.out.println(month + "月は夏です。"); 
        break; 
     case 9: 
     case 10: 
     case 11: 
        System.out.println(month + "月は秋です。"); 
        break; 
     case 12: 
     case 1: 
     case 2: 
        System.out.println(month + "月は冬です。"); 
        break; 
     default : 
        System.out.println("1~12 の月を入力して下さい。"); 	
     }
	   
  }
	
}

実行結果

3 を入力した場合


7 を入力した場合


12 を入力した場合

解説

  前項のプログラムと同じように、ここでもキーボードから数値の入力を求めます。
 ここでは、「7」を入力したものとして説明します。12 行目が実行され、7 を入力し Enter キーを押すと、int型の変数 month には 7 が代入されます。
   11: Scanner scan = new Scanner(System.in);
   12: int month = scan.nextInt();

 続いて switch 文に入ります。変数 month の値と case 文の定数を上から順に比較していきます。month の値は7 なので、15 行目は不一致となります。同じように 16、17、20 行目も不一致でした。21 行目の定数 7 は monthの値である 7 と一致するので、ここから処理に入ります。処理は、break もしくは switch 文の終端に達するまで続きます。23 行目が実行されると、「7 月は夏です」と表示されます。24 行目で break を実行し、ここで switch文を抜け、以降の処理は行われません。
   14: switch(month) {
   15: case 3:
   16: case 4:
   17: case 5:
   18:    System.out.println(month + "月は春です。");
   19:   break;
   20: case 6:
   21: case 7:
   22: case 8:
   23:   System.out.println(month + "月は夏です。");
   24:   break;
   25: case 9:
   26: case 10:
   27: case 11:
   28:   System.out.println(month + "月は秋です。");
   29:   break;
   30: case 12:
   31: case 1:
   32: case 2:
   33:    System.out.println(month + "月は冬です。");
   34:   break;
   35: default :
   36:    System.out.println("1~12 の月を入力して下さい。");
   37: }

図 6.7.4 : SwitchNoBreak のフローチャート


switch 文のインデントについて

 switch 文を記述すると、インデントが深くなりやすいので、case や default の記述の部分のみ switch と同列にして、その中の記述だけを字下げする、という書き方をよくします。Eclipse の自動整列(ソース > フォーマット)では、そのようなインデントになっています。

Eclipse のソースコード自動インデント機能

 Eclipse には、自動でインデントを揃えてくれる便利な機能があります。
 自動インデント機能を使うには、ソースコードをクリックして入力可能状態にし、 ソース > インデントの訂正 をクリックするか、Ctrl キー + (アルファベットの)I キー を同時に押します。
 インデントは常にきちんと付け、見やすいコードを書くことを心がけましょう。


NEXT>> 6.8 本章のまとめ