Javaプログラミング入門

9. 繰り返し

最終更新:

javatutorial

- view
管理者のみ編集可

繰り返しとは


「毎朝、歯を磨く」

「階段を1段ずつ上る」

「友達とじゃんけんを3回勝負する」
—— 私たちは日常の中で、同じ行動を何度も繰り返しています。

プログラムの世界でも、「同じ処理を何度も実行したい」ときがあります。
たとえば、「100回『Hello, World!』と表示する」「1から10までの合計を求める」「ゲームの敵キャラクターを毎秒動かす」など、繰り返しの処理が必要な場面はたくさんあります。

そこで登場するのが「繰り返し(ループ)」です。
繰り返しを使うと、同じコードを何度も書かなくても、指定した回数や条件に応じて自動で処理を繰り返してくれます。

while文


「お腹がいっぱいになるまでご飯を食べる」

「雨が止むまでカフェで時間をつぶす」

「ゲームのライフがなくなるまでプレイする」
——こうした「いつ終わるかわからない繰り返し」って、日常にたくさんありますよね?

プログラムの世界でも、「特定の条件を満たしている間は繰り返す」という場面がよくあります。
そこで登場するのがwhile文です。

記載方法

while文の記載方法は
while (条件式) {
} 
になります。
()の中に入る条件式は比較演算子や論理演算子を使用した式などになります。

例:もし1から3までの数字を順番に表示したい場合
サンプル:WhileSample.java
  1. public class WhileSample {
  2. public static void main(String[] args) {
  3. int counter = 0;
  4. while (counter < 3) {
  5. counter++;
  6. System.out.println(counter);
  7. }
  8. }
  9. }
出力結果
1
2
3 
このコードでは、counterが1から始まり、10未満の間は繰り返し処理を実行します。
counterが10になった時点で条件 i < 10 がfalseになるので、ループが終了します。

do-while文

do-while文は、「必ず1回は処理を実行する」という特徴を持ったループ処理です。

記載方法

do-while文の記載方法は
  1. do {
  2. // 繰り返し実行する処理
  3. } while (条件式);
になります。
下の()の中に入る条件式は比較演算子や論理演算子を使用した式などになります。
処理の流れとしては、繰り返す条件をチェックする前に処理を1回実行します。
そして、条件式を確認し、条件がtrueなら、もう一度処理を実行し、条件がfalseになったらループを終了します。
while文と違い、最後に;が必要になります。

以下が、while文とdo-while文の挙動の違いを示したサンプルです。
サンプル:WhileVsDoWhile.java
  1. public class WhileVsDoWhile {
  2. public static void main(String[] args) {
  3. int num = 10;
  4. System.out.println("【while の場合】");
  5. while (num < 5) {
  6. System.out.println("現在の値: " + num);
  7. num++;
  8. }
  9. num = 10; // 変数をリセット
  10. System.out.println("【do-while の場合】");
  11. do {
  12. System.out.println("現在の値: " + num);
  13. num++;
  14. } while (num < 5);
  15. }
  16. }
出力結果
while の場合】
【do-while の場合】
現在の値: 10 
このように、while文はnum < 5を最初にチェックするので、最初から繰り返す条件がfalseになり何もしません。
do-whileはとりあえず1回実行してからチェックするので、1回は必ず処理されることになります。

for文


体操でよく「腕を大きく10回振り回してください」とか「足を10回曲げて伸ばしましょう」
のようなフレーズを耳にします。
このように同じ動作を、決まった回数繰り返すことが、日常生活ではよくありますよね。
そこで登場するのがfor文です。
for文は、決まった回数を繰り返して実行するのに適した構文です。

記載方法

for文の記載方法は
for (初期化式; 条件式; 更新処理) {
    // 繰り返したい処理
} 
になります。

一つづつ説明していきます。

① 初期化式(最初の準備)
「よし!くり返す準備を整えるぞ!」というスタート地点。
最初の1回だけ実行されて、カウントをスタートする変数をつくります。
下の例だと「i = 0」になります。
ここで使う変数は、くり返しの回数を数える【カウンター】の役割を持ちます。
for (int i = 0; 条件式; 更新処理) {
    // 繰り返したい処理
} 
この変数「i」は、回数を数えるカウンターのような存在になります。
「i = 0」なら、「0回目からスタート」という意味になります。

② 条件式(くり返すかどうかの判断)

「まだくり返していいかな?」と毎回チェックする場所。
この条件が 「true(正しい)」の間はくり返しが続きます。
くり返しのたびに毎回チェックされる、いわば見張り役のような役割です。
for (int i = 0; i < 10; 更新処理) {
    // 繰り返したい処理
} 
この場合だと、iが10より小さい間(未満)、処理を繰り返します。

③ 更新処理(繰り返しのたびに変化)

「1回終わったから、カウンターを進めよう!」という場所。
毎回のくり返しのあとに実行され、変数の値を1つ進めたり、戻したりします。
たとえば「i++」でカウンターの役割である i を1つ増やします。
これがないと、カウンターが変わらず ずっと同じ条件でくり返しが終わらなくなることもあるので気を付けましょう。
また、更新処理には;が必要ありませんので気を付けるようにしてください
for (int i = 0; i < 10; i++) {
    // 繰り返したい処理
} 
この場合だと、1回繰り返すごとに、1ずつiが増えていきます

それでは、用意したカウンターの役割を持ったiを表示させて何か繰り返しているかを可視化してみましょう。
サンプル:ForSample.java
  1. public class ForSample {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < 10; i++) {
  4. System.out.println(i + 1 + "回目の繰り返し処理です");
  5. }
  6. }
  7. }
出力結果
1回目の繰り返し処理です
2回目の繰り返し処理です
3回目の繰り返し処理です
4回目の繰り返し処理です
5回目の繰り返し処理です
6回目の繰り返し処理です
7回目の繰り返し処理です
8回目の繰り返し処理です
9回目の繰り返し処理です
10回目の繰り返し処理です 

動作を一つづつ説明していきましょう。
まず、①初期化式の部分です。
【int i = 0】という記載で、「i」という数字の変数を作って、0からカウントがスタートするように設定していますね。
続いて、②条件式の部分です。
【li < 10】という記載で、iが10より小さい間(0~9)だけ、くり返しを続けるという条件を設けてるのがわかるかと思います。
続いて、③更新処理の部分です。
【i++】という記載で、繰り返しが1回終わるたびに、iの値を1増やすという処理が記載されています。
つまり、このfor文は、【i = 0 ~ 9までの10回】繰り返されます。

そして、繰り返し処理の中身の話です。
  1. System.out.println(i + 1 + "回目の繰り返し処理です");
これを普通にi + "回目の繰り返し処理です"と記載してしまうとiは0から始まっているので、0回目の繰り返し処理ですと出力されてしまいます。
そのため、1回目から出力されるように、【i + 1】をしているという訳です。

制御構文の入れ子


「制御構文の入れ子」とは、ある構文の中に別の構文が入っていることを言います。
たとえば、「for文の中にif文がある」「if文の中にfor文がある」などが入れ子の例です。
これは、ある条件のもとでさらに処理をくり返したい、あるいは判断したいといった場面でよく使います。
記載例:
  1. for (int i = 1; i <= 5; i++) {
  2. if (i % 2 == 0) {
  3. System.out.println(i + " は偶数です");
  4. }
  5. }
また、繰り返し文の中に、さらに繰り返し文を記載することも可能になります。
記載例:
  1. for (int i = 1; i <= 3; i++) {
  2. for (int j = 1; j <= 2; j++) {
  3. System.out.println("i = " + i + ", j = " + j);
  4. }
  5. }
この場合、結果として、全部で 3 × 2 = 6 回 内側のfor文による処理が実行されます。

もちろん、while文の入れ子の記載も可能です。
  1. int i = 1;
  2. while (i <= 3) { // 外側のループ(行)
  3. int j = 1;
  4. while (j <= 3) { // 内側のループ(列)
  5. System.out.print("行" + i + " 列" + j + " ");
  6. j++;
  7. }
  8. System.out.println(); // 改行
  9. i++;
  10. }

中断処理

break文

break文は、「くり返し処理を途中でやめる」ための文です。
サンプル:BreakSample.java
  1. public class BreakSample {
  2. public static void main(String[] args) {
  3. for (int i = 1; i <= 10; i++) {
  4. if (i == 5) {
  5. break; // iが5になったらループを終了
  6. }
  7. System.out.println("i = " + i);
  8. }
  9. }
  10. }
出力結果
i = 1
i = 2
i = 3
i = 4 
このように、iが5になった時にbreak文が実行され、そこでループが完全に終了します。
以降の繰り返し(i=5〜10)は行われません。

continue文

continue文は、「その回のくり返し処理をスキップして、次の回に進む」ための命令文です。
breakがループ自体を終了するのに対し、continueは「その1回だけを飛ばして、次のループに進む」ものになります。
サンプル:ContinueSample.java
  1. public class ContinueSample {
  2. public static void main(String[] args) {
  3. for (int i = 1; i <= 5; i++) {
  4. if (i == 3) {
  5. continue;
  6. }
  7. System.out.println("i = " + i);
  8. }
  9. }
  10. }
出力結果
i = 1
i = 2
i = 4
i = 5 
i == 3 のときに continue が実行され、「System.out.println() の行はスキップ」されます。
そのあとすぐ次のループ(i = 4)に進みます。

無限ループ

無限ループとは、終わりのないくり返し処理のことです。
ループの条件が「常に真(true)」であるため、ずっと終わらずに同じ処理を繰り返し続ける状態になります。
記載例:
while文で記載する場合
  1. while (true) {
  2. System.out.println("ずっと表示されます");
  3. }
for文で記載する場合
  1. for (;;) {
  2. System.out.println("ずっと表示されます");
  3. }
  1. for (int i = 0; ; i++) {
  2. System.out.println(i + "回目の繰り返しです");
  3. }
使いどころのイメージとしては
ユーザーが「終了」と言うまで動かし続けたいとき
常にセンサーの状態を監視し続けるシステム
ゲームなどで、常に描画と更新を繰り返すメインループ
などなど。。。
このように、あえて無限ループが必要な場面もあります。
ただし、ループの途中にbreakやreturnなどで抜ける条件を必ず用意しておく必要があります。

コラム

複数の初期化式と、更新処理

実は「変数を2つ以上使いたい時」に、初期化式や更新処理をカンマ(,)で区切って複数個使うことができます
  1. for (int i = 1, j = 9; i < 10; i++, j--) {
  2. System.out.println("i = " + i + ", j = " + j);
  3. }
このように、同じデータ型の変数であれば、初期化をカンマ(,)で区切ってまとめて書くことができます。
ただし、異なるデータ型の変数は、このようにまとめて書くことはできません。
※このような書き方は、コードの読みやすさ(可読性)を下げてしまうため、実際の開発現場では避けるのが一般的です。
わかりやすい書き方を心がけることが、チーム開発ではとても大切です。

for文の初期化式、条件式、更新処理にはメソッドを記載することもできます。

説明は準備中


ウィキ募集バナー