この記事の要点
• 基本for文は初期化・条件・更新を1行で書ける定番構文
• 拡張for(for-each)は配列やコレクションの全要素を簡潔に処理
• break でループを抜け、continue で次の繰り返しへスキップ
このシリーズについて
「Java入門」は1本1テーマで進む全15回のシリーズです。本記事はその第8回として、**for文(繰り返し)**を解説します。
前提条件: Java入門 #1 - 開発環境構築 でJDK 21 がインストール済み。条件分岐(if文)の基礎を理解済み。
for文とは
for 文は、同じ処理を繰り返し実行するための制御構文です。回数が決まっている繰り返しに向いています。
for (初期化; 条件式; 更新式) {
// 繰り返したい処理
}
実例を見ましょう。
// Java 21
public class ForBasic {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("i = " + i);
}
}
}
実行すると以下のように出力されます。
i = 0
i = 1
i = 2
i = 3
i = 4
for文の動作フロー
上記のコードは以下の順序で実行されます。
| ステップ | 内容 | 実行回数 |
|---|---|---|
| 1. 初期化 | int i = 0 | 1回だけ |
| 2. 条件チェック | i < 5 が true か確認 | 毎回 |
| 3. ブロック実行 | System.out.println(...) | 条件が真の間 |
| 4. 更新 | i++(i を1増やす) | 毎回 |
| 5. 2に戻る | 条件が false になるまで繰り返す | — |
ポイント: 初期化は最初の1回だけ実行されます。ループ変数 i は for文の中でのみ有効(スコープがブロック内)です。
配列との組み合わせ
配列の要素を順に処理するのに for 文はよく使われます。
// Java 21
public class ArrayLoop {
public static void main(String[] args) {
String[] fruits = {"りんご", "バナナ", "オレンジ"};
for (int i = 0; i < fruits.length; i++) {
System.out.println((i + 1) + "番目: " + fruits[i]);
}
}
}
出力:
1番目: りんご
2番目: バナナ
3番目: オレンジ
fruits.length で配列の長さを取得し、それを条件式で使います。
拡張for(for-each文)
配列やコレクションの全要素を順に処理するだけなら、拡張for文(for-each)が簡潔です。
for (型 変数名 : 配列またはコレクション) {
// 繰り返したい処理
}
先ほどの例を拡張forで書き直します。
// Java 21
public class ForEach {
public static void main(String[] args) {
String[] fruits = {"りんご", "バナナ", "オレンジ"};
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
出力:
りんご
バナナ
オレンジ
補足: 拡張forはインデックス(i)が不要な場合に便利ですが、インデックスが必要なときは基本for文を使いましょう。
基本for vs 拡張for の使い分け
| 状況 | 推奨構文 |
|---|---|
| 全要素を順に処理(インデックス不要) | 拡張for |
| インデックスが必要(「何番目」を表示など) | 基本for |
| 逆順に処理 | 基本for |
| 要素をスキップしたい | 基本for |
| カウンタを2ずつ増やすなど特殊な更新 | 基本for |
break でループを抜ける
break を使うと、ループを途中で抜けることができます。
// Java 21
public class BreakExample {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 5) {
System.out.println("5に到達したので終了");
break;
}
System.out.println(i);
}
}
}
出力:
0
1
2
3
4
5に到達したので終了
i が5になった時点でループが終了します。
continue で次の繰り返しへスキップ
continue を使うと、その回の処理をスキップして次の繰り返しに進みます。
// Java 21
public class ContinueExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // 2のときはスキップ
}
System.out.println(i);
}
}
}
出力:
0
1
3
4
i が2のときだけ System.out.println(i) が実行されません。
ループ制御文の早見表
| キーワード | 動作 | 使い所 |
|---|---|---|
break | ループを即座に終了 | 条件を満たしたら抜ける |
continue | 現在の繰り返しをスキップし次へ | 特定の要素を飛ばしたい |
return | メソッド全体から抜ける | ループの中でも使える |
注意: break と continue はネストしたループでは最も内側のループにのみ影響します。外側のループを抜けたい場合はラベル付き break を使います(後述)。
ネストしたfor文
for文の中に別のfor文を入れることができます(ネスト)。
// Java 21
public class NestedLoop {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
System.out.print(i + "×" + j + "=" + (i * j) + " ");
}
System.out.println(); // 改行
}
}
}
出力:
1×1=1 1×2=2 1×3=3
2×1=2 2×2=4 2×3=6
3×1=3 3×2=6 3×3=9
外側のループが1回実行されるごとに、内側のループが全回実行されます。
実例:九九の表
ネストしたループで九九の表を作成します。
// Java 21
public class MultiplicationTable {
public static void main(String[] args) {
System.out.println("九九の表");
System.out.println("----------------------------");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.printf("%2d ", i * j); // 2桁で右寄せ
}
System.out.println();
}
}
}
出力(一部):
九九の表
----------------------------
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
...
補足: System.out.printf() は書式指定付き出力です。%2d は「2桁の整数、右寄せ」を意味します。
ラベル付きbreak(応用)
ネストしたループで外側のループを抜けたいときは、ラベルを使います。
// Java 21
public class LabeledBreak {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
System.out.println("外側ループを終了");
break outer; // outerラベルのループを抜ける
}
System.out.println("i=" + i + ", j=" + j);
}
}
System.out.println("ループ終了後");
}
}
出力:
i=0, j=0
i=0, j=1
i=0, j=2
i=1, j=0
外側ループを終了
ループ終了後
よくあるミス
| ミス | 説明 | 対策 |
|---|---|---|
i = 0; i <= 5; i++ | 6回実行される(0〜5) | i < 5 にする |
for (int i = 0; i < arr.length; i++) で arr[i+1] にアクセス | IndexOutOfBoundsException | 範囲をチェックする |
無限ループ for (;;) | 条件式がないと永遠に実行 | 必ず終了条件を設ける |
| 拡張forで要素を変更しようとする | 配列の中身は変えられない | 基本forを使う |
注意: 拡張forではループ変数に代入しても元の配列は変わりません。要素を変更したい場合は基本forとインデックスを使います。
次のステップ
Java入門 #9 - while文とdo-while文 で、回数が決まっていない繰り返しを扱う方法を学びます。
参考リソース
- The Java Tutorials - The for Statement — Oracle公式チュートリアル
- JLS - The for Statement — Java言語仕様
- Effective Java 第3版 — ループのベストプラクティス