一番かんたんなJava入門

これからJavaを始めようという人の為の超入門サイトです。丁寧、簡単にこだわった解説なので初心者にぴったりです

【Java】 switchって何?

time 2016/09/29

 条件分岐といえばif文を思い浮かべると思いますが、switch文を使って条件分岐を作ることも出来ます。

 if文については既に理解していることを前提に説明しますので、if文についての理解が足らない人は先にif文って何?を読むようにして下さい。

sponsored link

switchとは

 まずswitch文の簡単な例を見てみましょう。

int num = 2;
switch(num){
   case 1:
        System.out.println("もっと頑張りましょう");
        break;
   case 2:
        System.out.println("普通です");
        break;
   case 3:
        System.out.println("大変よく出来ました");
        break;
}

 numの値によって、まさにスイッチで切り替えるように処理内容を分岐させています。numが2なので実行すると「普通です」が出力されるのがなんとなく想像できると思います。

 もしこれをif文で書こうと思ったら、

int num = 2;
if(num==1){
    System.out.println("もっと頑張りましょう");
}else if(num==2){
    System.out.println("普通です");
}else if(num==3){
    System.out.println("大変よく出来ました");
}

こうなります。else if(num==○)が何個も続くとなんとなく読みにくく感じませんか?switchだと上記のようにcaseを使うことで、switchの後ろの( )の中に入れた変数の値ごとに分岐させることが出来ます。

 最後に、その他をつけることも出来ます。defaultを使います。

int num = 2;
switch(num){
    case 1:
        System.out.println("もっと頑張りましょう");
        break;
    case 2:
        System.out.println("普通です");
        break;
    case 3:
        System.out.println("大変よく出来ました");
        break;
    default: 
        System.out.println("評価不能です");
}

 

 if文だと最後にelseをつければ、その他になりますよね。

int num = 2;
if(num==1){
    System.out.println("もっと頑張りましょう");
}else if(num==2){
    System.out.println("普通です");
}else if(num==3){
    System.out.println("大変よく出来ました");
}else{
    System.out.println("評価不能です");
}

 

 このように、switch文でもif文と同じような分岐を作ることができます。ある変数の値によって処理を分岐させたい場合なんかは、if文よりもswitch文を使って書いた方がちょっとスッキリします。

switch(変数){
    case 値1:
        変数が値1だった場合の処理
        break;
    case 値2:
        変数が値2だった場合の処理
        break;
      ・
      ・
      ・
    default:
        変数の値がどのcaseにも当たらなかった場合の処理
}

 原則として、各caseの処理の最後にbreakを付ける必要があります。breakについては次節で詳しく説明します。
 

if文とswitch文の違い

 同じような処理ができるif文とswitch文ですが、もちろん違いはあります。その違いに着目しながら、もう少しswitch文の理解を深めましょう。

 if文だと( )の中に入れる条件式は必ずbooleanである必要があります。一方、switch文の場合後ろの( )の中は条件式(boolean)ではなく変数そのものが入っています。その変数の中身によっていずれかのcaseを選択して実行されるようになっています。

 ただし、そのcaseだけを選択して実行させようと思ったら、breakを書くのを忘れてはいけません。どういうことか説明します。

 例えば、こんなswitch文を見て下さい。breakが無い場合です。

int num = 2;
switch(num){
    case 1:
        System.out.println("もっと頑張りましょう");
    case 2:
        System.out.println("普通です");
    case 3:
        System.out.println("大変良く出来ました");
    default:
        System.out.println("評価不能です");
}

 

これで実行すると、

普通です
大変良く出来ました
評価不能です

と出力されます。numは2であるにも関わらず、「普通です」だけでなく、「大変良く出来ました」も「評価不能です」も出力されています。

 どうなってるかお分かりでしょうか?caseというのはあくまで「そこに跳ぶ」というだけで、それ以降のcaseもお構いなしに全部実行してしまうんです。

 そんなことになったら、caseごとに処理を分岐させることが出来ないので、各caseの最後にbreakを書くことでswitch文をそこで抜けるという処理を行う必要があるわけです。

 if文だと各分岐はブロックで囲われているのでそんなことは起きませんし、複数のブロックが実行されることは絶対にありえません(条件式がtrueになった時点でそのブロックを実行したらそのif文を勝手に抜けます)

if(){
    //ブロック
}else if(){
    //ブロック
}else{
    //ブロック
}

 

しかしswitch文は1つのブロック内で行う分岐なので、勝手に抜けてはくれません。意図的にブロックを抜けるにはbreakが必須だということです。

switch(){
    //ブロックは1つ
}

※ちなみに、defaultの処理後はブロックの最後なのでbreakを書いても書かなくても同じです。

 いちいちbreakなんて書かなくても普通にcase単位で実行してくれればいいのですが、残念ながらそういう仕様にはなっていません。しかしながらこの面倒なbreak処理ですが、実はそれを逆手に取ることで非常に柔軟な分岐を作ることができます。

int num = 2;
switch(num){
    case 1:
    case 2:
        System.out.println("numは1か2です");
    case 3:
        System.out.println("numは3です");
        break;
    default:
        System.out.println("numは1、2、3以外です");
}

 こんな風に、あえてbreakを使わずに、case 1case 2で同じ処理をさせることも出来ます。仕切りをぶち抜いた感じです。使いようによっては便利に使えます。

switchで使える変数の型

 ここまでの例ではswitchの( )の中の変数にはint型を使っていました。実はここに入るのは何でもOKというわけではありません。

 switchの判定に使える変数の型は、

  • byte
  • char
  • short
  • int
  • String (JDK 1.7以降)
  • enum (JDK 1.5以降)

の6つです。基本データ型は全部使えるというわけではないので注意しましょう。

 switchの後ろの( )に入れた変数の型と、各caseで示す値の型が異なっている場合は、コンパイルは通りません。

int num = 2;
switch(num){
    case 1:
    case "2":  ←コンパイルエラー
}

 

 もし、switchの後ろの( )に入れた変数が、nullだとコンパイルは通りますが、実行時に例外(NullPointerException)が投げられて止まります。

String str;
switch(str){  ←実行時エラー

}

初期化のし忘れ等には気をつけなければなりません。

 以上、switchの構文はif文よりも便利に使える場面もあるので参考にして下さい。

switch(変数){
    case 値1:
        変数が値1だった場合の処理
        break;
    case 値2:
        変数が値2だった場合の処理
        break;
      ・
      ・
      ・
    default:
        変数の値がどのcaseにも当たらなかった場合の処理
}

分からないことはプロのエンジニアに聞いてみてください↓

sponsored link

Androidアプリを作ろう

down

コメントする



一番かんたんなJava入門

Androidアプリの作り方

忘備録

私の作ったAndroidアプリ

おすすめ入門書

おすすめプログラミングスクール

 この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。
 無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)

 ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向という考え方について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。
 オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Java上級者を目指すなら必読の一冊![詳細]

フリーランスで稼ぎたい人へ

管理人

Nobuo_CREATE

Nobuo_CREATE

WordPressテーマPrinciple、マテリアルを作ったり、Androidアプリを作ったり、Java入門サイトを作ったり、本を書いたりしています。どうぞよろしく。 [詳細]



sponsored link

オススメ書籍

 この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。
 無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)

 ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向という考え方について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。
 オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Java上級者を目指すなら必読の一冊![詳細]

只今、急拡大中

JavaからのRuby on Rails入門

JavaからのRuby on Rails入門

大人気!COBOLからのJAVA

ブロックチェーン入門

オン ザ・ブロックチェーン