【Java】いつ終わるかわからない?「while文」で条件に合うまで繰り返そう!
はじめに
みなさんどうも、おげんです。
前回は、指定した回数だけきっちり繰り返す「for文」について学びました。
「10回スクワットする!」といった、ゴールが最初から見えている時には最強の武器でしたね。
でも、プログラミングをしていると、こんな場面に出くわすことがあります。
- 「敵のHPが0になるまで攻撃し続ける」
- 「正解のパスワードが入力されるまで、入力を求め続ける」
- 「お腹がいっぱいになるまで食べ続ける」
これらに共通するのは、「何回繰り返せば終わるのか、最初からはわからない」ということです。
「敵がいつ倒れるかなんて、やってみないとわからないよ!」
そんな、回数ではなく「状態」で繰り返しをコントロールしたい時に登場するのが、今回紹介する 「while(ホワイル)文」 です。
for文が「きっちり派」なら、while文は「粘り強派」。
この2つを使い分けられるようになると、あなたのプログラムはより柔軟で、より実戦的な動きができるようになります。
今回は、そんなwhile文の基本と、for文との賢い使い分けについて、解説していきます!
- 「回数が決まっていない繰り返し」をどう書けばいいか迷っている人
- for文とwhile文、どっちを使えばいいのか基準を知りたい人
- ゲームのような「イベントが発生するまで続く処理」を作りたい人
while文の基本形
while文の書き方は、実はif文とそっくりです。
while (条件式) {
// 条件が「true」の間、ずっと繰り返したい処理
}「while」は英語で「〜の間じゅう」という意味。
つまり、カッコの中の条件が満たされている(true)間は、Java君が「まだ終わっちゃダメだ!」と、中の処理をひたすらループし続けます。
実際のコードで見てみよう
例えば、「お腹がいっぱいになるまで(満腹度が100未満の間)食べる」という処理を書いてみると、こんな感じです。
int stomachFull = 0; // 現在の満腹度
while (stomachFull < 100) {
System.out.println("もぐもぐ…現在の満腹度:" + stomachFull);
stomachFull += 20; // 20ずつ増えていく
}
System.out.println("お腹いっぱい!ごちそうさまでした。");- シンプルさ:for文の様にカッコの中に「初期化」や「変化」を詰め込みません。
- 自由度:カッコの中には「条件」だけを書けばOK。
for文 vs while文:どっちを使う?
「どっちも『繰り返し』なら、全部for文(またはwhile文)でいいんじゃない?」
そう思うかもしれませんが、エンジニアは状況に合わせてこの2つを賢く使い分けています。
その判断基準はズバリ、「回数が最初から決まっているかどうか」です。
1. 回数指定なら「for文」
- 例: 腹筋を30回やる
- イメージ: 回数券を1枚ずつ使っていく感じ
- Java君への指示: 「1から始めて、1回ずつ増やして、30回になったら止めてね」
「あと何回」が明確なときは、カウントが得意なfor文の出番です。
2. 条件指定なら「while文」
- 例: 限界が来るまで腹筋をやる
- イメージ: タイマーを見ずに、体力が尽きるまで続ける感じ
- Java君への指示: 「『まだ限界じゃない』という状態である限り、ずっと続けてね」
「いつ終わるか予想がつかないけれど、ある条件を満たしたら止めたい」ときは、粘り強いwhile文の独壇場です。
現場での使い分けのコツ
実務では、以下のような使い分けがよく見られます。
- for文: 1週間の曜日(7回)を処理する、リストに入った10件のデータを全部表示する、など。
- while文: ユーザーが「終了ボタン」を押すまで待つ、正しいデータが入力されるまでやり直させる、など。
「数字で数えられるならfor、状態で決まるならwhile」と覚えておけば、まずは間違いありません。
最初は迷うかもしれませんが、コードを書いていくうちに「あ、ここはwhileの方がスッキリ書けるな」という感覚が自然と身についてきますよ!
私も転職活動の面接でこの違いについて問われました、ぜひ覚えておいてくださいね。
while文で絶対に忘れてはいけないこと
while文を使うとき、絶対に、何があっても忘れてはいけないルールが1つだけあります。
それは、「いつか必ず『条件がfalse』になるように、中身で仕掛けを作ること」です。
恐怖の「永遠に終わらないスクワット」
例えば、こんなコードを書いてしまったとします。
int energy = 100;
while (energy > 0) {
System.out.println("スクワット継続中!");
// ここでenergyを減らすのを忘れた!
}Java君はこう考えます。
「えーっと、energyは100だから、0より大きい(true)ね。よし実行!」
「次も、energyは100だね。よし実行!」
これ、永遠に終わりません。前回のfor文でも紹介した「無限ループ」の完成です。
無限ループを防ぐ「出口の鍵」
while文を書くときは、処理の最後に必ず「条件を動かす一行」をセットで書く癖をつけましょう。
while (energy > 0) {
System.out.println("スクワット継続中!");
energy -= 10; // ← これが「出口の鍵」!
}while文はfor文よりもシンプルで書きやすい分、この「出口の鍵」をうっかり書き忘れるミスが本当に多いんです。
while文を書くときは「まず while () { } を書いて、その中の一番下に脱出用のコード(i++ や flag = false など)を真っ先に書き込む」にするのがいいですね。
おまけ:とりあえず1回!「do-while文」
while文には、実はちょっと変わった兄弟がいます。
それが 「do-while(ドゥ・ホワイル)文」 です。
普通のwhile文は、最初に「条件に合ってるかな?」と確認してから処理に入ります。でも、do-while文は違います。
do {
// とりあえず1回は実行する!
} while (条件式); // 最後に確認「まずは動け!」の精神
do-while文の最大の特徴は、「条件がどうであれ、最初の1回は必ず実行される」 ということです。
例えば、「雨が降っていたら散歩に行かない」というルールがあるとします。
- while文:外を見て、雨なら一歩も出ない。
- do-while文:とりあえず外に飛び出してみて、そこで「あ、雨だ」と気づいて家に戻る。
どんな時に使うの?
一番わかりやすいのは 「ユーザーに何かを入力してもらう時」 です。
- まず、入力画面を出す(1回目)。
- 入力された内容が間違っていたら、もう一度繰り返す。
「まずは1回やらせてみて、ダメだったらもう1回!」という流れの時には、このdo-while文がピッタリなんです。
⚠️ セミコロンに注意!
ここ、初心者(と試験を受ける人)が一番間違えるポイントなのですが、do-while文の最後には ;(セミコロン) が必要です。
} while (条件式); // ここにセミコロンを忘れずに!普通のwhile文にはいらないのに、do-whileには必要。
これもJava君のちょっとしたワガママだと思って、セットで覚えてあげてくださいね(笑)。
まとめ:粘り強いwhile文を味方にしよう
今回は、条件が満たされるまで繰り返す「while文」について解説しました。
- while文は「回数が決まっていない時」の強い味方。
- 「数字で数えるならfor、状態で決まるならwhile」が使い分けの基本。
- 無限ループを防ぐために、処理の中に必ず「出口の鍵」を用意すること。
- とりあえず1回実行したい時は、兄弟分の「do-while文」の出番。
プログラミングを始めたばかりの頃は、「全部for文で書けそうだけど、なんでwhile文なんてあるんだろう?」と不思議に思うかもしれません。
でも、ゲームの「敵を倒すまで」や、Webアプリの「ログインに成功するまで」といったリアルな仕組みを作ろうとすると、このwhile文の「粘り強さ」がなくてはならないものだと気づくはずです。
for文(きっちり派)とwhile文(粘り強派)。 この2つの武器を状況に合わせて使い分けられるようになれば、あなたのコードはもっとプロっぽく、そして賢くなります!
今回も最後まで読んでいただき、ありがとうございました。 「繰り返し」をマスターすれば、Java君にどんどん仕事を任せられるようになりますよ。
いっぽずつ、一緒に進んでいきましょう!
