
Java入門|switch文で分岐処理をシンプルに
分岐が増えたら switch文。Javaの条件分岐を、もっと見やすく、もっと書きやすく
これまでに学んだ if文、if~else文、if~else if~else文 を使うと、条件に応じて処理を切り替えることができました。特に if~else if~else文 は、複数の条件を順番に判定できるので、とても便利でしたね。
ただ、条件がたくさん並んでくると、コードが少し長くなってしまうことがあります。たとえば、ある変数の値が 1 のときはこの処理、2 のときは別の処理、3 のときはさらに別の処理、というように、同じ変数の値によって処理を分けたい場面では、if~else if~else文 よりも switch文 のほうがすっきり書けることがあります。
switch文は、ある式の結果がどの値に一致するかによって、実行する処理を選ぶための構文です。条件分岐の考え方そのものはこれまでと同じですが、書き方が整理されていて、読みやすくなるのが大きな特徴です。
この節では、switch文の基本の書き方、case と default の意味、break の役割、そして文字を使った分岐まで、順番にやさしく見ていきましょう。
switch文とは何か
switch文は、ある式の値をもとに、複数の候補の中から一致する処理を選ぶ構文です。
基本の形は次のようになります。
switch(式){
case 値1:
文1;
break;
case 値2:
文2;
break;
default:
文3;
break;
}この構文では、まず switch のあとに書かれた式を評価します。
その結果が case のあとの値1と一致すれば、値1の処理が実行されます。
一致しなければ次の case を調べ、値2と一致すれば、その処理が実行されます。
そして、どの case にも一致しなかった場合は、default の処理が実行されます。
つまり、switch文は「この値ならこの処理、この値ならこの処理」と、値ごとに分岐を整理して書ける構文です。
if~else if~else文との違い
switch文を理解するには、if~else if~else文 との違いを見るとわかりやすいです。
たとえば、ある評価に応じて行動を変えるとします。
- 評価が A なら特別なごほうびを用意する
- 評価が B なら普通にほめる
- それ以外なら復習をすすめる
これは if~else if~else でも書けますが、switch文 でも似た形で表現できます。
switch文は、同じ式の値をいくつかの候補と比べるときに特に向いています。
そのため、複数の値で場合分けしたいときに、コードをすっきり見せやすいのです。
switch文の流れをイメージしよう
switch文の流れは、次のように考えるとわかりやすいです。
- switch の式を評価する
- case の値と順に比べる
- 一致した case から処理を始める
- break で switch文 を抜ける
- どれにも一致しなければ default を実行する
この流れを頭の中でつかんでおくと、コードを読んだときに理解しやすくなります。

この図では、switch文 が式の値をもとに case を選んでいることを表しています。
switch の式を評価したあと、一致する case があればその場所から処理を実行します。
そして、多くの場合は break によって switch文 を抜けます。
どの case にも一致しないときは、default の処理が行われます。
このように、switch文 は「値に応じて処理を選ぶ」構文だと考えると理解しやすいです。
switch文はどんなときに便利なのか
switch文が特に便利なのは、1つの変数の値によって、いくつかの決まった候補に分岐したいときです。
たとえば、次のような場面です。
- メニュー番号 1、2、3 で処理を切り替える
- 曜日番号 1~7 で表示内容を変える
- 文字 a、b、c に応じて別々の処理をする
こうした場合は、if~else if~else文 でも書けますが、switch文 のほうが構造が見えやすくなることがあります。
サンプルプログラムでswitch文を見てみよう
では、switch文 を使ったプログラムを実際に見てみましょう。
今回は、入力された数字によって、異なる案内メッセージを表示するプログラムを作成します。
ファイル名:Sample5.java
import java.io.*;
class Sample5
{
public static void main(String[] args) throws IOException
{
System.out.println("メニュー番号を入力してください。");
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int num = Integer.parseInt(str);
switch(num){
case 1:
System.out.println("飲み物メニューを表示します。");
break;
case 2:
System.out.println("軽食メニューを表示します。");
break;
default:
System.out.println("1か2を入力してください。");
break;
}
}
}このプログラムでは、入力された値が 1 なら飲み物メニュー、2 なら軽食メニュー、それ以外なら入力をうながすメッセージを表示します。
Sample5.java の動きを見てみよう
このプログラムでは、switch(num) によって num の値を調べています。
そして、case 1、case 2、default のどこに進むかを決めています。
表にすると、次のように整理できます。
| 入力値 | 実行される処理 |
|---|---|
| 1 | 飲み物メニューを表示します。 |
| 2 | 軽食メニューを表示します。 |
| それ以外 | 1か2を入力してください。 |
このように、switch文 を使うと、1つの変数に対する複数の分岐をすっきり並べて書けます。
実行例を確認しよう
1 を入力した場合
メニュー番号を入力してください。
1
飲み物メニューを表示します。2 を入力した場合
メニュー番号を入力してください。
2
軽食メニューを表示します。それ以外を入力した場合
メニュー番号を入力してください。
5
1か2を入力してください。このように、入力値に応じて表示内容が切り替わります。
if~else if~else文 と同じようなことができる
今の Sample5.java のような処理は、if~else if~else文 でも書けます。
たとえば、次のような形です。
if(num == 1){
System.out.println("飲み物メニューを表示します。");
}
else if(num == 2){
System.out.println("軽食メニューを表示します。");
}
else{
System.out.println("1か2を入力してください。");
}このように、switch文 と if~else if~else文 は、同じような分岐を表せる場合があります。
ただし、同じ変数の値をいくつかの候補と比べるだけなら、switch文 のほうが見やすく書けることがあるのです。
break の役割を知ろう
switch文 を使ううえで、とても大事なのが break です。
break は、その場で switch文 の処理を終了して外へ抜けるための文です。
たとえば Sample5.java では、case 1 の処理のあとに break が書かれています。
case 1:
System.out.println("飲み物メニューを表示します。");
break;これによって、case 1 の処理が終わったら、そのまま switch文 を抜けられます。
もし break がなければ、その下の case の処理まで続けて実行されてしまうことがあります。ここが switch文 で特に注意したいところです。
break がないとどうなるのか
では、break を省略するとどうなるのかを見てみましょう。
たとえば、次のようなコードがあったとします。
switch(num){
case 1:
System.out.println("飲み物メニューを表示します。");
case 2:
System.out.println("軽食メニューを表示します。");
default:
System.out.println("1か2を入力してください。");
}このコードでは、break がありません。
もし num に 1 が入っていると、case 1 に一致するので、そこから処理が始まります。
しかし break がないため、そこで止まらず、その下にある case 2 や default の処理まで続けて実行されてしまいます。
実行例
メニュー番号を入力してください。
1
飲み物メニューを表示します。
軽食メニューを表示します。
1か2を入力してください。これは明らかに不自然ですね。
1 を入力したのに、2 の処理や default の処理まで表示されてしまっています。
なぜこのようなことが起こるのか
switch文 では、一致した case から処理が始まり、break に出会うか、switch文 の終わりまで進むというルールになっています。
つまり、break がないと、次の case の処理もそのまま続いてしまうのです。
この動きをフォールスルーと呼ぶことがあります。
初心者のうちは、意図しない動作になることが多いので、まずは
- case ごとに break を書く
- break の位置をしっかり確認する
ということを意識すると安心です。
break の位置に注意しよう
switch文 では、break の書き忘れや位置の間違いが、思わぬ動作の原因になります。
しかも、このミスはコンパイルエラーにならないことがあります。
そのため、コードを書いたあとには、
- 各 case の最後に break があるか
- default にも必要なら break を書いているか
- どの case からどこまで実行されるか
を見直すことが大切です。
数値だけでなく文字でも分岐できる
ここまでは数字による分岐を見てきましたが、switch文 は文字を使った分岐にも使えます。
たとえば、入力された文字が y なら「はい」、n なら「いいえ」と判断するような処理も書けます。
ファイル名:Sample6.java
import java.io.*;
class Sample6
{
public static void main(String[] args) throws IOException
{
System.out.println("mかnを入力してください。");
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
char ch = str.charAt(0); // 入力された文字列の1文字目を取り出す
switch(ch){
case 'm':
System.out.println("mが入力されました。");
break;
case 'n':
System.out.println("nが入力されました。");
break;
default:
System.out.println("mかnを入力してください。");
break;
}
}
}Sample6.java のポイント
このプログラムで注目したいのは、次の行です。
char ch = str.charAt(0);この行では、入力された文字列の先頭1文字を取り出して、char型の変数 ch に代入しています。
たとえば、
- m と入力したら ch には 'm' が入る
- n と入力したら ch には 'n' が入る
という形です。
そのあとで、switch(ch) によって文字ごとの分岐を行っています。
charAt(0) とは何か
charAt(0) は、文字列の中の先頭の1文字を取り出すためのメソッドです。
入力された内容は readLine() によって文字列として読み取られます。
そのため、m と入力しても、最初は文字列として扱われています。
そこで、charAt(0) を使って、先頭の1文字を取り出して char型 にしているわけです。
ここでは詳しいしくみよりも、文字列から1文字を取り出せるという点を押さえておくと十分です。
文字の case ではシングルクォーテーションを使う
文字で switch文 を書くときは、case の値を次のように書きます。
case 'm':
case 'n':ここで使っているのは、シングルクォーテーションです。
文字は char型 なので、文字リテラルとして
'm'
'n'
のように 1文字をシングルクォーテーションで囲んで表します。
この書き方は文字列とは違うので、ここも混同しないようにしたいところです。
図で見る switch文の分岐

この図では、switch(num) の結果によって、どの case に進むかが決まることを表しています。
- num が 1 なら case 1 の処理
- num が 2 なら case 2 の処理
- どちらでもなければ default の処理
という流れになります。
また、それぞれの処理のあとで break によって switch文 を抜けることも図で確認できます。
switch文を使うときのポイント
switch文 を使うときは、次の点を意識すると理解しやすいです。
| ポイント | 内容 |
|---|---|
| 1つの式の値で分岐する | 同じ変数の値ごとに処理を分けやすい |
| case は一致した値の処理を書く場所 | 一致した case から実行される |
| default はどれにも一致しないときの処理 | 省略もできる |
| break が大切 | 書き忘れると下の case まで実行されることがある |
| 文字でも分岐できる | char型の値を使って分岐できる |
switch文が向いている場面
switch文 は、どんな分岐にも使うというより、同じ対象を複数の決まった値で振り分けたい場面に向いています。
たとえば、
- メニュー番号ごとの案内
- 曜日番号ごとの表示
- 選択文字ごとの処理
- コード番号ごとの分岐
のようなケースでは、とても読みやすく書けます。
一方で、score >= 80 のような大小比較や、複雑な条件の組み合わせには、if文 系のほうが向いています。
つまり、switch文 と if文 は、使い分けることが大切です。
switch文を理解するための大切な見方
switch文 は、if~else if~else文 をすっきり書ける場合がある便利な構文です。
特に、1つの値をいくつかの候補と比べるような分岐では、とても見やすくなります。
その一方で、switch文 には break の扱いという大切な注意点もあります。
case に一致したあと、どこで処理を止めるのかをしっかり意識しないと、思わぬ動きになることがあります。
まずは、
- switch は値による分岐を行う構文である
- case は一致したときの処理を書く
- default はどれにも当てはまらない場合の処理である
- break を使って処理を切る
という基本をしっかり押さえておくことが大切です。
ここが理解できると、複数の選択肢をもつプログラムを、これまでよりも読みやすく整理して書けるようになります。
