for 文は、プログラミングの 3 大能力の 1 つである「繰り返し」処理の中で使われる必須テクニックです。
ここでは for 文 の真骨頂とも言えるネストを入れた for 文の書き方を理解して、2重ループの繰り返し処理をマスターしていきましょう^^
for 文の基本的な仕組みについては別の記事で解説していますので、ゼロから学びたいという場合はそちらをご覧になってからのほうがスムーズに理解できると思います。
Javaを極める上で for 文のプログラムは絶対に欠かせません。 for 文とは簡潔に言うと、繰り返し処理を行うための構文です。 この for 文のプログラムを組み込めば、半永久的に処理を繰り返す無限ループ[…]
for文のネストとは?
ネストとは、字義どおりには「入れ子」という意味があります。

つまり、1つ目の for 文の中にもう 1 つの for 文を入れ込むことを指します。
こうすることで、2 つの for 文を連動させて 2 重ループを実現、更に便利な処理を行えるようになるというわけです^^
for 文の2重ループの書き方
ネストを入れた for 文の 2 重ループはこのような姿をしています。

なんか…… for 文を 1 つ増やしただけで、波かっこ { } の数とか、その中の処理の中身も一緒に増えるため、ややこしく感じられますよね^^;
でも大丈夫です! 落ち着いて段階的に読み解いていくだけで、サクッとやっつけられます◎
まず for 文のネストを作る時は、2 つのルールに沿って書くのが必須です。
- 2 個目の for 文を 1 個目の for文よりも内側に書く
- 2 個目の for 文の変数名は 1 個目と違うものにする
こちらの図を改めて注目してみてください。

この位置関係からも見て取れるように、 2 つ目の for 文は内側に入り、1 つ目の for 文は外側にありますよね。
このように入れ子の状態にするのが 1 つ目のポイント。
そしてもう 1 点は、変数名を別なものにしなければいけません。

今回の場合は、1 つ目の for 文に i (アイ)という変数を宣言して、2 つ目の for 文には j (ジェイ)という変数を使っています。
このようにして 2 つの for 文を分けて作ることで、親子のようにはっきりと区別させ、同時に仲良く連動できる関係が生まれるわけです^^
2重ループの繰り返し処理を完璧に把握しよう
2 つの for文の関係性がわかったところで、どのように i と j が秩序正しく回って繰り返し処理を行うのかを見ていきましょう。
ここからは、基本の for 文の動きは理解していることを前提に解説していきますので、万が一、現時点でフワッとした認識なら、まずは復習してから読み進めるようにしてください。
インクリメントなど意味がわからない場合は必ず復習しておきましょう!

ここはもうおわかりのとおり、i の初期値である 0 から 4 未満まで、つまり 0〜3回目までの合計 4 回分の繰り返し処理が行われるように制御されていますね。
ここで肝心になってくるのが、i が毎回まわるたびにどんな処理を実行していくのか?という点です。
ここの流れがはっきりと追えれば、for 文のネストの完全制覇にググッと近づきますよ^^
結論から言うと、外側にある親の for 文は赤色の波線で囲んだ範囲を処理します。

目立たせるために敢えて赤線にしましたが、for 文のちょうど右端の波カッコから、もう 1 つ対応する波カッコまでの範囲が、外側の for 文が 1 回まわるごとに実行される処理内容です。
この外側の for 文の処理範囲は必ず覚えておいてくださいね。
1 つ目の for 文と当該の波かっこが同じ段落に位置している関係に注目すると、すんなり範囲を把握しやすくなるかと思います。
ではこのベースを軸にして入れ子の for 文も見ていきましょう。

内側の for 文から読み取れるのは、j も 0 から 4 未満まで、つまり 0〜3回目まで合計 4 回分の繰り返し処理が行われるという点ですね。
それでは、j が毎回まわるとき、どんな処理が実行されていくのか予想がつきますでしょうか?
対応する波かっこ内を処理していくわけですから、2 つ目の for 文の処理範囲は以下のように読み解けますね。

はい。赤線で示した波カッコが対(つい)になっているのが範囲処理です。
外側の for 文のそれと比べたら少ないですね。
では、ここでもう一度、外側にある for 文との関係を思いだしてみてください。
1番目の for 文の処理には、2番目の for 文のプログラム全体が範囲として含まれていたことにお気づきでしょうか?

これはつまり、i が 1 回分 まわる(処理)ごとに、内側の for 文が一通り実行されるということなんです。

いかがでしょうか?
この処理の仕組みこそが、入れ子を使った典型的な2重ループの動きになります^^
毎回外側のfor文が 1回まわる度、内側は全回数分まわる。 ← 「この流れで 1 セット」と覚えてしまうのが、余計な頭を使わずしてスッキリ落とし込むコツです◎
敢えて箇条書きにすると、こういう処理の流れになりますね。(※ 面倒くさいかもしれませんが、1 度だけ落ち着いて最後まで動きを読み解いてみることをオススメします。)
【i = 0 のときの for 文 2重ループの動き】
外側の for 文で i = 0 が初期値としてセットされる。
i が 4 より小さいか判別して、当てはまるので内側の for 文が実行される。
結果、内側 の for 文に移動して j = 0 が初期値としてセットされる。
j が 4 より小さいか判別して、当てはまるので内側のプログラムが実行されて○ (丸型)の図形を表示する。
j の for 文に戻る。
j 変数に1が増やされ(インクリメントされ)、0 → 1 となる。
j が 4 より小さいか判別して、当てはまるので内側のプログラムが実行されて2つ目の○ (丸型)の図形を表示する。
j の for 文に戻る。
j 変数に1が増やされ、1 → 2 となる。
j が 4 より小さいか判別して、当てはまるので内側のプログラムを実行して 3 つ目の○ (丸型)の図形が表示される。
j の for 文に戻る。
j 変数に1が増やされ、2 → 3 となる。
j が 4 より小さいか判別して、当てはまるので内側のプログラムを実行して 4つ目の○ (丸型)の図形が表示される。
j の for 文に戻る。
j 変数に1が増やされ、3 → 4 となる。
j が 4 より小さいか判別して、条件に当てはまらないため処理内容が実行されず、ここで内側のループを抜ける。
これで i = 0 実行時の入れ子のfor文の処理が終わる。
以上のような流れですね。
ここまではよろしいでしょうか?
では、j が一通り処理されて、ループから抜けた後は、次にどうなるんでしょうか?
実は、まだ i = 0 時の処理は全て終わったわけではありません。
もう一度、外側の for 文の処理範囲を確認してみてください。

うん? 何やら入れ子のfor文の処理よりも更に下のほうに、もう一つ別の命令文が残っていますよね。
これは、println文で改行を入れるためだけの命令文です。
そう、最後に改行を 1 つだけ入れ、こうして i = 0 の時の実行処理が全て滞りなく完了されることになります。
ということは、ここまでの進捗状況をまとめると、i = 0 の処理完了時点で「○の図が4つ並んで改行」までが行われたと読み取れるわけですね^^

では、この処理があと3回、つまり i がインクリメントされていった後 3 回分、つまり外側の for ( int i = 0 ; i < 4 ; i++ ) が全て実行された完了時にはどんな図形が描かれているか頭の中でイメージできますでしょうか?

はい!見事にこのような四角形が完成しますよね◎
もしここまでの動きが頭の中ではっきりと描けたのであれば、もうあなたは for 文の 2 重ループの仕組みを完全にマスターしたと言えるでしょう^^
万が一、
- なんでこういう図形ができあがるの?
- 2つの for 文の最後までの動きがよくわからない…
こういう状況でしたら、全部の動きを書いた以下のヒントを御確認ください。
- for 文の最後までの動きと処理
-
ネストした入れ子のfor 文2重ループのまとめ
いかがだったでしょうか?
このコンテンツを通して、 2 つの for 文を使った 基本的な書き方が理解できたのであれば幸いです。
- ネストの意味
- 入れ子の for 文で 2 重ループを作る方法
- 外側・内側の for 文の繰り返し処理の動き
以上の 3 点がマスターできていれば完璧です^^