ループの全体イメージをつかむ
ループは「同じような処理を、たくさんのデータに対して繰り返すための仕組み」です。 配列やリストの全件処理、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++;
}
Javafor と違って、初期化と更新をかっこの外に書きます。
初期化;
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 は「条件が続く限り回す」ループ、とざっくりイメージしておくと使い分けがしやすくなります。
特に初心者にとって重要なのは次のようなポイントです。
- 配列やリストを回すときは「範囲外アクセス」を防ぐために、
lengthやsize()を必ず使う - 終了条件に関わる変数は、ループのどこかで必ず変化させる(無限ループ防止)
- 集合処理では「ループの外で集計用変数を初期化し、ループ内で更新する」パターンを体に染み込ませる
- 拡張forは「全件を素直に処理したいとき」に積極的に使うと、コードが読みやすくなる
