Developer

【はじめてのJava】繰り返し文(for文)【基本構文編】
2021.01.30
Lv1

【はじめてのJava】繰り返し文(for文)【基本構文編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


繰り返し文(for文)

プログラムの中でよく利用する「繰り返し処理」について詳しく解説していきます。

この記事では、「繰り返し処理」の概要と「for文」の基礎について扱っていきます。

目次


繰り返し処理

今回の記事では、「繰り返し処理」を紹介していきます。
プログラムを作成していると、同じ処理をそのまま何度か繰り返したり、同じ処理を少しづつ条件を変えながら繰り返すような場面が出てくることがあります。
(例)
・「2の4乗」などの累乗の計算をするときに「2をかける」という処理を、4回繰り返す(繰り返しを使わずに計算させる方法もありますが…)
・オセロゲームで、「駒を置く」という動作を、1ターンごとに駒の色を変えながら、マスの回数分繰り返す など…

そのような処理をプログラムに書いていくときに、繰り返す回数が決まっている処理ならば、その回数分同じ処理を1つ1つ書いていくことも可能ですが、繰り返しの回数が100回、1000回のような非常に大きな数の時、同じ処理を100行、1000行と書くのは現実的ではありません。

また、繰り返しの回数は決まっておらず、何かしらの条件を満たすまで無限に処理を繰り返す場合などもあります。
(例)ストップウォッチのプログラムで、開始ボタンが押されたら、終了ボタンが押されるまで「1秒ごとに画面に時間を表示する」という処理を無限に繰り返す など…

繰り返しの回数が決まっていない処理では、プログラムの中に1つ1つ処理を書いていくことはできません。

同じ処理をそのまま何度も繰り返す場合や、少しずつ条件を変えて繰り返す場合、何かしらの条件を満たすまで無限に繰り返す場合には、for文while文do-while文を使うことでプログラムを簡潔に書くことが出来ます。
for文」「while文」「do-while文」の3つがあり、繰り返し処理を行うという点ではどれも同じですが、それぞれで便利なタイミングが違いますので、使い分けることができれば、無駄のないプログラムを書くことが出来ます。
簡単な使い分けとして、for文は「繰り返しの回数が決まっている場合」、while文とdo-while文は「繰り返す回数が決まっておらず、何かの条件を満たすまで無限に繰り返す場合」に使うと効果的です。


前判定と後ろ判定

前のセクションで「繰り返す回数が決まっておらず、何かの条件を満たすまで無限に繰り返す場合」はwhile文かdo-while文を使うのが効果的だと紹介しました。
この「while文」と「do-while文」はどう使い分けるのかについて紹介します。

while文とdo-while文はどちらも条件によって繰り返しを行うかどうか判断します。
2つの構文の違いは、繰り返し処理を行うか判断をするタイミングにあります。

while文は「繰り返すかどうかの判定」→「繰り返す対象の処理」の順で処理を行います。
この特徴から前判定ループと呼ぶこともあります。
繰り返しを行うかどうかの判定を先に行いますので、最初の時点で条件を満たしていなければ1回も繰り返しが行われないこともあります。

do-while文は「繰り返す対象の処理」→「繰り返すかどうかの判定」の順で処理を行います。
この特徴から、後判定ループと呼ぶこともあります。
先に繰り返す対象の処理を行いますので、最初の時点で条件を満たしていなくても、繰り返す対象の処理が必ず1回は行われます


for文

for文は、同じ処理を何回か繰り返す場合や、条件を少しずつ変えて指定の回数だけ同じような処理を繰り返す場合に適しています。

for文の使い方の基本

for文の書式は以下のようになっています。

for( 初期化 ; 条件式 ; 継続処理[変化処理] ){
    繰り返し実行したい処理 ;
}

これだけではどのように書いたらいいのか分からないと思いますので、詳しく解説していきます。

for文は「回数を指定して」繰り返し処理を行います。
「回数を指定する」と言っても、プログラムの中に○回のような条件を入れるわけではなく、()の中の初期値、継続処理(変化処理)、条件式の3つを使って繰り返しの回数を表現します。
具体的には、初期値の部分で「変数を定義して数値を入れ」、「そこで定義した変数を利用した」条件式を判定することで、{}の中の処理を行うか決まります。
{}の中の処理が終わると、継続処理(変化処理)が行われ、「初期値の部分で定義した変数の値を変化させ」、for文の始めに戻ります。
for文の始めに戻ったら、条件式を判定することでもう一度{}の中の処理を行うか決まります。この時、継続処理によって変数の値が変化していくので、何回か繰り返されるといずれ条件式の結果がfalseになり、繰り返しが終了します。

(例)1から10までの数字を順に足すプログラム

int sum = 0;

for( int i = 1 ; i < 11 ; i++ ){
    sum += i ;
}

System.out.println("1から10までの総和は"+sum+"です")

上で例に挙げている1から10までの数字を順に足すプログラムでは、初期値として変数iが1、{}の中の処理を行うたびにiに1ずつ足していき、「i < 11」という条件を満たす間は繰り返しを行うという条件になっています。 この時、iの値は1,2,3,4,...と増えていき、11になった時に条件を満たさなくなりますので、iが1~10の間(11の時は{}の中の処理は実行されずに終了するので)の10回の繰り返しが行われるということになります。

for文をうまく扱うために押さえておくポイントは下の2つです。
①繰り返しを行う回数を数えるための変数を使い、その数の変化によって繰り返しの回数をカウントする。(繰り返すたびに1ずつ足していくというのが一般的)
②条件式の結果が「true」になっている場合に{}の中の処理が実行される。(条件式の数字によって回数を決めているイメージ)


<おまけ>
for文の初期値、条件式、継続処理は省略することもできます。
その場合の動作について注意しておかなければならないことがあります。

  • 初期値を省略する場合

    初期値の部分では、繰り返しを行う回数を数える変数を定義していましたが、必ずしもそこで定義する必要はありません。
    下のコードのように、for文の前で定義した変数を利用して繰り返しの回数を数えるということもできます。

    //for文の前に初期値を用意しておく
    int i = 1;
    
    for( ; i < 10 ; i++ ){ //初期値の部分を空欄にしています。
        System.out.println( i );
    }
    
  • 条件式を省略する場合

    条件式の部分では、繰り返しを行うかどうかの条件を決めていました。この条件式を省略すると、繰り返し処理を行うかどうかの判定が「常にtrue」と認識されます。
    つまり、falseになることがありませんので、無限に繰り返しが続いてしまう(無限ループ)ため、注意が必要です。
    ※↓のコードは無限ループになりますので、実行する場合は注意してください。(コマンドプロンプトの場合は[Ctrl] + [C]キー、Eclipseの場合は停止ボタンで停止できます。)

    for( int i = 1 ;  ; i++ ){ //条件式の部分を空欄にしています。
        System.out.println( i );
    }
    
  • 継続処理を省略する場合

    継続処理の部分では、繰り返しの回数をカウントするための変数の値を変化させて、いずれ条件式を満たさなくなるようにするための役割があります。
    そのため、省略するとカウント用の変数の値が変化しませんので、無限ループになってしまう可能性があります。また、繰り返し処理の内部に、カウント用の変数を変化させる処理を記述することで継続処理のような振る舞いをさせることも可能です。

    for( int i = 1 ; i < 10 ; ){ //継続処理の部分を空欄にしています。
        System.out.println( i );
        
        //繰り返し処理の中にiを変化させる処理を記述して、継続処理の代わりをさせる
        i++;
    }
    

サンプルコード

for文を使用したサンプルソースを見ていきます。

package java_silver;

public class Souwa {
	public static void main(String[] args) {

		int sum = 0; //総和を加算していくための変数

		for (int i = 1; i < 11; i++) {
			sum += i; //繰り返すたびにsumに1,2,3,...を加算していく

			//繰り返すたびに「○ + 」と計算式を表示していき、最後の数(10)の部分は「○ = 」と表示
			System.out.print(i);
			if (i < 10) {
				//数字が1~9の間は「○ + 」と表示する
				System.out.print(" + ");
			} else {
				//数字が10の時は、「10 = 」と表示する
				System.out.print(" = ");
			}
		}
		//繰り返しが終了したら、「1 + 2 + ... 10 =」という表示と、sumが計算されているので、合計を表示する
		System.out.println(sum);
	}
}

実行結果

サンプルコードでは、継続処理として1から10までの総和を計算しながら、計算式「○ + 」の表示を行っています。
そのまま繰り返しを行うと、「1 + 2 + 3 + … 10 + 」となってしまい、式の表示がうまくいかないので、条件分岐を使い、9回目の繰り返しまでは「+」、10回目の繰り返しは「=」が表示されるようにしています。
このようなfor文の中にif文が入っている形は非常に良く使います。詳しくは後程の記事で解説します。


基本構文編・次回の内容

今回は繰り返し文の「for文」について説明しました。
次回は繰り返し文の中でも、「while文」についての説明を行います。


初めてのJavaシリーズの目次はこちら
基本構文編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら