PR

Java:switchのbreakとループのbreakの違いを1分でスッキリ解説

Java

次のコード、何が出力されるでしょう?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for (int i = 0; i < 3; i++) {
switch (i) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default");
}
}
for (int i = 0; i < 3; i++) { switch (i) { case 1: System.out.println("One"); break; default: System.out.println("Default"); } }
for (int i = 0; i < 3; i++) {
  switch (i) {
    case 1:
      System.out.println("One");
      break;
    default:
      System.out.println("Default");
  }
}

出力される内容、正しく予想できますか?breakってループを止めるんじゃないの?」と感じた方は、要チェックです!

この記事では、switch文とループでのbreakの違いを、スッキリ整理して解説します。

スポンサーリンク

結論:breakは「終わらせる対象」が違う!

Javaにおけるbreakは、switch文ループ処理で登場しますが、役割がまったく違います

breakの場所目的終わらせる対象
switch文の中他のcaseに行かせないswitch文の処理だけを終了
ループ内(forやwhileなど)条件に関係なくループを止めるループ全体を終了
スクロールできます

この違いを押さえることで、コードの動きがはっきり見えてきます!

ステップで確認:具体例で動きを理解しよう

Javaにおけるbreakには、大きく分けて2つの使い方があります。

  1. switch文の中で使うbreak
  2. ループ(forwhile)の中で使うbreak

どちらも「何かを終了させる」という働きがありますが、実は終了させる対象が違うので混乱しやすいポイントです。

前提として、switch文for文の基礎理解があると読み進めやすいです!ちょっと自信がない方はリンク先のページをご確認ください。

switch文のbreakは「他のcaseに移らない」ため

まず最初に、switch文の仕組みと、そこで使われるbreakの役割を理解しましょう。

  1. switch文では、与えられた式(例えばnum)の値に応じて、複数のcaseブロックのどれを実行するかを決めます。
  2. breakがないとき、該当のcaseブロックを実行したあとさらに次のcaseへ処理が流れてしまう(フォールスルー)という性質があります。
  3. そこで、意図しない実行を防ぐためにbreakを記述し、実行が終わった時点でswitch文を抜けるようにします。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int num = 2;
switch (num) {
case 1:
System.out.println("One");
break; // ここでswitchから抜ける
case 2:
System.out.println("Two");
break; // ここでもswitchから抜ける
case 3:
System.out.println("Three");
}
int num = 2; switch (num) { case 1: System.out.println("One"); break; // ここでswitchから抜ける case 2: System.out.println("Two"); break; // ここでもswitchから抜ける case 3: System.out.println("Three"); }
int num = 2;

switch (num) {
  case 1:
    System.out.println("One");
    break;     // ここでswitchから抜ける
  case 2:
    System.out.println("Two");
    break;     // ここでもswitchから抜ける
  case 3:
    System.out.println("Three");
}
  • numが2の場合、case 2のブロックが実行され、"Two"が出力されて終了
  • breakがなければ、"Three"までも実行されてしまう可能性あり(フォールスルー)

ここでのbreakは、「switch文を抜ける」ためのもの。
ループは関係ありません。 ループ全体を止めたいわけではないので、そこを切り離して考えるのがポイントです。

ループのbreakは「ループそのもの」を終了させる

次に、ループforwhile)内のbreakを見てみましょう。こちらは「ループ自体を途中で止める」ために使われます。

  1. ループの中で条件(例えばif (i == 3)など)をチェックする
  2. その条件を満たしたら、breakを呼び出してループを即終了させる
  3. ループが終了したら、その先の処理(ループの後に書いた処理など)に進む
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for (int i = 0; i < 5; i++) {
if (i == 3) break;
System.out.println(i);
}
/* 出力結果
0
1
2
✅ i == 3になった時点でbreakが発動し、ループが終了。 */
for (int i = 0; i < 5; i++) { if (i == 3) break; System.out.println(i); } /* 出力結果 0 1 2 ✅ i == 3になった時点でbreakが発動し、ループが終了。 */
for (int i = 0; i < 5; i++) {
  if (i == 3) break;
  System.out.println(i);
}

/* 出力結果
0
1
2
✅ i == 3になった時点でbreakが発動し、ループが終了。 */

switchとループの中に両方あるときは要注意!

それでは、冒頭のクイズに登場したような「ループの中にswitchがある」ケースを考えてみましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for (int i = 0; i < 3; i++) {
switch (i) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default");
}
}
for (int i = 0; i < 3; i++) { switch (i) { case 1: System.out.println("One"); break; default: System.out.println("Default"); } }
for (int i = 0; i < 3; i++) {
  switch (i) {
    case 1:
      System.out.println("One");
      break;
    default:
      System.out.println("Default");
  }
}

出力結果は↓。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Default
One
Default
✅ switchの中のbreakは、ループを止めるわけではなく、switch文だけを抜けるということがポイントです。
Default One Default ✅ switchの中のbreakは、ループを止めるわけではなく、switch文だけを抜けるということがポイントです。
Default
One
Default

✅ switchの中のbreakは、ループを止めるわけではなく、switch文だけを抜けるということがポイントです。
  1. i = 0のとき
    • switch(0)case 1に合致しない → defaultの処理を実行 → "Default"出力
    • breakがないので次にループ本体を終え、i++される
  2. i = 1のとき
    • switch(1)case 1に合致 → System.out.println("One")実行 → break;switch文が終了
    • しかし、ループ自体は続く → i++される
  3. i = 2のとき
    • switch(2)case 1に合致しないので default"Default"出力
    • i++して次のi < 3判定がfalseになるとループ終了

つまり、switch文の中のbreakは「switch文」だけを抜けるのであり、ループを止めているわけではないということです。これが、switch文ループが両方存在するコードを読むうえで最も大事なポイントです。

まとめ:breakの「対象」を意識しよう

  1. switch文のbreak
    • 「フォールスルーを防ぐ(他のcaseを実行させない)」ために使う
    • switch文自体から抜けるだけで、ループは継続する
  2. ループ(for, while)のbreak
    • 「ループ自体を途中で止める」ために使う
    • breakに到達したら、ループ全体を終了して次の処理へ移る

こうしてみると、「終わらせる対象」がそれぞれ違うというだけで、役割が全然異なるとわかります。

ラベル付きbreak

Javaでは、switch文の中で出てくるbreakは、基本的に「switch文そのものを抜ける」ためのもの、という整理をしました。そのため、switchの中でcase "N": break;と書いたとしても、ループ(for文やwhile文など)は続行します。

「指定の条件が来たら、ループ自体をまるごと終了させたい」場合は、ラベル付きbreakを利用します。ラベル付きbreakを使うと、抜けたいループにラベル(名前)を付けて指定できるので、明示的に「このループを抜ける」という処理が書けるようになります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Sample {
public static void main(String[] args) {
List<String> words = Arrays.asList("A", "B", "C", "D", "E");
// ラベル付きのfor文
outerLoop:
for (String word : words) {
switch (word) {
case "B":
// ただスキップしたい場合はcontinue
continue outerLoop;
case "D":
// ループ自体を抜けたい場合はbreakとラベルを指定
break outerLoop;
default:
// 普通に処理を書く
System.out.print(word + " ");
}
}
System.out.println("\n処理終了");
}
}
public class Sample { public static void main(String[] args) { List<String> words = Arrays.asList("A", "B", "C", "D", "E"); // ラベル付きのfor文 outerLoop: for (String word : words) { switch (word) { case "B": // ただスキップしたい場合はcontinue continue outerLoop; case "D": // ループ自体を抜けたい場合はbreakとラベルを指定 break outerLoop; default: // 普通に処理を書く System.out.print(word + " "); } } System.out.println("\n処理終了"); } }
public class Sample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("A", "B", "C", "D", "E");

        // ラベル付きのfor文
        outerLoop:
        for (String word : words) {
            switch (word) {
                case "B":
                    // ただスキップしたい場合はcontinue
                    continue outerLoop;
                case "D":
                    // ループ自体を抜けたい場合はbreakとラベルを指定
                    break outerLoop;
                default:
                    // 普通に処理を書く
                    System.out.print(word + " ");
            }
        }

        System.out.println("\n処理終了");
    }
}
  • case "B": continue outerLoop; と書くと、「このラベル付きループの先頭へ戻る」動きになります(つまり、word = "B"のときは出力しない)。
  • case "D": break outerLoop; と書くと、「このラベル付きループをまるごと終了」します。

これにより、switch文のbreakが単にswitchの終了を意味するものなのか、ラベル付きbreakでループ自体の終了を指示しているのかが明確になります。

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