Javaのwhile文・do-while文の違いとは?使い分けをやさしく解説
生徒
「Javaでループ処理を勉強していて、while文とdo-while文があるって知ったんですが、これって何が違うんですか?」
先生
「while文とdo-while文は、どちらも繰り返し処理を行うための制御構文ですが、条件チェックのタイミングが異なります。この違いを理解すると、状況に応じて使い分けができるようになりますよ。」
生徒
「条件チェックのタイミングですか?どういう意味なんでしょう?」
先生
「それでは、基本的な構文から順番に見ていきましょう!」
1. while文の基本的な構文と動作
Javaのwhile文は、条件式が真である限り、繰り返し処理を実行する制御構文です。最大の特徴は、ループ処理を実行する前に条件をチェックする点にあります。
while文の基本的な構文は次のようになります。
while (条件式) {
// 条件式がtrueの場合に実行される処理
}
条件式がtrueの間、中括弧内の処理が繰り返し実行されます。もし最初から条件式がfalseの場合、ループの中身は一度も実行されません。
実際の動作を確認してみましょう。次のサンプルコードは、カウンタ変数を使って1から5までの数値を出力するプログラムです。
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から始まり、5以下の間はループが継続されます。countが6になった時点で条件式がfalseになるため、ループを抜けて「ループ終了」が表示されます。
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文を使うことで、その性質が明確になります。
保守性の向上
適切な制御構文を選ぶことは、将来的なコードの保守性にも影響します。処理の意図が明確なコードは、後から見直したときや他の開発者が読んだときに理解しやすく、バグの発生を防ぐことにもつながります。