switch文

switch文とは

ユーザーが選択した内容によって、実行する処理を分岐させたい場合がありますよね。
たとえば、自分の行きたい大学の学部を選択して、その内容を表示する場合を考えてみましょう。

「理系」を選択した場合
「医学部」「歯学部」「薬学部」「理学部」「農学部」「工学部」を表示する。
「文系」を選択した場合
「法学部」「経済学部」「文学部」「教育学部」を表示する。
「その他」を選択した場合
「体育学部」「看護学部を表示する。

このような分岐処理をしたい場合、switch文を使用すると、とても簡潔に記述することができます。

まずはif文で下記内容の処理を作成してみましょう。
「com.cmps.switchSentence」パッケージを作成し、その中に「Switch」クラスを作成してください。
値が「東京」または「千葉」または「神奈川」の場合は「関東です!」と表示し、値が「大阪」の場合は「関西です!」と表示し、それ以外の値の場合は「他県です!」と表示する。
※論理演算子は使わずに作成してください。

できましたか?答え合わせをしましょう。

String pref = "神奈川";
if (pref.equals("東京")) {
    System.out.println("関東です!");
} else if (pref.equals("千葉")) {
    System.out.println("関東です!");
} else if (pref.equals("神奈川")) {
    System.out.println("関東です!");
} else if (pref.equals("大阪")) {
    System.out.println("関西です!");
} else {
    System.out.println("'他県です!");
}

これはこれで間違いではありませんが、このような用途の場合にはswitch文を使うと便利です。
switch文の書式は次の通りです。

switch (式){
  case 値1:
    式が値1と等しい時の処理1;
    式が値1と等しい時の処理2;
    break;
  case 値2:
    式が値2と等しい時の処理1;
    式が値2と等しい時の処理2;
    break;
  case 値3:
    式が値3と等しい時の処理;
    break;
  default:
    がいずれの値にも等しくない時の処理;
}

switch文では式の値を評価し、caseの後に記述された値と順次比較していきます。
もし一致する値があった場合にはその後に記述された処理を順次処理していきbreakに達したら終了します。

if文の場合にはブロックを使ってどこからどこまでの処理を実行するのかが分かるようになっていましたが、
switch文ではcase毎にブロックは使用されずbreakに達するまで順次処理を実行していきます。

defaultの後の処理は、式がcaseの後に記述されたいずれの値にも一致しなかった時に実行される処理を記述します。
defaultは必要無ければ記述しなくても構いません。

それでは先ほどif文で作成した内容をswitch文で書いてみましょう。

String pref ="神奈川";
 switch (pref) {
   case "東京":
     System.out.println("関東です!");
      break;
    case "千葉":
      System.out.println("関東です!");
      break;
    case "神奈川":
      System.out.println("関東です!");
      break;
    case "大阪":
      System.out.println("関西です!");
      break;
    default:
      System.out.println("他県です");
      break;
}

どうでしょうか?なんとなく少しスマートじゃないですかね!
switch文はif文を使って記述することができますが、いくつかの値と順次一致しているかどうかを
比較していく場合にはswitch文を使った方が簡潔に記述できる場合があります。

ただswitch文はさらにスマートに書けるのです!

switch文は複数の値に一致した場合に同じ処理を行うことができる

switch文はcaseの後に記述された1つ1つの値と順に一致するかどうかを確認していきます。
swtich文ではcaseの後に書かれた値に一致した場合、それ以降の処理をbreakに達するまで順に処理を実行していきます。
if文とは異なり、条件式と処理はセットになっていないのです。
条件に一致したら、breakが出てくるまで処理をすべて実行していきます。
そこでbreakを故意に省略すると他のcaseの後に記述された処理も引き続き実行されていきます。

String pref ="神奈川";
 switch (pref) {
   case "東京":
      System.out.println("関東です!");
    case "千葉":
      System.out.println("関東です!");
      break;
    case "神奈川":
      System.out.println("関東です!");
      break;
    case "大阪":
      System.out.println("関西です!");
      break;
    default:
      System.out.println("他県です!");
}

この場合、「東京」に一致した場合はまず「関東です!」が実行されます。
breakがないため本来「千葉」に一致した場合に実行される「関東です!」も続いて実行されます。
そしてbreakが見つかりますのでswitch文を終了します。

このようにswitch文はブロックで実行されるの処理をまとめているのではなく、
breakが見つかるまで順に処理を実行していくという特性を利用して、
複数の値に一致した場合に同じ処理を実行させる記述が行えます。

よって最初の例は次のように記述できます。

String pref ="神奈川";
switch (pref) {
  case "東京":
  case "千葉":
  case "神奈川":
    System.out.println("関東です!");
    break;
  case "大阪":
    System.out.println("関西です!");
    break;
  default:
    System.out.println("他県です!");
 }

どうでしょう!?めちゃめちゃスマートじゃないですか!
この場合は変数「pref」の値が「東京」「千葉」「神奈川」のいずれに一致した場合でも「関東です!」を実行します。

ただしswitch文で発生しやすいミスは「break」の記述を忘れて余分な処理が実行されてしまうことです。
「break」をわざと省略して今回のようなプログラムを記述すると、
「break」をわざと省略したのか間違えて省略したのか分かりにくくなりますので注意して下さい。

練習問題

「com.cmps.switchSentence」パッケージの中に「SwitchQuestion」クラスを作成してください。

※すべてswitch文を使用すること、そしてスマートに書きましょう!

問1: 値が「男性」の場合、「man」と表示、「女性」の場合、「woman」と表示、それ以外の場合、「unknown」と表示する。

問2: 値が「千代田区、港区、江戸川区」のいずれかの場合「23区です!」それ以外の場合は「23区外です!」と表示する。

問3: 適当な整数が飛んできます、「0」の場合は「勉強しなさい!」、20以下は「がんばりましょう!」、21~50は「まだまだ」、80未満は「もう少し!」、80以上は「合格!」、100の場合は「天才!」と表示され、全て網羅されるように処理を書きましょう。

問4: 「A:問診」、「B:聴診」、「C:血液検査」、「D:内視鏡検査」、「E:X線」があります。1500円以上「E」、4000円以上「D」、8000円以上「C」、15000円以上「B」、25000円以上「A」が表示されるようにしましょう。<例:4500の場合はEとDを表示>

練習問題のヒント
問3
switchで判定できるのは数値等なので、○○以上や○○未満といった条件で見る場合は
defaultの中でif文を使い条件分岐させましょう。

問4
本問では、以下のif文の処理結果をもとにswitch文の処理を記述しましょう。
○○、■■はそれぞれご自身で要した変数を入れてください。
if ( 〇〇 >= 25000) {
 ■■ = 1;
} else if (○○ >= 15000) {
 ■■ = 2;
} else if (○○ >= 8000) {
 ■■ = 3;
} else if (○○ >= 4000) {
 ■■ = 4;
} else if (○○ >= 1500) {
 ■■ = 5;
}
switch (■■) {
case 1:
・・・

タイトルとURLをコピーしました