Javaの基礎知識(基礎編)

【Javaの基礎知識】繰り返し処理(for, while, do-while)を徹底解説!

Javaのプログラムでは、同じ処理を繰り返すことが多く、繰り返し処理(ループ構文)の理解は不可欠です。本記事では、for、while、do-while の使い方を徹底解説し、具体的なサンプルコードを交えてわかりやすく説明します。

繰り返し処理(ループ構文)とは?

プログラムでは、同じ処理を繰り返し実行する場面が多くあります。Javaでは、このような繰り返し処理を簡潔に記述するために「ループ構文」が用意されています。ループ構文を活用することで、コードの可読性や保守性が向上し、より効率的なプログラムを実装できます。

繰り返し処理の基本概念

繰り返し処理とは、プログラムにおいて、繰り返しておこなう処理のことです。「ループ(Loop)」処理とも呼ばれます。

繰り返し処理(ループ)は、条件が満たされるまで同じコードを実行する構文です。Javaでは、 forwhiledo-while の3種類が用意されています。

ループ構文の種類と特徴

プログラムでは、同じ処理を繰り返し実行する場面が多くあります。Javaでは、このような繰り返し処理を簡潔に記述するために「ループ構文」が用意されています。ループ構文を活用することで、コードの可読性や保守性が向上し、より効率的なプログラムを実装できます。

ループ構文の種類と特徴

ループ種類主な用途条件評価のタイミング使用可能バージョン
for回数が決まっている繰り返しループの開始時Java 1.0 以降
while条件が満たされている間の繰り返しループの開始時Java 1.0 以降
do-while最低1回は実行し、その後条件を評価ループの終了時Java 1.0 以降
forEachコレクションや配列の要素を順番に処理要素ごとに処理を実行Java 8 以降

for 文の基本と応用

for 文の基本構文

for 文は、繰り返す回数が決まっている場合に適しています。基本構文は以下の通りです。

for (初期化; 条件; 増減処理) {
    // 繰り返し処理
}

for文では、このセミコロン2つで、カッコ内部を3つに分けています。

ココがポイント

  • 最初の部分:変数の定義と初期化処理
  • 真中の部分:終了条件
  • 最後の部分:変数の更新処理

for文では最初に、セミコロンで分けられた前方の「初期化処理」が実行されます。続けて、セミコロンで分けられた中央の「終了条件に合致するか否か」が判断されます。

for文の条件判定

  • 終了条件の結果が真(True):for文を継続する
  • 終了条件の結果が偽(False):for文を終了する

判定条件が真の状態で処理を継続する場合、「波括弧内部({ })で囲まれた範囲」の処理が実行されます。これらの処理を実行した後、セミコロンで分けられた最後の、「変数の更新処理」がおこなわれます。 なお、ループに際して更新している変数を「カウンタ変数」といいます

for 文の具体例

以下の例では、0 から10 までのカウントを出力します。

上記は、1から10までの合計を求めて画面に表示するプログラムです。

1から10までの合計を求めるということは、for文で変数iの値を「1,2,3,4,5,6,7,8,9,10」と変化させていき、sumに加算していることが分かるでしょうか。

もう少し細かくfor文についてみていきましょう。

package org.pmisfbac.java.sample.ifandswitch;

/**
 * @author Beエンジニア
 */
public class Main {

    /**
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        int sum = 0;
        for ( int i = 1; i <= 10; i++ ) {
            sum += i;
        }
        System.out.println(sum);
    }
}

拡張 for 文(拡張forループ)

拡張 for 文(拡張forループ)は、配列やリストの要素を順番に取り出す場合に便利です。

int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
    System.out.println(num);
}

配列を使った応用例

クラス生徒のテスト結果データを元に、for文で内容を出力するプログラムを書いてみましょう。

下記のリストを配列に取り込みます。

氏名性別得点
黒沢 房男77
萩野 一樹74
武藤 彦好46
小山 保子60
下村 克86
小原 仁美46
桶口 雅栄65
藤岡 波子86
黒川 令47
石塚 織枝69
Javaで名前の配列を定義した例
Javaで性別の配列を定義した例
Javaで得点の配列を定義した例
このプログラムを実行すると、名前と性別に得点が出力される

このプログラムは、見た目通りなのでそこまで難しくないでしょう。配列へアクセスする際の添字として、for文で定義している変数「i」を用いています。なお、forの終了条件として「i < names.length」という記述をしています。

この「names.length」という記述は、配列「names」の要素数(文字数)を取得するものです。この例では、「names.length = 10」という値になります。

/**
 * @author Beエンジニア
 */
public class Main {

    /**
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        String[] names = new String[] { "黒沢 房男","萩野 一樹","武藤 彦好","小山 保子","下村 克","小原 仁美", "桶口 雅栄","藤岡 波子","黒川 令","石塚 織枝"};
        boolean[] sexes = new boolean[] {true,true,true,false,true,false,true,false,false,false};
        int[] scores = new int[] {77,74,46, 60, 86, 46, 65, 86, 47, 69};

        for ( int i = 0; i < names.length; i++ ) {
            System.out.print("氏名:" + names[i]);
            System.out.print("\t\t性別:" + sexes[i]);
            System.out.println("\t\t得点:" + scores[i]);
        }
    }
}

for文で配列の合計と平均を求める

次に、全体の合計を求めてみましょう。これはさきの例で紹介した「1から10の合計を求める」方法と共通します。

今回はiを直接合計するのではなく、配列の添字にiを指定して合計を求めます。そして、求めた合計を配列の要素数で割って、平均も求めましょう。

forで合計と平均を求める例。

package org.pmisfbac.java.sample.ifandswitch;

/**
 * @author Beエンジニア
 */
public class Main {

    /**
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        String[] names = new String[] { "黒沢 房男","萩野 一樹","武藤 彦好","小山 保子","下村 克","小原 仁美", "桶口 雅栄","藤岡 波子","黒川 令","石塚 織枝"};
        boolean[] sexes = new boolean[] {true,true,true,false,true,false,true,false,false,false};
        int[] scores = new int[] {77,74,46,60,86,46,65,86,47,69};
        int sum = 0;

        for ( int i = 0; i < names.length; i++ ) {
            sum += scores[i];
            System.out.print("氏名:" + names[i]);
            System.out.print("\t\t性別:" + sexes[i]);
            System.out.println("\t\t得点:" + scores[i]);
        }

        System.out.println("合計:" + sum);
        System.out.println("平均:" + sum / names.length);
    }
}

for文とcontinue文

次に、continueを使って、男性のデータのみを処理してみましょう。( continueについては後述します。)

for文では、「continue」文を使うことで、処理を途中でスキップして次のループ処理へ継続(=continue)することができます。

特定のデータを読みとばす場合、continue文を使う

ここで注目するのは、sexes[i]の値がfalseの場合という条件を書いていることです。この条件が成り立つということは、要は女性のデータということです。女性のデータの場合、sumなどを計算をせず処理を飛ばして、次のデータを処理させます。

package org.pmisfbac.java.sample.ifandswitch;

/**
 * @author Beエンジニア
 */
public class Main {

    /**
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        String[] names = new String[] { "黒沢 房男","萩野 一樹","武藤 彦好","小山 保子","下村 克","小原 仁美","桶口 雅栄","藤岡 波子","黒川 令","石塚 織枝"};
        boolean[] sexes = new boolean[] {true,true,true,false,true,false,true,false,false,false};
        int[] scores = new int[] {77,74,46,60,86,46,65,86,47,69};
        int sum = 0;

        for ( int i = 0; i < names.length; i++ ) {
            if (sexes[i] == false) {
                continue;
            }

            sum += scores[i];
            System.out.print("氏名:" + names[i]);
            System.out.print("\t\t性別:" + sexes[i]);
            System.out.println("\t\t得点:" + scores[i]);
        }

        System.out.println("合計:" + sum);
        System.out.println("平均:" + sum / names.length);
    }
}

for文とbreak文

最後の例として、男性の成績を先頭から3件のみピックアップする処理を書いてみましょう。( breakについては後述します。)

これには「break文」を用いて、ループ処理を途中で終了すると楽です。

ループ処理を途中で終了するには、break文を使う

まず、新たに「malesCount」という変数が追加されています。この変数には、処理した男性の人数が格納されます。最初は誰も処理していないので、0が設定されています。

ループ内部では、女性のデータはcontinue文によってスキップされます。これにより、continue文の付いたif文の後ろに来るのは、男性のデータを処理するときのみになります。

そこで、男性のデータの場合malesCountを1増やします。この結果が3未満であればそのまま処理し、3以上の場合はbreak文を用いてループ処理自体を終了します。

package org.pmisfbac.java.sample.ifandswitch;

/**
 * @author Beエンジニア
 */
public class Main {

    /**
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        String[] names = new String[] { "黒沢 房男","萩野 一樹","武藤 彦好","小山 保子","下村 克","小原 仁美","桶口 雅栄","藤岡 波子","黒川 令","石塚 織枝"};
        boolean[] sexes = new boolean[] {true,true,true,false,true,false,true,false,false,false};
        int[] scores = new int[] {77,74,46,60,86,46,65,86,47,69};
        int sum = 0;
        int malesCount = 0;

        for ( int i = 0; i < names.length; i++ ) {
            if (sexes[i] == false) {
                continue;
            }

            malesCount++;
            if (malesCount > 3) {
                break;
            }

            sum += scores[i];
            System.out.print("氏名:" + names[i]);
            System.out.print("\t\t性別:" + sexes[i]);
            System.out.println("\t\t得点:" + scores[i]);
        }

        System.out.println("合計:" + sum);
        System.out.println("平均:" + sum / names.length);
    }
}

while 文の基本と応用

プログラムにおいて、特定の条件が満たされている間、同じ処理を繰り返し実行したい場合があります。そのような場合に使用するのが while 文です。 while 文は、ループの開始前に条件を評価し、条件が true の間、処理を継続します。
この仕組みにより、ループ回数が事前に決まっていない処理や、ユーザーの入力を待つ処理などに適用できます。

while 文の基本構文

while 文は、条件が満たされている間ループを実行します。

while (条件) {
    // 繰り返し処理
}

while 文の具体例

以下の例では、0 から 4 までのカウントを出力します。

int count = 0;
while (count < 5) {
    System.out.println("現在のカウント: " + count);
    count++;
}

無限ループと抜ける方法

while (true) を使うと無限ループが発生しますが、break を使用して終了できます。

int num = 0;
while (true) {
    System.out.println("カウント: " + num);
    if (num == 5) {
        break;
    }
    num++;
}

do-while 文の基本と応用

do-while 文の基本構文

do-while 文は、最低1回は実行されるループです。通常の while 文とは異なり、ループ処理を1回実行した後に条件を評価します。そのため、最初の処理が必ず実行されるという特徴があります。

do {
    // 繰り返し処理
} while (条件);

do-while 文の具体例

以下の例では、0 から 4 までのカウントを出力します。

int count = 0;
do {
    System.out.println("現在のカウント: " + count);
    count++;
} while (count < 5);

do-while 文と while 文の違い

do-while 文と while 文の大きな違いは、ループの実行回数と条件評価のタイミングにあります。

種類実行回数条件評価のタイミング
while0回以上ループの開始時
do-while1回以上ループの終了時

break と continue の活用

breakcontinue は、 forwhiledo-while のすべてのループで使用可能な制御文です。

break は、ループ処理を強制終了するために使用されます。ループ内の特定の条件が満たされた場合、 break によってループを途中で終了し、ループの外に処理が移動します。

一方、 continue は、現在のループの処理をスキップし、次の繰り返しに移るために使用されます。これにより、特定の条件を満たした場合に、その回の処理を飛ばしつつ、ループ自体は継続することができます。

以下のループ構文で、 breakcontinue の動作を確認できます。

  • for 文: ループ内で特定の条件に達したら break で終了、または continue で次のループへスキップ。
  • while 文: ループの途中で条件を判定し、 break で終了、 continue で次の判定へ進む。
  • do-while 文: ループの終了条件を満たすまで実行するが、 break で即時終了、 continue で次のループを開始可能。

これにより、ループの動作を柔軟に制御でき、より効率的なプログラムの実装が可能になります。

break を使ってループを終了する

break を使うと、特定の条件を満たした時点でループを強制終了することができます。これにより、不要なループの繰り返しを防ぐことができます。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println(i);
}

continue を使って次の繰り返しへ

continue を使うと、特定の条件を満たした場合に、その回の処理をスキップして次のループへ進むことができます。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;
    }
    System.out.println(i);
}

break と continue は単純だけど超重要

breakcontinue の使い方は、コーダーのスキルを測る重要なポイントの一つです。これらの制御文は単純なように見えますが、ロジックの流れをどう設計しているか が直感的に表れます。

Java コードレビューで最初に見るべき理由

Javaのコードレビューでは、最初に breakcontinue の使い方を確認すると、そのコーダーのスキルレベルが見えてきます。
多くのプログラマーは ifswitch などの条件分岐には意識を向けますが、ループ制御の最適化に欠かせない break や continue を適切に使えていない ケースが少なくありません。
これらの制御文を適切に活用できるかどうかは、コードの最適化や可読性向上に直結します。
以下に、なぜ最初にチェックすべきなのか を解説します。

① 無駄なループ処理をしていないか

  • continue を適切に使えている人は、不要な処理をスキップし、無駄な計算を減らす意識 がある。
  • 逆に、 continue を使わずに if のネストが深くなっているコードは、可読性が悪く、リファクタリングが必要
  • 初学者ほどこのパターンが多い!

② break の適切な使い方ができているか

  • ループの途中で明確に抜けるべき場面を理解しているかがわかる。
  • 無駄に最後までループを回している場合は、処理の最適化意識が低い。
  • 無駄な処理はパフォーマンス劣化につながるため、ここを適切に制御できるかが重要。
  • 初学者はこの認識が薄いことが多い!

③ return の使い方と合わせて、コードの流れを把握

  • breakcontinue を適切に使えている人は、return の使い方もスマート
  • 逆に、 return で処理を終了させるべきところを break で無理に制御していると、コードの意図がブレる
  • 不要な break を連発しているコードは、コード設計の経験不足 が見える。

結論

  • break・continue の使い方を見るだけで、コーダーの思考レベルがわかる。
  • 適切に使う人は、不要な処理を減らせる=最適化意識が高い。
  • return の使い方もチェックすると、コーダーの全体的なスキルが透けて見える。

だから、SEがコードレビューをする際に「まず break と continue を見る」のは理にかなっています。 

まとめ

繰り返し処理(ループ構文)は、プログラムを効率的に記述するために不可欠な要素です。本記事では、 forwhiledo-while の基本構文と具体例を解説しました。さらに、 breakcontinue を活用して、より柔軟なループ処理を実現できます。

適切なループ構文を選び、効率的なコーディングを目指しましょう!

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Javaの基礎知識(基礎編)