Java入門|switch文でのbreak文の使い方

breakの位置で、switch文の流れが変わる。使い方がわかると、分岐処理をすっきり整理できる。

これまで、break文はループを途中で終わらせるための文として見てきました。
ただ、break文は繰り返し処理だけで使うものではありません。Javaでは、switch文の中でもbreak文がとても重要な役割を持っています。

switch文は、値に応じて処理を分けたいときに使う構文です。けれども、caseごとに書かれた処理は、break文がないと次のcaseへそのまま流れていくことがあります。つまり、switch文ではbreak文をどこに置くかによって、処理のまとまり方が変わるのです。

この性質を理解すると、「このcaseとこのcaseは同じ処理にしたい」「ここで処理を区切りたい」といった設計ができるようになります。反対に、break文の位置をよく見ないまま書くと、意図しないcaseまで処理が進んでしまうこともあります。

ここでは、switch文の中でbreak文がどのように働くのか、なぜ必要なのか、どこに置くとどう変わるのかを、サンプルプログラムや表を使いながらやさしく整理していきます。

switch文の中のbreak文とは何か

switch文の中で使うbreak文は、これまで学んできたbreak文と同じものです。
役割は、その場でswitch文の処理を終えて、外へ抜けることです。

基本のイメージは次のようになります。

switch(式){
    case 値1:
        処理;
        break;
    case 値2:
        処理;
        break;
    default:
        処理;
        break;
}

この形では、あるcaseの処理が実行されたあと、break文によってswitch文の外へ抜けます。
そのため、通常は1つのまとまりだけが実行されることになります。

break文がないとどうなるのか

switch文では、break文がない場合、処理がそこで止まらず、次のcaseへそのまま進むことがあります。
これを最初に押さえておくことがとても大事です。

たとえば、次のようなイメージです。

switch(値){
    case 1:
        処理A;
    case 2:
        処理B;
        break;
}

もし値が1なら、処理Aだけで終わるのではなく、そのまま処理Bまで進みます。
つまり、case 1 に break がないため、case 2 の処理も続けて実行されるわけです。

この性質は一見ややこしく感じますが、うまく使うと「複数のcaseで同じ処理をまとめる」ことができます。

switch文でbreak文が必要な理由

switch文の中でbreak文がよく使われるのは、caseごとの処理をきちんと区切るためです。

break文ありの場合

  • 該当するcaseの処理を実行する
  • break文でswitch文を抜ける
  • 次のcaseには進まない

break文なしの場合

  • 該当するcaseの処理を実行する
  • 次のcaseの処理にも進むことがある
  • 意図しない動きになることがある

この違いを表にすると、次のようになります。

状態処理の流れ
break文があるそのcaseの処理で止まる
break文がない次のcaseへ続いて進むことがある

Sample10.java でswitch文のbreak文を見てみよう

では、switch文の中でbreak文を使うサンプルを見ていきましょう。

ファイル名:Sample10.java

import java.io.*;

class Sample10
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("メニュー番号を入力してください。(1~5)");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int menu = Integer.parseInt(str);

        switch(menu){
            case 1:
            case 2:
                System.out.println("飲み物メニューを表示します。");
                break;

            case 3:
            case 4:
                System.out.println("食べ物メニューを表示します。");
                break;

            case 5:
                System.out.println("本日のおすすめを表示します。");
                break;

            default:
                System.out.println("1~5の番号を入力してください。");
                break;
        }
    }
}

実行結果の例

1を入力した場合

メニュー番号を入力してください。(1~5)
1
飲み物メニューを表示します。

2を入力した場合

メニュー番号を入力してください。(1~5)
2
飲み物メニューを表示します。

3を入力した場合

メニュー番号を入力してください。(1~5)
3
食べ物メニューを表示します。

5を入力した場合

メニュー番号を入力してください。(1~5)
5
本日のおすすめを表示します。

このプログラムのポイント

このプログラムでは、入力された番号によって表示する内容を切り替えています。
ここで注目したいのは、case 1 と case 2 の間にbreak文がないこと、そして case 3 と case 4 の間にもbreak文がないことです。

そのため、

  • 1 または 2 のときは同じ処理
  • 3 または 4 のときは同じ処理

になるようにまとめられています。

対応表

入力値実行される処理
1飲み物メニューを表示
2飲み物メニューを表示
3食べ物メニューを表示
4食べ物メニューを表示
5本日のおすすめを表示
それ以外入力エラーの案内

このように、break文の位置を工夫すると、複数のcaseを1つの処理にまとめられます。

caseをまとめる書き方

switch文では、同じ処理をさせたいcaseを連続して並べることがあります。

case 1:
case 2:
    System.out.println("飲み物メニューを表示します。");
    break;

この書き方では、

  • 1に一致した場合も
  • 2に一致した場合も

同じ表示文が実行されます。

これは、case 1 のあとにbreak文がないため、case 2 の位置まで処理が流れていくからです。
ただし、最終的には case 2 のところにある処理を実行し、そのあと break でswitch文を抜けます。

break文の位置が大事な理由

switch文では、どこにbreak文を書くかで処理のまとまりが変わります。
ここはとても大切です。

たとえば、次のような書き方をするとどうなるかを考えてみましょう。

case 1:
    System.out.println("飲み物メニューを表示します。");
    break;
case 2:
    System.out.println("飲み物メニューを表示します。");
    break;

この形でも正しく動きますが、同じ内容を2回書いているので少し冗長です。

一方で、今回のように

case 1:
case 2:
    System.out.println("飲み物メニューを表示します。");
    break;

と書けば、同じ処理をすっきりまとめられます。

break文の位置を間違えるとどうなるか

break文の位置を意識しないと、意図しないcaseまで処理が流れてしまうことがあります。

たとえば、次のようなコードです。

switch(menu){
    case 1:
        System.out.println("飲み物メニューを表示します。");
    case 2:
        System.out.println("食べ物メニューを表示します。");
        break;
}

この場合、menu が 1 のときは、飲み物メニューだけでなく、続けて食べ物メニューの処理まで実行されます。
つまり、case 1 に break がないため、case 2 まで進んでしまうのです。

動きの整理

入力値実行される処理
1飲み物メニュー → 食べ物メニュー
2食べ物メニュー

これは意図的に使うこともありますが、初心者のうちは「breakを書き忘れたミス」として起こりやすいので気をつけたいところです。

この図では、switch文の中でのbreak文の役割を表現しています。
特に注目してほしい点は、次の2つです。

注目点意味
breakがあるそのcaseの処理で区切られる
breakがない次のcaseへ処理が続くことがある

switch文は見た目が整っているぶん、break文の有無を見落としやすいです。
図で流れを確認すると、どこで止まるのかがかなりはっきりします。

default にもbreak文を書くのか

default は switch文の最後に置かれることが多いので、理屈だけでいえば最後の break はなくても動く場合があります。
ただ、学習の段階では書いておくほうが読みやすく、各caseの形もそろいます。

たとえば今回のように、

default:
    System.out.println("1~5の番号を入力してください。");
    break;

と書いておくと、各まとまりが同じ形になるので見通しがよくなります。

switch文でのbreak文とループでのbreak文の違い

break文は同じ命令ですが、使われる場所によって「何から抜けるのか」が変わります。

使う場所break文で抜ける対象
for文・while文そのループ
switch文そのswitch文

つまり、switch文の中のbreak文は、ループを終わらせるためではなく、switch文の分岐処理を終えるために使われています。

この違いを押さえておくと混乱しにくくなります。

switch文でbreak文を使うときのコツ

switch文を書くときは、次の点を意識するとわかりやすくなります。

コツ内容
caseごとに区切りたいならbreakを書く不要な流れ込みを防げる
同じ処理をまとめたいcaseには途中でbreakを書かない重複を減らせる
breakの位置を目で確認する意図した分岐になっているか見直しやすい
defaultも含めて形をそろえるコードが読みやすくなる

特に「このcaseは単独で終わるのか、それとも次とまとめるのか」を意識すると、break文の役割がはっきり見えてきます。

switch文でのbreak文を学ぶ意味

switch文の中のbreak文を理解すると、分岐処理をより正確に書けるようになります。
ただcaseを並べるだけでなく、

  • ここで処理を区切る
  • このcaseと次のcaseは同じ処理にする
  • ここからは別のまとまりにする

といった設計ができるようになるからです。

今回の内容では、switch文の中でのbreak文は

  • switch文から抜けるために使う
  • breakがあると、そのcaseの処理で止まる
  • breakがないと、次のcaseへ流れることがある
  • breakの位置によって複数caseを同じ処理にまとめられる

という点が大切でした。

この使い方が身につくと、switch文を使ったメニュー処理や評価判定なども、ずっと読みやすく整理して書けるようになります。