Developer

【はじめてのJava】基本構文のネスト【基本構文編】
2021.01.31
Lv1

【はじめてのJava】基本構文のネスト【基本構文編】

はじめてのJava

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


基本構文のネスト

プログラムの中でよく利用する「構文のネスト」について詳しく解説していきます。

前回の記事までに、条件分岐の構文としてif文やswitch文、繰り返しの構文としてfor文やwhile文、do-while文などを解説してきました。
今までは、それぞれを1つひとつ解説してきましたが、実際のプログラムでは組み合わせて使用するのがよくあります。
例えば、何かの繰り返し処理の中で条件によって処理を分岐させたい時などには、for文の中にif文を書いて使用したり、if文で条件分岐した先でさらにif文で条件分岐させたり、場合によっては繰り返し処理をさせたりなど、
使い方は多岐に及びます。
このような構文の中にさらに構文を入れるような書き方を「ネスト」と呼びます。

今回の記事では、その中でもよく使用される「for文などの繰り返し構文の中にif文をネストさせる」書き方を解説していきます。

目次


基本構文のネスト

プログラムの中で繰り返し処理を使用することはよくあります。
よく使用するパターンとしては、配列(1つの変数に複数のデータを保存したもの)に入ったデータを1つずつ順番に取り出す場合や、無限ループの構文を使用して、何かの操作が起こるまでは同じ処理をひたすら繰り返させるというようなものです。
その時に、取り出したデータによって操作を変更したい場合や、何かの処理が起こったことを条件に別の処理を行いたいということがあります。
そのような場合、for文の中にif文を書くことで処理を実現できます。

(例)for文で1から10までカウントする際に、奇数なら画面に表示する


for(int i = 1 ; i <= 10 ; i++ ){
	// ↓for文の中にif文を入れています。
	if( i % 2 == 1 ){
		
		System.out.println( i );
		
	}

}

このようにネストしたプログラムを書く際には、ネストしている構文をインデントをつけて内部に書いていきます。
インデントをつけることで、ネストしている場合でも処理の流れが読みやすくなります。


ネストで使用される繰り返しの制御構文

繰り返しの中にif文をネストさせてプログラムを書く際に、状況によっては、「〇〇の条件になったときに、繰り返しを強制的に終了したい」という場合や、「△△の条件になったときは、一時的に内部の処理を飛ばして繰り返しは継続したい」というような、
繰り返し処理の動作を制御したい場合があります。
(例)
何らかのデータを検索するためにfor文を使っている場合に、繰り返しの途中で該当するデータが見つかって、それ以降の処理は必要なくなった場合
繰り返し処理を使用してデータの更新処理を行う時に、更新しなくていいデータは飛ばして、更新したいデータのみで処理を行う場合など…

これらの繰り返し処理の制御を行う際には「break文」や「continue文」という文をプログラム中に書くことによって実現できます。
これらの文は、通常のfor文や、無限ループのfor文やwhile文などでよく使用されます。


break文

break文は、現在実行中の繰り返し処理を「強制的に終了させる」ことができます。
書き方は、プログラム内で「break;」を記述します。
先ほど紹介した例だと、データの検索中に、目的のデータが見つかった場合、その時点で検索処理を強制的に終了するといった処理を実現するのに有効です。

(例)for文で1から10まで画面に表示される際に、数字が5になったら強制的に繰り返し処理を終了する。

for(int i = 1 ; i <= 10 ; i++ ){
	
	// ↓for文の中にif文を入れており、数字が5になったらbreak文が実行され、強制的に繰り返しが終了する。
	if( i == 5 ){
		break;
	}
	
	System.out.println( i );
}
System.out.println("for文終了後");

上記のプログラムでは、数字が「1 2 3 4 」と出力されていき、iの数字が5になった時に繰り返しが終了します。
この時に注意することは、「break文に処理が移った場合、それ以降の繰り返しの中の処理をすべて無視して、強制的に繰り返しが終了する」ことです。
今回の場合は、iの値が5の場合の「System.out.println( i );」の処理は実行されずにfor文が強制終了されます。


continue文

continue文は、現在実行中の繰り返し処理のcontinue文の「後の処理を飛ばして、次の繰り返しを開始する」ことができます。
break文と違い、その時点で繰り返し処理を強制終了させることはありません。
書き方は、プログラム内で「continue;」を記述します。
先ほど紹介した例だと、繰り返し処理を使用してデータの更新処理を行う時に、更新しなくていいデータは飛ばして、更新したいデータのみで処理を行うといった処理を実現するのに有効です。

(例)for文で1から10まで画面に表示される際に、数字が3の倍数(3で割り切れる数)の時は表示せずに、最後まで繰り返しを行う。

for(int i = 1 ; i <= 10 ; i++ ){
	
	// ↓for文の中にif文を入れており、数字が3の倍数になったらcontinuek文が実行され、それ以降の処理が飛ばされて繰り返しが進む。
	if( i % 3 == 0 ){
		continue;
	}
	
	System.out.println( i );
}

上記のプログラムでは、数字が1から順に、3の倍数(3 , 6 , 9)を除く数字が出力されていきます。
iの値が3 , 6 , 9になるときは、if文の結果がtrueになりますので、continue文に処理が移ります。
continue文に処理が移ると、それ以降の処理(今回は「System.out.println( i );」の処理)が飛ばされ、次の繰り返しに移ります。
最終的に、for文の繰り返し条件の通り、iの値が10になるまで繰り返されます。


サンプルコード

for文とif文を利用したサンプルコードを見ていきます。

package java_silver;

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

		for (int i = 1; i <= 10; i++) { //iが1から10まで繰り返される

			//iが偶数の場合はcontinue処理(以降の処理を飛ばしてループの先頭へ)
			if (i % 2 == 0) {
				System.out.println("continue処理を行います。");
				continue;
			}

			//iが9になった場合にbreak処理(繰り返し処理を強制終了する)
			if (i == 9) {
				System.out.println("break処理を行います。");
				break;
			}

			//上記のどちらの条件にも当てはまらない場合は画面に表示する
			System.out.println("i = " + i);
		}

	}
}

実行結果

サンプルコードでは、1から10まで繰り返しを行っていく中で、iの値によってcontinue処理やbreak処理を行っています。
iの値が偶数の場合は、continue処理を行い、その後にある「System.out.println(i);」の処理を行わずにループの先頭に戻ります。(その時に「continue処理を行います。」と出力しています。)
繰り返し処理が進み、iの値が9になったときに、break処理が行われ、繰り返しが強制終了するので、「i = 9」の表示はされていません。

基本構文編・次回の内容

今回は繰り返し文の基本構文のネスト、break文とcontinue文について説明しました。
次回は、for文の中にさらにfor文をネストさせた場合の処理を解説します。


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


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