検索

キーワード


【Java】while文や for文などの反復処理(繰り返し構文)と breakや continueなどの反復制御の使い方!

  • 公開日:2020-09-18 06:28:45
  • 最終更新日:2021-01-25 17:26:21
【Java】while文や for文などの反復処理(繰り返し構文)と breakや continueなどの反復制御の使い方!



こんにちは。

駆け出しプログラマーの松倉です!

ここでは、反復処理(繰り返し構文)と制御の使い方ついて紹介・解説します。

プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 


関連記事リンク:【Java】if文?switch文? 条件分岐の追加方法など使い方を解説!【Java】コレクションとは?種類や特徴、ジェネリクスと基本構文の書き方【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!



反復処理

反復処理では条件を満たしている間、同じ処理を繰り返し行わせることができます。

反復処理では以下の構文が用意されています。

  • while文:条件を満たしている間、処理を実行する。
  • do-while文:while文と同じだが、最初の一回は必ず実行される。
  • for文:「n回の処理を実行する」に特化した反復処理。
  • 拡張 for文:「コレクションの要素についてすべて実行する」に特化した反復処理。

条件を満たしている間は同じ処理を何度も繰り返す場合や、条件を少しずつ変えて指定の回数だけ同じような処理を繰り返す場合には、for文やwhile文を使うことで簡潔にプログラムを記述することができます。



while文

「while文」はある条件が trueである間、同じ処理を繰り返すための構文です。

条件が変わらなければ処理が行われ続けますが、条件が falseになった時点で処理を終了します。

そのため条件が trueの場合は延々と処理を繰り返します。


whileの使い方

while (論理式) {
	処理;
}

論理式には結果が trueか falseとなるように記述します。


while文では書き方を間違えると無限ループが発生することがあります

ある条件が満たされている間、何回処理を行っても論理式が満たされなくなります。

そのためこのプログラムは永久に while文の反復処理を抜け出せなくなります。

このような状況を「無限ループ」と呼びます。

while文などの反復処理を書く場合、処理を抜けるための処理を書くことを忘れてはいけません。

※無限ループを含むプログラムを実行した場合でも、[Ctrl] + 「C」キー入力や、Eclipseの停止ボタンを押すことでプログラムを強制的に停止させることができます。


while文を使って答えが 10以上の条件式を満たすまで順番に数を足すサンプルコードを確認しましょう。

public class Sample1_1 {
	public static void main(String[] args) {
		int i = 1;
		int amount = 0;

		while (amount < 10) {
			System.out.println(amount + "に" + i + "を足します");
			amount = amount + i;
			i++;
		}
		System.out.println("合計は" + amount + "になりました。");
	}
}


実行結果:

01を足します
12を足します
33を足します
64を足します
合計は10になりました。

合計が 10になったため処理が終了しました。

while文の論理式によっては一度も処理が実行されない場合もあります。


次にSample1_1の論理式を「amount < 0」に変更します。

処理にどのような違いがあるかサンプルコードで確認しましょう。

public class Sample1_2 {
	public static void main(String[] args) {
		int i = 1;
		int amount = 0;

		while (amount < 0) {
			System.out.println(amount + "に" + i + "を足します");
			amount = amount + i;
			i++;
		}
		System.out.println("合計は" + amount + "になりました。");
	}
}


実行結果:

合計は0になりました。

論理式が最初から満たされていないため、while文の中の処理は一度も実行されませんでした。



do-while文

「do-while文」は while文に似ていますが、処理の仕方に少し違いがあります。

while文では初めから論理式が満たされていない場合、一度も処理が実行されませんでした。

しかし do-while文はどのような条件でも最低一度は処理が行われます

実際に do-while文は使われる機会が少ないものですが、違いについてはしっかりと理解しましょう。


do-while文の使い方

do {
	処理;
} while (論理式);

do-while文は「while(論理式)」の後に( ; )セミコロンが必要なので注意しましょう。


do-while文を使ったサンプルコードを確認しましょう

public class Sample2_1 {
	public static void main(String[] args) {
		int i = 1;
		int amount = 0;

		do {
			System.out.println(amount + "に" + i + "を足します");
			amount = amount + i;
			i++;
		} while (amount < 10);
		System.out.println("合計は" + amount + "になりました。");
	}
}


実行結果:

01を足します
12を足します
33を足します
64を足します
合計は10になりました。

合計が 10になったため処理が終了しました。

Sample1_1の while文と同じ動きをしています。


次に Sample2_1の論理式を「amount < 0」に変更します。

処理にどのような違いがあるかサンプルコードで確認しましょう。

public class Sample2_2 {
	public static void main(String[] args) {
		int i = 1;
		int amount = 0;

		do {
			System.out.println(amount + "に" + i + "を足します");
			amount = amount + i;
			i++;
		} while (amount < 0);
		System.out.println("合計は" + amount + "になりました。");
	}
}


実行結果:

01を足します
合計は1になりました。

合計に 1足された結果が出力されました。

Sample1_2の while文では処理は一度も実行されませんでした。

Sample2_2では do-while文では論理式は初めから満たされていませんでした。

しかし do-while文の中の処理が条件式よりも先に書かれているため処理が一度だけ行われています。

while文とdo-while文では処理にこのような違いがあります。



for文

ある条件であらかじめ決められた回数を繰り返す処理があります。

このような場合でも while文を使うことができますが、回数を条件に反復処理を行うことを明確にするために用意されているのが 「for文」です。

「n回繰り返す」という処理を作る場合、現在は何回目の処理を行っているかという状態をカウント用の変数で管理します。

for文と while文の違いはこの変数を構文の中で管理しているところです。


for文の使い方

for (変数の宣言と初期化; 論理式; 変数の更新) {
	処理;
}

最初に変数を初期化して条件式を確認にし、次の処理以降は変数を更新して条件式の確認を行います。


for文を使ったサンプルコードを確認しましょう。

public class Sample3_1 {
	public static void main(String[] args) {
		for (int i = 1; i <= 3; i++) {
			System.out.println("処理" + i + "回目");
		}
	}
}


実行結果:

処理1回目
処理2回目
処理3回目

forの括弧内の動作で「int i = 1」はカウンタ用の変数の初期化に相当し、最初に 1度だけ実行されます。

「i <= 3」は条件を満たすかどうかを評価し、条件を満たしている間、for文のブロック内の処理が実行されます。

「i++」はカウント用の変数を更新します。

このようにfor文では決められた回数分の反復処理を行うことができます。


繰り返す数が状況によって変わる for文の書き方があります。

Sample3_1では繰り返す回数に固定の数値を指定していました。

配列やコレクションの要素を参照したり操作したりする場合、その要素数に応じて繰り返す回数を動的に変化させるようにします。


配列を使った for文をサンプルコードで確認しましょう。

public class Sample3_2 {
	public static void main(String[] args) {
		String[] color = new String[3];
		color[0] = "赤色";
		color[1] = "青色";
		color[2] = "緑色";

		for (int i = 0; i < color.length; i++) {
			System.out.println(color[i]);
		}
	}
}


実行結果:

赤色
青色
緑色

「color.length」は配列に含まれる要素の数を返す式です。

Sample3_2では 3つの要素を準備しているので「color.length」は「3」と評価されます。

この値は配列の要素によって変わります。

これは後からでも配列の要素を追加することができるためとても便利です。

「i < 3」という書き方と比べると、これは for文を修正する必要がないためコードのミスを減らすことができます。

※for文のサンプルコードでは配列を扱っていますが、拡張 for文でも配列を扱うことができます。



拡張 for文

Javaには for文とは別に「拡張 for文」が用意されています。

拡張 for文はリストやマップのように配列やコレクションと呼ばれる複数の要素を持っているものから全ての要素に含まれる値に対する処理を 1つずつ行うとき時に使われます。


拡張 for文の使い方

for (要素の型名 変数名 : コレクションの変数名) {
	処理;
}

拡張 for文ではまず配列やコレクションの中に未処理の要素が存在するかどうかを調べます。

存在した場合は 1つ取り出し、変数に代入してから処理が実行されます。

全ての要素を処理すると拡張 for文の処理は終了します。


拡張 for文を使ったサンプルコードを確認しましょう。

import java.util.HashSet;

public class Sample4 {
	public static void main(String[] args) {
		HashSet<String> books = new HashSet<>();
		books.add("賢者の石");
		books.add("秘密の部屋");
		books.add("アズカバンの囚人");
		books.add("炎のゴブレット");

		for (String book : books) {
			System.out.println(book);
		}
	}
}


実行結果:

賢者の石
アズカバンの囚人
炎のゴブレット
秘密の部屋

配列を操作するときはfor文を使うことができました。

コレクションはリストを除いて「何番目の要素」という概念が存在しません。

そのためコレクションの中身を 1つずつ処理す場合には拡張 for文を使う必要があります。

実行結果の順序が異なって出る場合がありますが、コレクションの種類によって出てくる順番が異なります。



反復の制御

プログラムの反復処理を書く場合、処理の停止やある条件ではスキップして次の繰り返し処理を実行したい場合があります。

このような動作を行うときに使用されるのが 制御 です。

Javaでは 2つの制御が用意されています。

  • break:現在の処理を抜ける
  • continue:処理をスキップする

break

「break」は現在の処理を中断してループを抜けたいときに使います

ループ内のそれ以降の処理は行われませんが、ループ外の次の処理は行われます


breakを使ったサンプルコードを確認しましょう。

public class Sample5 {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			if (i == 3) {
				break;
			}
			System.out.println(i);
		}
		System.out.println("プログラムの終了");
	}
}


実行結果:

0
1
2
プログラムの終了

ループの途中、「i == 3」の時に breakが実行されます。

breakがない場合、変数 iは 4になるまで処理が行われます。

しかし breakがあることで処理が中断されました。

breakは現在の処理を中断するだけではなくループそのものが中断されます。



continue

「continue」は現在の処理をスキップして、ループを継続したいときに使います

breakはループ処理全体を終わらせてしまいますが、continueは残りの処理をスキップした後に次のループ処理を開始するという違いがあります。


continueを使ったサンプルコードを確認しましょう。

public class Sample6 {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			if (i == 3) {
				continue;
			}
			System.out.println(i);
		}
		System.out.println("プログラムの終了");
	}
}


実行結果:

0
1
2
4
プログラムの終了

ループの途中、「i == 3」の時に continueが実行されます。

continueは breakと同様に現在の処理をスキップするが、ループそのものは中断しません。

そのため「i == 3」の処理は実行されませんが、「i == 4」以降の処理は実行されます。


まとめ

この記事では反復処理(繰り返し構文)と制御について解説しました。

for文や while文を使う場合は条件を満たしたあとに必要のない処理を行わないように、breakや continueを組み合わせて制御する必要があります。

プログラムを書く上で繰り返し構文はよく使われ、使い方ひとつで様々なコードに応用することができます。

正しく使えるとコードを短縮できたり、可読性の向上につながります。

この記事でしっかりと使い方を覚えましょう!


関連記事リンク:【Java】if文?switch文? 条件分岐の追加方法など使い方を解説!【Java】コレクションとは?種類や特徴、ジェネリクスと基本構文の書き方【Java】たくさんのデータをまとめよう! 配列の基本と使い方を解説!

【著者】

松倉祥大

はじめまして。フォワードソフト株式会社の松倉です。
システムエンジニアとして働き始めたのが2020年4月です。経験や知識がない状態で入社した私は、フォワードソフトの教育研修で一からプログラミングの勉強をしました。教育研修を卒業後、Javaのプログラミングについて初学者向けの記事を共同で制作しています。
知識や経験はまだまだですが、これからいろんな職場で様々な経験しながら勉強していきたいと思っています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様