Java 逆引き集 | ループ(for / enhanced for / while) - 集合処理とレコードループ

Java Java
スポンサーリンク
スポンサーリンク

ループの全体イメージをつかむ

ループは「同じような処理を、たくさんのデータに対して繰り返すための仕組み」です。 配列やリストの全件処理、DBから取得したレコードの1件ずつの処理など、ビジネスロジックではほぼ必ず登場します。 Javaでは主に for、拡張for(enhanced for)、while を使ってループを書きますが、それぞれ得意な場面と考え方が少し違います。

for文の基本と「回数で回す」ループ

for文の基本構造

for は「何回回すか」がはっきりしているときに一番使いやすいループです。

for (int i = 0; i < 5; i++) {
    System.out.println("i = " + i);
}
Java

かっこの中は「初期化」「継続条件」「更新」の3つで構成されています。

for (初期化; 継続条件; 更新) {
    繰り返したい処理
}
Java

この例だと、

  • 最初に int i = 0; が実行されて、カウンタ変数 i が 0 でスタートする
  • ループに入る前と各周回の終わりに i < 5 が評価され、true の間だけ中身が実行される
  • 1周終わるたびに i++ が実行されて、i が 1 ずつ増えていく

という流れになります。 「スタート地点」「ゴール条件」「1歩ごとの進み方」を1行でまとめて書けるのが for の強みです。

配列のインデックスで回す for

集合処理でよくあるのが「配列の全要素を順番に処理する」パターンです。

int[] scores = {80, 90, 75};

for (int i = 0; i < scores.length; i++) {
    System.out.println("scores[" + i + "] = " + scores[i]);
}
Java

ここで重要なのは i < scores.length という条件です。 配列の長さ(要素数)を使って上限を決めることで、「範囲外アクセス」を防いでいます。

初心者がよくやるバグが「i <= scores.length と書いてしまう」ことです。 配列のインデックスは 0 〜 length - 1 なので、<= にすると最後の1つ先まで行ってしまい、ArrayIndexOutOfBoundsException が発生します。 「配列は 0 始まり、条件は < length」をセットで覚えておくと安全です。

拡張for(enhanced for)で「中身だけ」に集中する

拡張forの基本構造

拡張forは「インデックスを意識せず、要素そのものを順番に取り出したい」ときに使います。

int[] scores = {80, 90, 75};

for (int score : scores) {
    System.out.println("score = " + score);
}
Java

読み方は「scores から int 型の score を1つずつ取り出して、ブロック内の処理を繰り返す」です。 インデックス変数 i を自分で管理する必要がないので、「集合の中身を順番に処理する」という意図がとても素直に書けます。

拡張forが向いている場面

拡張forは、配列だけでなく List<String>List<Integer> などのコレクションにも使えます。

import java.util.ArrayList;
import java.util.List;

public class EnhancedForListExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Taro");
        names.add("Hanako");
        names.add("Jiro");

        for (String name : names) {
            System.out.println("name = " + name);
        }
    }
}
Java

「全件を順番に処理するだけ」であれば、拡張forの方が読みやすく、バグも起きにくくなります。 逆に、「インデックスを使って特定の位置だけを操作したい」「前後の要素を見たい」といった場合は、通常の for の方が向いています。

while文の基本と「条件で回す」ループ

while文の基本構造

while は「この条件が true の間はずっと回し続ける」というタイプのループです。

int i = 0;

while (i < 5) {
    System.out.println("i = " + i);
    i++;
}
Java

for と違って、初期化と更新をかっこの外に書きます。

初期化;

while (継続条件) {
    繰り返したい処理;
    更新;
}
Java

「何回回すかは事前に決まっていないけれど、ある条件を満たしている間は処理を続けたい」という場面でよく使います。 例えば「ユーザーからの入力が ‘exit’ になるまで繰り返す」「DBから次のレコードがある間は読み続ける」といったケースです。

無限ループと終了条件

while で一番気をつけるべきなのは「終了条件をきちんと変化させること」です。

int i = 0;

while (i < 5) {
    System.out.println("i = " + i);
    // i++ を書き忘れると、ずっと i は 0 のまま
}
Java

このように更新を忘れると、i < 5 が永遠に true のままになり、プログラムが止まらなくなります。 無限ループ自体は「わざとそう書く」こともありますが、初心者のうちはほぼ「更新忘れによる事故」なので、「条件に関わる変数は必ずどこかで変化させる」と意識して書くとよいです。

集合処理・レコードループの具体例

配列の合計値を求める

集合処理の典型例として「配列の合計値を求める」コードを見てみましょう。

int[] scores = {80, 90, 75};
int sum = 0;

for (int i = 0; i < scores.length; i++) {
    sum += scores[i];
}

System.out.println("合計 = " + sum);
Java

ここでは「合計を入れる箱 sum を 0 で初期化しておく」「ループの中で1件ずつ足していく」という流れになっています。 この「集計用の変数をループの外で初期化しておく」というパターンは、ビジネスロジックで頻出です。

同じ処理は拡張forでも書けます。

int[] scores = {80, 90, 75};
int sum = 0;

for (int score : scores) {
    sum += score;
}

System.out.println("合計 = " + sum);
Java

インデックスが不要なときは、こちらの方が「何をしているか」が読み取りやすくなります。

レコードループのイメージ

DBから取得したレコードを1件ずつ処理する場面をイメージしてみましょう。 実際のコードはフレームワークによって変わりますが、「レコードの集合をループで回す」という構造は共通です。

List<Order> orders = fetchOrders(); // 注文一覧を取得したと仮定

for (Order order : orders) {
    System.out.println("注文ID: " + order.getId());
    System.out.println("金額: " + order.getAmount());
}
Java

ビジネスロジックでは、「各レコードに対して何をするか」をループの中に書いていきます。 例えば「金額の合計を出す」「特定条件の注文だけ別リストに集める」「ステータスを更新する」などです。

break / continue とループ制御の深掘り

break でループを途中で抜ける

break は「ループを途中で終わらせる」ためのキーワードです。

int[] scores = {80, 90, 75, 60, 50};

for (int score : scores) {
    if (score < 70) {
        System.out.println("70未満の点数を見つけたので終了します: " + score);
        break;
    }
    System.out.println("チェック中: " + score);
}
Java

この例では、最初に 70 未満の点数を見つけた時点でループを抜けています。 「全件を最後まで見る必要はなく、条件を満たしたらそこで終わりたい」という場面で break が役立ちます。

continue で「今回だけスキップする」

continue は「ループ自体は続けるけれど、今の周だけ残りの処理をスキップする」ためのキーワードです。

int[] scores = {80, -1, 90, 75};

for (int score : scores) {
    if (score < 0) {
        System.out.println("不正な点数をスキップします: " + score);
        continue;
    }
    System.out.println("有効な点数: " + score);
}
Java

ここでは、負の値(例えば「未入力を -1 で表現している」など)を見つけたら、そのレコードだけ処理せずに次へ進んでいます。 「特定条件のデータだけ飛ばしたい」というビジネスロジックでよく使うパターンです。

まとめと意識してほしいポイント

ループは「集合をどう回すか」「いつ終わるか」を自分で設計する構造です。 for は「回数やインデックスで回す」ループ、拡張forは「集合の中身だけに集中する」ループ、while は「条件が続く限り回す」ループ、とざっくりイメージしておくと使い分けがしやすくなります。

特に初心者にとって重要なのは次のようなポイントです。

  • 配列やリストを回すときは「範囲外アクセス」を防ぐために、lengthsize() を必ず使う
  • 終了条件に関わる変数は、ループのどこかで必ず変化させる(無限ループ防止)
  • 集合処理では「ループの外で集計用変数を初期化し、ループ内で更新する」パターンを体に染み込ませる
  • 拡張forは「全件を素直に処理したいとき」に積極的に使うと、コードが読みやすくなる

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