Java入門⑨ while文 ── 条件が続く間、くり返す

前回は「for文(決まった回数くり返す)」をやりました。

今回は、もうひとつのくり返し、while文(ホワイルぶん)です。for文との使い分けが分かると、くり返しの理解がぐっと深まります。

while文とは、「ある条件が成り立つ間、くり返す」しくみです。

for文と、何が違うのか

for文は「5回くり返す」のように、回数が決まっているくり返しが得意でした。

でも、世の中には「何回くり返すか、やってみないと分からない」ことがあります。

「正しいパスワードが入力されるまで、聞き続ける」
「合計が100を超えるまで、足し続ける」

これらは、回数ではなく「条件」でくり返しが決まります。こういうときに使うのが、while文です。料理でいうなら「とろみがつくまで、混ぜ続ける」。回数ではなく、状態で終わりが決まります。

書き方を見てみる

カウントが5になるまでくり返す例です。

int count = 0;

while (count < 5) {
    System.out.println(count);
    count++;
}

実行すると、0・1・2・3・4 が表示されます。

while (条件) {
    // くり返したい処理
}

while のカッコの中に、続ける条件を書きます。条件が true の間、{ } の中をくり返します。

  1. 「count(0)< 5?」→ true。中を実行。countを1増やす
  2. ……くり返す
  3. 「count(5)< 5?」→ false。終了

結果は、for文の例と同じです。

for文と、書き方をくらべてみる

同じ動きを、for文とwhile文で並べてみます。

// while文
int count = 0;
while (count < 5) {
    System.out.println(count);
    count++;
}

// for文
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

実は、for文は「カウンターを使ったwhile文」を、コンパクトにまとめた形なんです。

  • for文は、カウンターの準備・条件・増やすを1行にまとめている
  • while文は、それらをバラバラに書く

だから、回数が決まっているなら for文、条件しだいなら while文、と使い分けるのが自然です。

「やってみないと分からない」ときに、真価を発揮する

while文が本当に役立つ例です。第5回の Scanner と組み合わせます。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String answer = "";

        while (!answer.equals("おはよう")) {
            System.out.println("合言葉を入力してください");
            answer = scanner.nextLine();
        }

        System.out.println("正解です!");
    }
}

「おはよう」と入力されるまで、何度でも聞き続けます。1回で正解するかもしれないし、10回間違えるかもしれない。何回くり返すかは、やってみないと分からない。こういうとき、while文が活躍します。

!answer.equals("おはよう") は「answerがおはようでない間」。第6回でやった、文字列は equals でくらべるルールを使っています。先頭の ! は「〜でない」の意味です。)

つまずきポイント

for文と同じく、無限ループに注意です。

int count = 0;
while (count < 5) {
    System.out.println(count);
    // count++ を書き忘れている!
}

count++ を忘れると、count はずっと0のまま。「0 < 5」が永遠に true で、止まらなくなります

while文は、for文と違ってカウンターを増やす場所が決まっていません。だから「条件を false にする処理」を、自分で必ず中に入れる。これを忘れないようにしましょう。

まとめ

while文は、条件が成り立つ間くり返すしくみ。

while (条件) {
    // くり返したい処理
    // 条件をいつか false にする処理を忘れずに
}
  • 回数が決まっているなら for文
  • 条件しだい(何回か分からない)なら while文

次回は、くり返しを途中で「抜ける」「飛ばす」ための、break と continue です。