Developer

【はじめてのJava】繰り返しのネストと制御文【基本構文編】
2021.01.31
Lv1

【はじめてのJava】繰り返しのネストと制御文【基本構文編】

はじめてのJava

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


for文のネストと制御文

前回の記事では、for文の中にさらにもう1回for文をネストさせた処理について解説しました。
また、以前の記事でfor文の処理を制御する「continue文」と「break文」も学習しました。
今回は、これらのネストしたfor文と制御文を組み合わせた場合の処理について解説していきます。

目次


繰り返し文のネストと制御文

for文やwhile文、do-while文を使用することで同じ処理を何度も繰り返したり、少しづつ条件を変化させながら繰り返し処理を行うことができました。
また、繰り返し分の中で制御文(「break文」や「continue文」)を使用することで、繰り返し処理の流れを制御することができました。
これらの制御文を紹介した時には、通常の繰り返し分の中で使用した場合の動作を解説しましたが、この制御文を、前回の記事で紹介した「ネストした繰り返し」のなかで使用する場合には、少し注意が必要になります。

ネストした繰り返しと制御文を組み合わせた処理

ネストしたfor文やwhile文の中で「break文」や「continue文」を使用する際に注意しなければならないことは、「breakやcontinueで抜け出すことができるのは、記述されている箇所に最も近い繰り返しのみ」ということです。
つまり、ネストされた繰り返しの内側のループでbreak文やcontinue文を使用しても、それが適用されるのは内側のループのみで、一気に外側のループから抜け出すことはできないということです。

ネストした繰り返しでbreak分野continue文を使用する際には、この仕様を意識してコーディングする必要があります。
また、一気に外側のループを抜け出したい(制御文を外側のループに適用したい)場合には、この後に紹介する「ラベル」を使用することで実現可能になります。

サンプルコード

public class Nest_loop_3 {
	public static void main(String[] args) {
		for(int i = 1 ; i <= 6 ; i++){
			for(int j = 1 ; j <= 6 ; j++){

				// jの値が奇数の時にcontinue(繰り返しを進めて先頭に戻る)
				if( j % 2 == 0){
					continue;
				}

				// jの値が5の時にbreak(繰り返しを強制終了する)
				if( j == 5 ){
					break;
				}

				// 上の2つの条件に当てはまらないときには、iとjの値が表示される
				System.out.println("i = "+ i +" , j = "+ j);

			}
			// jのループが終了すると表示
			System.out.println("----jのループ終了----");
		}
		// iのループが終了すると表示
		System.out.println("----iのループ終了----");
	}
}

実行結果

プログラムの流れとしては、iのループの中にjのループが入っており、jのループが6回終わるたびにiのループが1づつ進んでいき、それが6回繰り返されたら終了するという処理になっています。
そのループの中で、continue文とbreak文を入れて処理の流れを制御しています。
ここで注目するのは、continue文とbreak文がどちらもjのループの中に入っていることです。continue文やbreak文は最も近い繰り返しから抜け出すことができるものですので、今回の場合はjのループだけに適用されています。
ですので、continue文やbreak文によってjのループは途中で終了したりしていますが、iのループは最後まで実行されています。(jは1と3しか出力されていませんが、iは1から6まで出力されています)

ラベル

ネストされた繰り返しの中でbreak文やcontinue文を使用する際には、それらの処理は最も近い繰り返しに対して適用されました。
ですが、場合によっては内側の繰り返しの中の条件によって一気に外側の繰り返しから抜け出したいという状況が起こる場合があります。
そのような場合、「ラベル」を使用することで処理を実現することができます。

制御文とラベル

ネストされた繰り返しで、一気に外側のループに対してcontinue文やbreak文を適用したい場合、「ラベル」を使用します。
ラベルとは、繰り返しに対してつける名前のようなもので、break文やcontinue文を適用したい任意の場所に記載することができます。
break文やcontinue文を記述する際に、「continue ラベル名」「break ラベル名」と記述することで、ラベルを付けた任意のループから抜け出したり、ループを進めたりすることができます。
ラベルは以下のように記述します。

ラベル名:
for(外側のループの条件){
  for(内側のループの条件){
    処理;
    break ラベル名;(continue ラベル名;)
  }
}

具体的な処理のイメージは以下のようになります。

サンプルコード

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

		// ↓iのループに「outer」という名前のラベルを付ける
		outer:
		for(int i = 1 ; i <= 6 ; i++){
			for(int j = 1 ; j <= 6 ; j++){

				// jの値が奇数の時にcontinue(繰り返しを進めて先頭に戻る)
				if( j % 2 == 0){
					continue;
				}

				// jの値が5の時にbreak(「outer」のラベルの繰り返しを強制終了する)
				if( j == 5 ){
					break outer;
				}

				// 上の2つの条件に当てはまらないときには、iとjの値が表示される
				System.out.println("i = "+ i +" , j = "+ j);

			}
			// jのループが終了すると表示
			System.out.println("----jのループ終了----");
		}
		// iのループが終了すると表示
		System.out.println("----iのループ終了----");
	}
}

実行結果

プログラムの流れは、上で行ったものと同じで、iのループの中にjのループが入っており、jのループが6回終わるたびにiのループが1づつ進んでいき、それが6回繰り返されたら終了するという処理になっています。
その中に、continue文は先ほどと同じように普通通り記述して、break文はラベルを指定して記述しています。
ここで注目するのは、continue文は先ほどと同じようにjのループの中で適用されており、breakの条件になった際に、一気にiのループを終了しているということです。
「jのループ終了」という文字は出力されていませんが、外側のループが終了した場合、内側のループも終了します。

基本構文編・次回の内容

今回はfor文のネストと制御文を組みわせた解説してきました。
今回で基本構文編は終了になります。次回はこれまでの基本構文を利用した練習問題をアップする予定です。
今までの知識がしっかりと利用できるか腕試しとしてチャレンジしてみましょう。


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


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