Java入門|for文のネストと多重ループ

繰り返しの中に、さらに繰り返し。for文のネストを覚えると、表や模様のような複雑な処理もすっきり書ける。

ここまでで、for文を使った基本的な繰り返し処理を学んできました。
1回ずつ数を増やしながら同じ処理を行う書き方に慣れてくると、次に気になってくるのが「もっと複雑な繰り返しも書けるのだろうか」という点です。

そこで登場するのが、for文のネストです。
ネストとは、ある文の中に別の文を入れ子のように組み込むことです。for文の中にさらにfor文を書くと、1つの繰り返しの内側で、別の繰り返しを動かすことができます。これを多重ループと呼びます。

このしくみを使えるようになると、表のように縦と横を組み合わせた処理や、規則的な模様の表示、複数の条件を組み合わせた反復処理などが書けるようになります。少し難しそうに見えるかもしれませんが、考え方は意外と素直です。外側のループが1回進むたびに、内側のループが最初から最後まで動く、という流れをつかめば理解しやすくなります。

ここでは、for文を入れ子にする基本、動き方、変数の見方、さらにif文と組み合わせた応用まで、表やサンプルを使いながら丁寧に見ていきましょう。

ネストとは何か

ネストとは、文の中に別の文を入れ子にして書くことです。

たとえば、for文の中にfor文を書くと、次のような形になります。

for(式1-1; 式2-1; 式3-1){
    ...
    for(式1-2; 式2-2; 式3-2){
        ...
    }
}

このように書くと、外側のfor文が進むたびに、内側のfor文がくり返し実行されます。

この「外側のループ」と「内側のループ」を区別して考えることがとても大切です。

呼び方役割
外側のループ全体の大きな流れを管理する
内側のループ外側の1回ごとに細かい繰り返しを行う

つまり、ネストしたfor文では、大きなくり返しの中で、小さなくり返しを何度も動かすことになります。

for文のネストの基本イメージ

for文のネストは、たとえば次のような場面を考えるとわかりやすいです。

  • 行ごとに列を処理する
  • 縦と横の組み合わせをすべて調べる
  • 表のマス目を順番に処理する
  • 規則的な記号の並びを作る

このとき、外側のfor文が「行」、内側のfor文が「列」を担当するように考えると理解しやすくなります。

たとえば、

  • 外側のループが3回
  • 内側のループが4回

なら、全体では 3 × 4 で12回の処理が行われます。

for文をネストすると何が起こるか

ネストしたfor文では、外側のループが1回進むたびに、内側のループが最初から最後まで実行されます。

この動きを言葉で書くと、次のようになります。

  1. 外側のループが1回目を始める
  2. 内側のループが最初から最後まで動く
  3. 外側のループが2回目に進む
  4. 内側のループがまた最初から最後まで動く
  5. これを外側のループが終わるまで続ける

ここをしっかり理解しておくと、実行結果を予想しやすくなります。

Sample7.java でfor文のネストを見てみよう

まずは、for文の中にfor文を書く基本的な例です。

ファイル名:Sample7.java

class Sample7
{
    public static void main(String[] args)
    {
        for(int row = 1; row <= 4; row++){
            for(int col = 1; col <= 3; col++){
                System.out.println("行は" + row + "、列は" + col + "です。");
            }
        }
    }
}

実行結果

行は1、列は1です。
行は1、列は2です。
行は1、列は3です。
行は2、列は1です。
行は2、列は2です。
行は2、列は3です。
行は3、列は1です。
行は3、列は2です。
行は3、列は3です。
行は4、列は1です。
行は4、列は2です。
行は4、列は3です。

このプログラムの見方

このコードでは、外側のfor文が row を1から4まで変化させています。
内側のfor文は、col を1から3まで変化させています。

つまり、

  • row が 1 のときに、col が 1, 2, 3 と進む
  • 次に row が 2 になり、また col が 1, 2, 3 と進む
  • これを row が 4 まで続ける

という流れです。

表で整理すると、次のようになります。

外側 row内側 col の動き
11 → 2 → 3
21 → 2 → 3
31 → 2 → 3
41 → 2 → 3

この表から、外側のループが1回進むたびに、内側のループが毎回最初からやり直していることがわかります。

全体では何回処理されるのか

ネストしたループでは、実行回数を掛け算で考えるとわかりやすいです。

今回のSample7.javaでは、

  • 外側のループは4回
  • 内側のループは3回

なので、合計の表示回数は 4 × 3 = 12回 です。

外側の回数内側の回数合計
4回3回12回

多重ループでは、この掛け算の感覚がとても大切です。
処理が何回行われるのかを考えるときに役立ちます。

外側と内側の役割を意識しよう

ネストしたfor文を読むときは、どちらが外側で、どちらが内側なのかを意識すると整理しやすくなります。

今回の例では、

変数役割
row外側のループを担当する
col内側のループを担当する

このように、変数名も役割がわかる名前にすると、コードの意味が読みやすくなります。
元のように i と j を使う書き方もよくありますが、学習の初期段階では row や col のように意味が伝わる名前を使うと理解しやすいです。

この図は、外側の1回の中で内側がすべて実行されるという構造を表現しています。
ネストが苦手な人は、どうしても上から順に読んで混乱しやすいので、図で流れを見るとかなりわかりやすくなります。

特に注目したいのは次の点です。

注目点意味
外側のループ全体の大きな繰り返し
内側のループ外側1回ごとに全部動く
実行回数掛け算で考えられる

for文のネストは表や座標の処理に強い

for文のネストは、行と列のような2つの軸を扱う場面でとても便利です。
たとえば、表のマス目を順番に処理したり、座標を1つずつ調べたりするときによく使います。

たとえば次のようなイメージです。

row\col123
1(1,1)(1,2)(1,3)
2(2,1)(2,2)(2,3)
3(3,1)(3,2)(3,3)
4(4,1)(4,2)(4,3)

Sample7.javaは、この表のマスを左上から順に見ていくような処理だと考えることができます。

if文と組み合わせると表現の幅が広がる

ネストできるのはfor文どうしだけではありません。
for文の中にif文を入れると、繰り返しながら条件に応じて表示内容を変えることができます。

こうすると、ただ順番に処理するだけでなく、規則的な模様や条件つきの出力も作れるようになります。

Sample8.java で多重ループとif文を組み合わせる

記号を交互に表示するプログラムを作成します。

ファイル名:Sample8.java

class Sample8
{
    public static void main(String[] args)
    {
        boolean circle = true;  // 最初は○から表示する

        for(int row = 0; row < 4; row++){
            for(int col = 0; col < 6; col++){
                if(circle == true){
                    System.out.print("○");
                    circle = false;
                }
                else{
                    System.out.print("■");
                    circle = true;
                }
            }
            System.out.print("\n");
        }
    }
}

実行結果

○■○■○■
○■○■○■
○■○■○■
○■○■○■

このプログラムのしくみ

このコードでは、外側のfor文で行を4回くり返し、内側のfor文で1行あたり6文字を表示しています。
さらに、if文を使って、boolean型の変数 circle の値によって表示する記号を切り替えています。

処理の流れ

条件表示する文字その後の値
circle が truefalse にする
circle が falsetrue にする

このしくみによって、○と■が交互に表示されます。

boolean型の役割

このプログラムでは、boolean型の変数を使って「次にどちらを表示するか」を管理しています。

boolean型には、次の2つの値だけを入れることができます。

意味
true
false

今回の例では、trueなら○、falseなら■という形で使っています。
このようにboolean型を使うと、条件に応じて処理を切り替える流れがとても書きやすくなります。

改行の意味にも注目しよう

Sample8.javaでは、内側のループが終わるたびに改行しています。

System.out.print("\n");

これによって、1行分の記号を表示し終えたところで次の行へ移ることができます。

もしこの改行がなければ、すべての記号が横一列に続いて表示されてしまいます。
つまり、外側のループを「行」、内側のループを「列」と考えるなら、改行は行の切り替えを表しているわけです。

交互表示の結果を表で見る

このプログラムの表示結果を、表のイメージで見ると次のようになります。

表示結果
1行目○■○■○■
2行目○■○■○■
3行目○■○■○■
4行目○■○■○■

今回は1行ごとに同じ並びになっています。
もし行ごとに開始する記号を変えたいなら、外側のループの中でboolean型の値を調整するなど、さらに工夫することもできます。

多重ループでできること

for文のネストを使うと、いろいろな表現ができるようになります。

できること
表形式の処理行と列を順番に処理する
規則的な模様の表示○と■、*と- を並べる
組み合わせの列挙2つの値の全組み合わせを出す
条件つきの繰り返しif文と組み合わせて表示を変える

このように、多重ループは少し複雑な処理を書くための大切な技術です。

for文のネストでよくある混乱

ネストしたfor文では、最初のうちは「どの変数がどこで動いているのか」がわからなくなることがあります。
そんなときは、次の点を意識すると整理しやすいです。

見るポイント確認する内容
外側の変数何回大きなくり返しをするか
内側の変数外側1回の中で何回動くか
ブロックの範囲どこまでが内側のループか
合計回数掛け算で求められるか

特に中かっこの位置を見失うと混乱しやすいので、インデントをきれいにそろえて書くことがとても大切です。

for文のネストを学ぶ意味

for文のネストは、単にループを2つ重ねるだけのテクニックではありません。
縦と横を組み合わせた処理や、規則的なパターンの出力、複雑な条件つき反復など、プログラムの表現力を大きく広げてくれます。

最初は少し難しく感じるかもしれませんが、

  • 外側のループが1回進む
  • そのたびに内側のループが全部動く

という基本の流れをつかめれば、理解はかなり進みます。

今回の内容では、for文のネストによって

  • 多重の繰り返しが書けること
  • 外側と内側の役割を分けて考えること
  • if文などと組み合わせて複雑な処理を書けること

が大切でした。

この考え方を身につけると、表や模様の出力、配列の処理、座標の扱いなど、より実践的なプログラムにもつなげやすくなります。