Javaのfor文を使って繰り返し処理をする方法【初心者向け】



Javaのfor文を使って繰り返し処理をする方法【初心者向け】

プログラミングの学習を進めて、変数の使い方などが徐々にわかってきた頃でしょうか?次に基本の構文として理解しておきたいのが、繰り返しの処理です。例えば、forを使ったループ処理などがありますね。forのループ文を使いこなせれば、表やたくさんの行のある大きなデータも取り扱うことができるようになります。

今回は、Javaのforループ文の使い方について、初めての方にもわかりやすいように、書き方を解説しようと思います! image

目次
  1. Java の for 文とは何か?
  2. Javaのfor文の書き方
  3. 初期化式
  4. 条件式
  5. 更新式
  6. サンプル
  7. ちょっとステップアップ!
  8. 入れ子のforを使ってみよう
  9. 配列を使ってみよう
  10. かっこのないfor文
  11. 無限ループに気をつけよう
  12. まとめ

Java の for 文とは何か?

Java の for 文はどんな時に使うのでしょうか?例えば、こんな処理を書きたいときに使いますよ。 image

こちらの処理では、お菓子を開封して中身がなくなるまで、配り続けるという処理を行っています。これを、ループ処理を使わずに書くと以下のようになります。


public class Main {
    public static void main(String[] args) throws Exception {

        int okashi = 5;

        okashi = okashi - 1;
        System.out.println( "友達にお菓子をあげた。のこりは" + okashi + "個。");

        okashi = okashi - 1;
        System.out.println( "友達にお菓子をあげた。のこりは" + okashi + "個。");

        okashi = okashi - 1;
        System.out.println( "友達にお菓子をあげた。のこりは" + okashi + "個。");

        okashi = okashi - 1;
        System.out.println( "友達にお菓子をあげた。のこりは" + okashi + "個。");

        okashi = okashi - 1;
        System.out.println( "友達にお菓子をあげた。のこりは" + okashi + "個。");

    }
}

出力結果

友達にお菓子をあげた。のこりは4個。
友達にお菓子をあげた。のこりは3個。
友達にお菓子をあげた。のこりは2個。
友達にお菓子をあげた。のこりは1個。
友達にお菓子をあげた。のこりは0個。

同じ処理を何度も書かなくてはいけないのでとても手間ですし、プログラムとしても見づらいですね。forループ文は、このような繰り返し処理を行いたい時に、活躍する構文です。さっそく、forループ文を使って書き直してみましょう。

public class Main {
    public static void main(String[] args) throws Exception {

        int okashi = 5;

        for(int i=0;okashi>0;i++){
            okashi = okashi - 1;
            System.out.println( i + "人目の友達にお菓子をあげた。のこりは" + okashi + "個。");
        }

    }
}

出力結果

0人目の友達にお菓子をあげた。のこりは4個。
1人目の友達にお菓子をあげた。のこりは3個。
2人目の友達にお菓子をあげた。のこりは2個。
3人目の友達にお菓子をあげた。のこりは1個。
4人目の友達にお菓子をあげた。のこりは0個。

とてもすっきりしましたね!次は、for文の構文を覚えましょう。

Javaのfor文の書き方

for (初期化式; 条件式; 更新式) {
     処理内容;
}

( ) カッコの中の式の区切りが、セミコロン(;)になっていることに注意してくださいね。コロン(:)ではありませんよ。

それぞれの式の詳細についてみていきましょう。

初期化式

for文に入ったときに、最初に一回だけ実行される式です。通常は、for文の中で使われる、回数を数える変数の初期化に使われます。上記サンプルでは、int i = 0 と書いているところです。

条件式

for文の中の処理を、もう一度繰り返すかどうかを判定する式を、こちらに書きます。条件式の結果がtrueの場合、for文の処理内容が実行されます。例えば10回繰り返したい場合、ここに”変数が10になるまで”という条件式を書きます。サンプルでは、okashi > 0と記述することで、"お菓子が0より多い場合"という条件を表しています。

更新式

for文の中の処理内容を実行した後に、計算される式を記述します。通常は、回数を数えている変数をカウントアップ(1プラスする)などに使います。サンプルでは、i++ (i+1の意味)と書くことで、何人に配ったかを数えています。

”0人目の友達"という表現に違和感を覚えた方もいらっしゃると思います。実は、Javaなどのプログラミングでは、カウントは0から始めるのが通例です。これには理由があるのですが、後ほど説明しますね!

サンプル

お手元に環境がある方は、一緒に簡単なサンプルを書いてみましょう!こちらはforループ処理の実行ごとに、ループの回数出力するプログラムです。

public class Main {
    public static void main(String[] args) throws Exception {

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

    }
}

出力結果です。

0
1
2
3
4
5
6
7
8
9

このforループ文では、以下の順番に処理が行われています。

  • 1. 初期化式でint型の変数iを宣言し、0を代入
  • 2. 条件式でiが10より小さいかどうかチェック、true
  • 3. System.out.printlnで変数iをコンソールに出力
  • 4. i++(i+1)が実行される
  • 5. 2~4を繰り返す
  • 6. 条件式でiが10より大きくなった(i=10)ため、forループの終了

流れはわかりましたか?次は、もう少し実践的なコードを書いてみましょう。

 

ちょっとステップアップ!

入れ子のforを使ってみよう

for文の中にfor文を書いて、入れ子にしてつかうこともできます。複雑な条件式の処理や複数の条件判定を行う場合に利用できます。


public class Main {
    public static void main(String[] args) throws Exception {

        int okashi = 15;
        int juice = 5;

        for(int i=0;juice>i;i++){
            //ジュースをくばります
            System.out.println( i + "人目の友達です。");

            //お菓子を配ります。ひとり3個あげます。
            for(int j=0;j<3;j++){
                System.out.println( " i = " + i + "  j = " + j);
                okashi = okashi -1;
            }

        }

        System.out.println("お菓子はのこり" + okashi + "個になりました");
    }
}

出力結果です。

0人目の友達です。
 i = 0  j = 0
 i = 0  j = 1
 i = 0  j = 2
1人目の友達です。
 i = 1  j = 0
 i = 1  j = 1
 i = 1  j = 2
2人目の友達です。
 i = 2  j = 0
 i = 2  j = 1
 i = 2  j = 2
3人目の友達です。
 i = 3  j = 0
 i = 3  j = 1
 i = 3  j = 2
4人目の友達です。
 i = 4  j = 0
 i = 4  j = 1
 i = 4  j = 2
お菓子はのこり0個になりました

ちなみに、iやjをループの変数として使うのは通例となっていますが、なぜiなのか?については「iteratorが語源」「incrementするから」「indexのiでは?」など諸説あるようです。ちなみに、i,j,kまではよく使われますね。(l(エル)は数字や縦棒と見間違いやすいのでオススメしません!)

配列を使ってみよう

複雑なプログラムを作るようになると、必ずといっていいほど利用する配列。この配列のデータを扱うのにも、forループ文をよく使います。サンプルを見てみましょう。

public class Main {
    public static void main(String[] args) throws Exception {

        int okashi = 15;
        int juice = 5;

        //友達の名前を配列に入れました。
        String[] tomodachi={"田中さん","山田さん","佐々木さん","松田さん","河本さん"};


        for(int i=0;tomodachi.length>i;i++){
            //ジュースをくばります
            System.out.println( i + ":" + tomodachi[i] + "さんジュースをどうぞ");

            //お菓子を配ります。ひとり3個あげます。
            for(int j=0;j<3;j++){
                System.out.println( " i = " + i + "  j = " + j);
                okashi = okashi -1;
            }
            System.out.println("お菓子はのこり" + okashi + "個になりました");
            System.out.println("-------------------------------------------");

        }
    }
}

出力結果です。

0:田中さんさんジュースをどうぞ
 i = 0  j = 0
 i = 0  j = 1
 i = 0  j = 2
お菓子はのこり12個になりました
-------------------------------------------
1:山田さんさんジュースをどうぞ
 i = 1  j = 0
 i = 1  j = 1
 i = 1  j = 2
お菓子はのこり9個になりました
-------------------------------------------
2:佐々木さんさんジュースをどうぞ
 i = 2  j = 0
 i = 2  j = 1
 i = 2  j = 2
お菓子はのこり6個になりました
-------------------------------------------
3:松田さんさんジュースをどうぞ
 i = 3  j = 0
 i = 3  j = 1
 i = 3  j = 2
お菓子はのこり3個になりました
-------------------------------------------
4:河本さんさんジュースをどうぞ
 i = 4  j = 0
 i = 4  j = 1
 i = 4  j = 2
お菓子はのこり0個になりました
-------------------------------------------

ここで、変数を0から数えていたことが生きてきます。配列は、tomodachi[0]のように、番号が0から始まるので、forループ文でのカウント変数iを0から始めていれば、配列に入った情報を簡単に順番に取り出すことができるのです。上記サンプルでは、tomodachi[i]と表記しているところが、配列 ともだち の i番目の情報を取り出すという記述になっています。

条件式にあるtomodachi.lengthとは、配列tomodachi[]の長さ(何個変数が入っているか)を表します。配列にいくつ変数が入っているか不明な場合や、後で配列を変更する可能性がある場合は、その時の配列の中身を数えてくれるlengthを使っておくと便利ですよ。

かっこのないfor文

for文の処理が1行でおさまる場合は、以下のように* { }(カッコ)* なしで記述することもできます。おしゃれですが、後で見る人がforの処理がどこまでか?分かりにくくなってしまうので、あまりお勧めしません。

public class Main {
    public static void main(String[] args) throws Exception {

        for(int i=0;i<10;i++)
            System.out.println( i );

    }
}

無限ループに気をつけよう

ループ処理をする際にもっとも気をつけないといけないことがあります。それは無限ループです!無限ループとは、処理の終了条件の記述に失敗していることが原因で、処理が無限に続いてしまうバグです。無限ループが起こると、処理が永久に実行され続けてしまうため、メモリを使い切ってアプリケーションが異常終了したり、 CPU利用率があがってしまい、コンピュータ自体の動作が不安定になったりします。

public class Main {
    public static void main(String[] args) throws Exception {

        //無限ループのサンプルです!!実行危険!!       
        for(int i=0;i>=0;i++){
            System.out.println( i );
        }

    }
}

出力結果です。数字が出続けて大変なことに!!

0
1
2
3
4
5
6
7
8
:
:
:
:

特にファイル作成やデータ生成が無限に行われてしまうと、コンピューター自体に影響が出てしまいます。慣れるまでは、プログラミング中ににも、条件式だけのテストも組み込んでおくなどすると、安心ですね。

万一、無限ループを実行してしまったら、処理を強制終了しましょう。コマンドプロンプトの場合は * ctrl+C *キー、Eclipseなどエディタの場合は停止ボタンを押しましょう。

また、ループ内にループを脱出する命令文を書くこともできます。

break;

繰り返し処理を抜ける命令文です。

処理内容の箇所に記述が可能です。処理の途中にif文などの条件判定と合わせて記述し、ループを抜ける場合に使います。ただし、プログラムの解読が困難になってしまうので、多用は避けましょう。

public class Main {
    public static void main(String[] args) throws Exception {

        int juice = 5;

        //このままでは無限ループです。     
        for(int i=0;i>=0;i++){

           //ジュースの数をこえる前にループを抜ける
            if(i>=juice){
                break;
            }

            //ジュースをくばります
            System.out.println( i );

        }

    }
}

無限ループのサンプルに終了条件を入れてみた、出力結果です。

0
1
2
3
4

 

まとめ

繰り返しの処理は、今後もいたるところで使うことになるでしょう。書き方をしっかりマスターして、バグの少ないプログラムを心がけましょうね!

image

のりぴよ
この記事を書いた人
のりぴよ
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp