Javaのfor文は、特定の回数だけ繰り返し処理を行うための構文です。ループの開始から終了までの手順を簡潔に記述できる、頻繁に利用される構文の1つ。どのプログラミング言語でも共通して、繰り返し処理は一般的かつ重要な要素です。
Javaにはループ処理を行うための様々な方法がありますが、その中でもfor文は最も基本的な構文の1つ。本記事では、初心者の方でも理解しやすいように、Javaのfor文について1からわかりやすく丁寧に解説します。
for文の基本的な構文から実際の使用例、そしてよくあるパターンや注意点までを網羅しています。
関連 Javaの1stステップ:基本的な構文ルールを復習する
for文の基本構文
Javaのfor文の構文ルールは以下の通り。
for (初期化; 条件式; 更新処理) { 処理内容 }
そして超・簡単なサンプルコードがこちら。
for (int i = 0; i < 10; i++) { System.out.println(i); }
これだけだと何を書いているかいまいち理解しきれないと思いますので、1個ずつ丁寧に説明していきます。
for文:初期化
ループを始める前に1度だけ実行される部分。ここでは、一般的にカウンタ変数(繰り返し回数を数える変数)の初期値を設定します。以下の例だと、変数iは0の値で初期化されます。
int i = 0;
for文:条件式
ループが実行される条件。以下は変数iが10未満の場合に実行されるということを表します。
i < 10;
for文:更新処理
ループが1回実行されるたびに実行される部分です。通常、カウンタ変数の値を増やしたり減らしたりします。
以下の例では、ループが1回実行されるたびに変数iの値が+1されます。
i++;
for文:処理内容
ループの中で繰り返し実行される処理を記述します。
System.out.println(i);
これらを組み合わせると、以下のようになります。
for (int i = 0; i < 10; i++) { System.out.println(i); }
↑のコードは、ループを開始する前に変数iを0に初期化(int i = 0;
)。iが10未満であるかを条件式でチェックし(i < 10
)条件がtrueであればループを続けます。同様に繰り返し処理を続けた後、再び条件式をチェックし、条件がfalseになったタイミングでループを終了する、という仕組み。
このように、決まった処理を何度か繰り返して行いたい場合に便利なものがfor文です。
for文のよくある使い方と注意点・利点
基本的な構文ルールを学んだところで、より実践的なコードを見ていきながらfor文を利用する際の注意点やメリットなどを1個1個確認していきます。
サンプルコード1 カウンタ変数を使ったループ
for (int i = 0; i < 5; i++) { System.out.println("繰り返し回数: " + i); } // 繰り返し回数: 0 // 繰り返し回数: 1 // 繰り返し回数: 2 // 繰り返し回数: 3 // 繰り返し回数: 4
このコードは、i
が0から始まり、i
が5未満の間(0から4まで)、i
を1ずつ増やしながらループを繰り返します。各ループでi
の値を表示します。
for文の大きな利点が、初期値や条件/増減値を自由に設定できるということ。例えば、i
を2ずつ増やしたり、逆に減らしたりすることも可能です。また、ループの開始から終了までの流れが一目でわかりやすいように記述されているのも大きなメリットです。
ただし、条件式が間違っていると無限ループになる可能性がある点に注意しましょう。例えば、i
を増やす部分を忘れると、i
が永遠に0のままになり、無限ループに陥ります。
↓無限ループの例
for (int i = 0; i < 5;) { System.out.println("無限ループ"); }
サンプルコード2 配列の要素を処理する
int[] numbers = {1, 2, 3, 4, 5}; for (int i = 0; i < numbers.length; i++) { System.out.println("配列の要素: " + numbers[i]); } // 配列の要素: 1 // 配列の要素: 2 // 配列の要素: 3 // 配列の要素: 4 // 配列の要素: 5
こちらは、配列numbers
の各要素にアクセスしてその値を表示するサンプルコード。i
が0から始まり、i
が配列の長さ未満の間(0から4まで)、i
を1ずつ増やしながらループを繰り返します。
配列と組み合わせてfor文を利用する方法はよくある使い方の1つで、これはi < numbers.length
という記述がポイント。配列の全ての要素を処理しつつ、無限ループなどのリスクを低減させることができます。
ただし、条件式を間違えると範囲外の要素にアクセスしてエラーが発生します。例えば、次のコードではi <= numbers.length
となっているため、範囲外アクセスが発生します。
for (int i = 0; i <= numbers.length; i++) { // エラー System.out.println(numbers[i]); }
拡張for文(for-eachループ)
拡張for文(for-eachループ)は、配列やコレクションの全ての要素を簡単に処理するための構文です。通常のfor文よりもシンプルで、配列やコレクションの要素を順番に取り出して処理を行うのに適しています。
for (要素の型 要素の変数名 : 配列やコレクション) { 処理内容 }
例えば、整数の配列numbers
があるとします。この配列の各要素を表示するコードは以下のようになります。
int[] numbers = {1, 2, 3, 4, 5}; for (int number : numbers) { System.out.println("配列の要素: " + number); } // 配列の要素: 1 // 配列の要素: 2 // 配列の要素: 3 // 配列の要素: 4 // 配列の要素: 5
for
の後に続く部分が、通常のfor文と少し違います。int number
という部分は、配列numbers
の各要素を受け取るための変数を宣言しています。: numbers
は配列numbers
全体を指定しており、結果として括弧内の部分は「配列numbers
の各要素を順にnumber
という変数に取り出してループを実行する」という意味になります。
for-eachループは通常のfor文よりも簡潔でコードが短くなるだけでなく、インデックスを気にする必要がなく、配列やコレクション全体を処理するのに適しています。また、範囲外アクセスの心配がありません。通常のfor文でインデックスを間違えると、範囲外の要素にアクセスしてエラーが発生する可能性がありますが、拡張for文ではその心配がありません。
サンプルコード 拡張for文
import java.util.ArrayList; import java.util.List; public class ForEachExample { public static void main(String[] args) { // リストの作成と初期化 List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.add("Cherry"); fruits.add("Date"); fruits.add("Elderberry"); // 拡張for文を使ってリストの要素を表示 for (String fruit : fruits) { System.out.println("果物の名前: " + fruit); } } } // 果物の名前: Apple // 果物の名前: Banana // 果物の名前: Cherry // 果物の名前: Date // 果物の名前: Elderberry