Javaのwhile文・do-while文の違いとは?使い分けをやさしく解説
生徒
「Javaでループ処理を勉強していて、while文とdo-while文があるって知ったんですが、これって何が違うんですか?」
先生
「while文とdo-while文は、どちらも繰り返し処理を行うための制御構文ですが、条件チェックのタイミングが異なります。この違いを理解すると、状況に応じて使い分けができるようになりますよ。」
生徒
「条件チェックのタイミングですか?どういう意味なんでしょう?」
先生
「それでは、基本的な構文から順番に見ていきましょう!」
1. while文の基本的な構文と動作
Javaのwhile文は、「条件が成り立っている間だけ、同じ処理を繰り返す」ための基本的な制御構文です。最大のポイントは、処理を実行する前に条件式をチェックする点で、条件に合わなければ最初から処理が行われません。
そのため、while文は「繰り返すかどうかを先に判断したい処理」に向いています。プログラミング未経験の方は、「条件を確認 → OKなら実行」という流れをイメージすると理解しやすいでしょう。
while文の基本的な構文は次のとおりです。
while (条件式) {
// 条件式がtrueの場合に実行される処理
}
条件式がtrueの間は、中括弧({ })の中に書かれた処理が何度も繰り返されます。反対に、条件式がfalseになると、その時点でループは終了します。最初から条件がfalseの場合は、ループ内の処理は一度も実行されません。
では、実際の動きをシンプルな例で見てみましょう。次のサンプルは、数字を1つずつ増やしながら画面に表示する、初心者向けのwhile文の例です。
public class WhileExample {
public static void main(String[] args) {
int count = 1;
while (count <= 5) {
System.out.println("カウント: " + count);
count++;
}
System.out.println("ループ終了");
}
}
このプログラムを実行すると、次のように表示されます。
カウント: 1
カウント: 2
カウント: 3
カウント: 4
カウント: 5
ループ終了
countは最初に1が代入され、条件式「count <= 5」がtrueの間は処理が繰り返されます。countが6になると条件がfalseになるため、while文を抜けて「ループ終了」が表示されます。このように、while文は回数や条件を管理しながら処理を繰り返す際の基本となる構文です。
2. while文で条件が最初からfalseの場合
while文の重要な特性として、条件が最初からfalseの場合、ループ内の処理は一度も実行されないという点があります。これは実務でも頻繁に遭遇する状況です。
例えば、次のコードを見てください。
public class WhileZeroExample {
public static void main(String[] args) {
int count = 10;
System.out.println("ループ開始前");
while (count < 5) {
System.out.println("この行は実行されません");
count++;
}
System.out.println("ループ終了後");
}
}
この場合、countは10から始まるため、条件式「count < 5」は最初からfalseです。そのため、ループ内の処理は一度も実行されません。
ループ開始前
ループ終了後
このように、while文では条件チェックが先に行われるため、条件を満たさない場合は処理がスキップされます。これは配列やリストが空の場合など、データが存在しない可能性がある状況で便利です。
3. do-while文の基本的な構文と動作
do-while文は、while文と似た繰り返し処理の制御構文ですが、重要な違いがあります。それは条件チェックがループの最後に行われるという点です。
do-while文の基本的な構文は次のようになります。
do {
// 最低1回は実行される処理
} while (条件式);
do-while文では、まず処理を実行してから条件をチェックします。そのため、条件式の結果に関わらず、必ず1回は処理が実行されるという特徴があります。
実際の動作を確認してみましょう。
public class DoWhileExample {
public static void main(String[] args) {
int count = 1;
do {
System.out.println("カウント: " + count);
count++;
} while (count <= 5);
System.out.println("ループ終了");
}
}
実行結果は先ほどのwhile文の例と同じになります。
カウント: 1
カウント: 2
カウント: 3
カウント: 4
カウント: 5
ループ終了
一見すると同じように見えますが、条件が最初からfalseの場合に大きな違いが現れます。
4. do-while文で条件が最初からfalseの場合
do-while文の最大の特徴は、条件が最初からfalseであっても、必ず1回は処理が実行される点です。これがwhile文との決定的な違いになります。
次のコードで確認してみましょう。
public class DoWhileZeroExample {
public static void main(String[] args) {
int count = 10;
System.out.println("ループ開始前");
do {
System.out.println("カウント: " + count);
count++;
} while (count < 5);
System.out.println("ループ終了後");
}
}
このプログラムでは、countが10から始まるため、条件式「count < 5」は最初からfalseです。しかし、do-while文では処理を実行してから条件をチェックするため、ループ内の処理が1回実行されます。
ループ開始前
カウント: 10
ループ終了後
このように、do-while文では条件に関係なく最低1回は処理が実行されることが保証されます。これは、ユーザーからの入力を受け付ける場合など、最低でも1回は処理を実行したい状況で非常に有効です。
5. while文とdo-while文の違いを比較表で理解する
while文とdo-while文の違いを表にまとめると、より理解しやすくなります。
| 比較項目 | while文 | do-while文 |
|---|---|---|
| 条件チェックのタイミング | ループの前に実行 | ループの後に実行 |
| 最低実行回数 | 0回(条件がfalseなら実行しない) | 1回(必ず実行される) |
| 条件が最初からfalseの場合 | ループ内の処理は実行されない | ループ内の処理が1回実行される |
| 構文の末尾 | セミコロン不要 | セミコロンが必要 |
| 使用頻度 | 比較的高い | 特定の状況で使用 |
この表からわかるように、最も重要な違いは条件チェックのタイミングと、それに伴う最低実行回数です。while文は条件を満たさない場合は全く実行されませんが、do-while文は少なくとも1回は実行されることが保証されます。
6. while文を使うべき場面
while文は、条件を満たさない場合は処理をスキップしたい場合に適しています。実務でよく見られる使用例をいくつか紹介します。
データが存在するかチェックしながら処理する場合
配列やリストの要素を処理する際、データが空の可能性がある場合にwhile文が有効です。データがなければ処理をスキップできます。
特定の条件が満たされるまで待機する場合
ファイルの読み込みが完了するまで待つ、ネットワーク接続が確立されるまで待つなど、条件が満たされるまで繰り返し確認する処理に適しています。
カウンタを使った繰り返し処理
指定回数だけ処理を繰り返す場合、while文を使うことができます。ただし、回数が明確な場合はfor文の方が読みやすいこともあります。
7. do-while文を使うべき場面
do-while文は、最低でも1回は処理を実行する必要がある場合に最適です。典型的な使用場面を見ていきましょう。
ユーザー入力を受け付ける場合
メニュー選択やデータ入力など、ユーザーからの入力を必ず一度は受け付ける必要がある場合、do-while文が理想的です。入力値が正しくない場合は再度入力を求めるというパターンでよく使われます。
ゲームのメインループ
ゲームプログラミングでは、最低でも1回はゲームの処理を実行してから、継続するかどうかを判断することが多いため、do-while文が適しています。
処理を実行してから結果を確認する場合
何らかの処理を実行し、その結果に基づいて繰り返すかどうかを判断する場合、do-while文が自然な記述になります。
8. 実践的な使用例:メニュー選択プログラム
do-while文の実践的な使用例として、簡単なメニュー選択プログラムを作成してみましょう。このような対話型プログラムでは、do-while文が非常に有効です。
import java.util.Scanner;
public class MenuExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("\n===== メニュー =====");
System.out.println("1. データ表示");
System.out.println("2. データ登録");
System.out.println("3. データ削除");
System.out.println("0. 終了");
System.out.print("選択してください: ");
choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("データを表示します");
break;
case 2:
System.out.println("データを登録します");
break;
case 3:
System.out.println("データを削除します");
break;
case 0:
System.out.println("プログラムを終了します");
break;
default:
System.out.println("無効な選択です");
}
} while (choice != 0);
scanner.close();
}
}
このプログラムでは、do-while文を使うことで、必ず1回はメニューが表示されます。ユーザーが0を選択するまで、メニュー表示と処理が繰り返されます。これをwhile文で書くと、最初のメニュー表示前に条件チェックが必要になり、コードが複雑になってしまいます。
9. よくある間違いと注意点
while文とdo-while文を使う際に、初心者がよく陥る間違いや注意すべき点を解説します。
無限ループに注意
条件式が永遠にtrueのままになる無限ループは、最も注意すべきエラーです。ループ内で条件を変化させる処理を忘れると、プログラムが終了しなくなります。
do-while文のセミコロン忘れ
do-while文では、while条件の後にセミコロンが必要です。これを忘れるとコンパイルエラーになります。while文にはセミコロンが不要なので、混同しやすいポイントです。
条件式の論理エラー
条件式の不等号の向きや論理演算子の使い方を間違えると、意図した回数だけループしなくなります。特に境界値の扱いには注意が必要です。
変数の初期化忘れ
カウンタ変数などを初期化せずに使用すると、予期しない動作になります。ループで使用する変数は必ず適切な値で初期化しましょう。
10. パフォーマンスと可読性の考慮
while文とdo-while文を選択する際は、機能的な違いだけでなく、パフォーマンスと可読性も考慮することが大切です。
パフォーマンスについて
実行速度の観点では、while文とdo-while文に大きな差はありません。コンパイラが最適化を行うため、どちらを選んでもパフォーマンスに影響はほとんどありません。したがって、パフォーマンスよりも処理の意図を明確に表現できる方を選ぶべきです。
可読性について
コードの可読性を高めるためには、処理の意図に合った制御構文を選ぶことが重要です。最低1回は実行する必要がある処理にdo-while文を使うことで、コードを読む人にその意図が明確に伝わります。逆に、条件次第でスキップする可能性がある処理にはwhile文を使うことで、その性質が明確になります。
保守性の向上
適切な制御構文を選ぶことは、将来的なコードの保守性にも影響します。処理の意図が明確なコードは、後から見直したときや他の開発者が読んだときに理解しやすく、バグの発生を防ぐことにもつながります。
まとめ
本記事では、Javaにおけるwhile文とdo-while文の違いについて、条件判定のタイミングという観点から丁寧に整理してきました。while文はループ処理の前に条件式を評価するため、条件が満たされない場合は一度も処理が実行されないという特徴があります。一方で、do-while文はループ処理の後に条件式を評価するため、必ず一度は処理が実行されるという点が大きな違いです。この基本的な仕組みを理解することで、プログラムの動作を正確にイメージできるようになります。
特に実務においては、データが存在するかどうか分からない場合や、条件次第で処理をスキップしたい場合にはwhile文が適しています。例えば配列やリストの要素を順番に処理する際、データが空であれば無駄な処理を避けることができるため、効率的なコードを書くことが可能になります。このようなケースでは、事前に条件をチェックするwhile文の特性が非常に役立ちます。
一方で、ユーザー入力やメニュー選択など、最低でも一度は処理を実行する必要がある場面ではdo-while文が適しています。ユーザーに選択肢を提示し、その入力結果に応じて処理を繰り返すようなプログラムでは、最初に必ず処理を実行するという性質が自然な流れを作ります。このように、処理の意図に応じて適切な制御構文を選択することが、可読性の高いコードを書く上で非常に重要です。
また、初心者がつまずきやすいポイントとして、無限ループや条件式の記述ミスがあります。例えば、ループ内で変数を更新しない場合、条件が常に真のままとなり、プログラムが終了しなくなることがあります。さらに、do-while文では末尾にセミコロンが必要である点も見落としやすいため、注意が必要です。これらのポイントを押さえておくことで、バグの少ない安定したプログラムを作成することができます。
パフォーマンスの観点では、while文とdo-while文に大きな違いはありません。そのため、どちらを選ぶかは処理の意図をどれだけ明確に表現できるかが重要な判断基準となります。コードは自分だけでなく他の開発者も読むものです。そのため、誰が見ても理解しやすい構造にすることが、長期的な保守性の向上につながります。
最後に、実際の開発現場ではwhile文の方が使用頻度は高いものの、do-while文が適しているケースも確実に存在します。両者の違いを正しく理解し、適材適所で使い分けることができれば、より実践的で質の高いプログラムを作成できるようになります。今回学んだ内容をもとに、ぜひ自分でもサンプルコードを書きながら理解を深めていきましょう。
理解を深めるサンプルコード
public class LoopComparisonExample {
public static void main(String[] args) {
int a = 0;
System.out.println("while文の例");
while (a > 0) {
System.out.println("この処理は実行されない");
}
int b = 0;
System.out.println("do-while文の例");
do {
System.out.println("この処理は一度だけ実行される");
} while (b > 0);
}
}
while文の例
do-while文の例
この処理は一度だけ実行される
生徒
「while文とdo-while文の違いって、最初はあまりピンと来なかったんですが、条件をチェックするタイミングが違うっていうのが大きなポイントなんですね。」
先生
「その通りです。while文は処理の前に条件を確認するので、条件を満たさなければ一度も実行されません。一方でdo-while文は処理の後に条件を確認するため、必ず一回は実行されるという特徴があります。」
生徒
「つまり、ユーザー入力みたいに一回は必ず処理したい場合はdo-while文を使うといいんですね。」
先生
「その理解で大丈夫です。逆に、データがあるかどうか分からない場合や、条件によっては処理をスキップしたい場合にはwhile文が適しています。」
生徒
「あと、無限ループになる原因も少し分かってきました。条件を変える処理を書かないと、ずっと繰り返されてしまうんですね。」
先生
「そうですね。ループ処理では変数の更新が非常に重要です。条件式と変数の変化をセットで考えるようにすると、ミスが減りますよ。」
生徒
「これからは、処理の流れを意識してwhile文とdo-while文を使い分けられるようにしていきます。」
先生
「それができれば、制御構文の理解はかなり深まっています。ぜひ実際にコードを書いて、感覚として身につけていきましょう。」