Javaのfor文は、プログラミング学習で多くの人が最初につまずきやすいポイントの一つです。しかし、一度使い方を覚えてしまえば、あらゆる場面で役立つ強力な武器になります。
この記事では、for文の基本から応用的なテクニック、そして初心者が陥りがちな注意点まで、豊富なサンプルコードと共に解説します。
この記事で学べること
- Javaの基本的なfor文の書き方と仕組み
- コードが簡潔になる拡張for文の使い方
- 二重ループやbreak、continueといった応用テクニック
- 初心者がやりがちなミスとその対策
- 他の繰り返し処理(while文)との使い分け
まずは基本!Javaのfor文とは?
この章では、Javaのfor文がどのようなもので、なぜ学習する必要があるのかを解説します。繰り返し処理の基本をここで押さえましょう。
- for文は「繰り返し処理」の王様
- なぜfor文を学ぶ必要があるの?
for文は「繰り返し処理」の王様
プログラミングでは、同じような処理を何度も実行したい場面が頻繁にあります。例えば、「リストにある全商品の値段を計算する」「挨拶を10回表示する」といったケースです。
このような定型的な繰り返し作業を自動化するのが「ループ処理」や「繰り返し処理」と呼ばれる仕組みです。Javaにはいくつかのループ処理の方法がありますが、特に「決まった回数」を繰り返す処理で最もよく使われるのがfor文です。
なぜfor文を学ぶ必要があるの?
for文を学ぶことは、プログラマーとしての第一歩と言っても過言ではありません。なぜなら、ほとんどのプログラムでデータ処理の基本となるからです。
例えば、大量の顧客データを一件ずつ処理したり、毎日の売上を集計したりと、実務ではfor文がなければ成り立たない処理が無数にあります。for文を使いこなせるようになると、書けるプログラムの幅が格段に広がるでしょう。
Javaのfor文の基本的な書き方【サンプル付き】
ここでは、Javaにおける最も基本的なfor文の構文を、3つの構成パーツに分解して解説します。実際のサンプルコードを見ながら、その動きを理解していきましょう。
- 構文を3つのパーツに分解しよう
- ① 初期化式:ループの始まりを決める
- ② 条件式:ループを続けるか決める
- ③ 変化式:ループごとに変数を変える
構文を3つのパーツに分解しよう
Javaの基本的なfor文は、次の3つのパーツをセミコロン(;)で区切って記述します。
for (初期化式; 条件式; 変化式) { // 繰り返したい処理 }
これら3つの式が連携して、ループの開始から終了までを制御する仕組みになっています。一見複雑に見えるかもしれませんが、それぞれの役割はとてもシンプルです。下の図解で動きのイメージをつかんでください。
【for文の実行順序】 for ( ①初期化式 ; ②条件式 ; ④変化式 ) { // ③繰り返す処理 } 実行の流れ: ① → ②(true) → ③ → ④ → ②(true) → ③ → ④ ... → ②(false)で終了
① 初期化式:ループの始まりを決める
初期化式は、ループが始まる前に一度だけ実行される部分です。ループの中で使う変数を宣言し、初期値を設定するためによく利用されます。
一般的には、ループ回数を数えるためのカウンタ変数をここで用意します。`int i = 0;` のように、整数型の変数 `i` を宣言して0を代入するのが定番の書き方です。
// カウンタ変数 i を宣言し、0で初期化する for (int i = 0; 条件式; 変化式) { // ... }
② 条件式:ループを続けるか決める
条件式は、ループを続けるかどうかを判断するための部分です。ここの条件が `true` (真) である間、ループ内の処理が繰り返されます。条件が `false` (偽) になった時点で、ループは終了します。
例えば `i < 5;` と書いた場合、「変数iが5未満である間」ループを続ける、という意味になります。
// i が 5 より小さい間、ループを繰り返す for (int i = 0; i < 5; 変化式) { System.out.println("現在のiの値: " + i); }
実行結果
現在のiの値: 0 現在のiの値: 1 現在のiの値: 2 現在のiの値: 3 現在のiの値: 4
③ 変化式:ループごとに変数を変える
変化式は、ループ内の処理が一通り終わるたびに実行される部分です。主に初期化式で用意したカウンタ変数の値を更新するために使われます。
`i++` と書くと、「変数iの値を1増やす」という意味になります。この変化式があるおかげで、ループは少しずつ終了条件に近づいていき、いずれ条件式が `false` になってループが停止します。
// ループが1周するごとに i の値を 1 ずつ増やす for (int i = 0; i < 5; i++) { System.out.println((i + 1) + "回目の処理です。"); }
実行結果
1回目の処理です。 2回目の処理です。 3回目の処理です。 4回目の処理です。 5回目の処理です。
もっと便利に!Javaの拡張for文(for-each)を使ってみよう
Javaには、基本的なfor文をさらに簡潔に書ける「拡張for文」があります。特に配列やリストといったデータの集まりを扱う際に非常に役立ちます。その使い方と、基本のfor文との使い分け方を学びましょう。
- 拡張for文のシンプルな書き方
- 配列やリストで大活躍!
- 基本的なfor文との使い分けは?
拡張for文のシンプルな書き方
拡張for文は、別名「for-each文」とも呼ばれます。その構文は以下の通りです。
for (要素の型 変数名 : 配列やコレクション) { // 配列などから取り出した1つの要素に対する処理 }
カウンタ変数(`i`など)の初期化や更新が不要で、配列などの要素を先頭から順に1つずつ取り出して処理することに特化しています。これにより、コードがシンプルになり、バグも発生しにくくなります。
配列やリストで大活躍!
例えば、文字列の配列に入っているフルーツの名前を一つずつ表示する処理を考えてみましょう。
基本的なfor文で書く場合
String[] fruits = {"りんご", "ばなな", "みかん"}; // カウンタ変数 i を使って配列の要素にアクセスする for (int i = 0; i < fruits.length; i++) { System.out.println(fruits[i]); }
拡張for文で書く場合
String[] fruits = {"りんご", "ばなな", "みかん"}; // 配列 fruits から要素を1つずつ取り出して変数 fruit に格納する for (String fruit : fruits) { System.out.println(fruit); }
どちらも実行結果は同じですが、拡張for文の方がはるかに短く、直感的に書けるのが分かります。
実行結果
りんご ばなな みかん
基本的なfor文との使い分けは?
拡張for文は非常に便利ですが、万能ではありません。基本的なfor文と適切に使い分けることが重要です。
使い分けのポイント
- 拡張for文が向いているケース
配列やリストの全要素に対して、順番に同じ処理を行いたい場合。 - 基本的なfor文が必要なケース
処理中にインデックス番号(何番目の要素か)を使いたい場合。
配列の要素を逆順に処理したい場合。
複数の配列を並行して処理したい場合。
単純に全要素を読み取るだけなら拡張for文、インデックスを使った複雑な操作が必要なら基本的なfor文、と覚えておくと良いでしょう。
Javaのfor文でできる色々なこと
for文の基本が分かったところで、次に応用的な使い方を見ていきます。ループを入れ子にする「二重ループ」や、ループの途中で処理の流れを変える`break`文と`continue`文について解説します。
- for文で配列の中身を全部見てみよう
- 九九の表も作れる!二重ループ(多重ループ)の使い方
- ちょっと休憩?ループを途中で抜ける「break」
- 今回はスキップ!処理を飛ばす「continue」
for文で配列の中身を全部見てみよう
配列とfor文の組み合わせは、Javaプログラミングの基本中の基本です。例えば、テストの点数が格納された配列から、合計点と平均点を計算するプログラムを作ってみましょう。
int[] scores = {88, 92, 75, 100, 69}; int sum = 0; // 合計点を保存する変数 // 拡張for文で配列の要素を1つずつ取り出す for (int score : scores) { sum += score; // sum = sum + score と同じ意味 } // 平均点を計算 (合計点 / 教科数) // doubleにキャストしないと小数点以下が切り捨てられる double avg = (double)sum / scores.length; System.out.println("合計点: " + sum); System.out.println("平均点: " + avg);
実行結果
合計点: 424 平均点: 84.8
このように、for文を使えば、データが何件あっても同じロジックで集計処理を実装できます。
九九の表も作れる!二重ループ(多重ループ)の使い方
for文の中に、さらに別のfor文を記述することを「二重ループ」または「多重ループ」と呼びます。これを使うと、表形式のデータ処理などが可能になります。代表的な例が九九の表の作成です。
// 外側のループ (1の段から9の段まで) for (int i = 1; i <= 9; i++) { // 内側のループ (かける数を1から9まで) for (int j = 1; j <= 9; j++) { // i * j を計算して、書式を整えて表示 System.out.printf(" %2d", i * j); } // 1つの段が終わったら改行 System.out.println(); }
外側のループが1回進むごとに、内側のループが最後まで実行されるのがポイントです。`i`が1のとき、`j`が1から9まで動き、次に`i`が2になって、また`j`が1から9まで動く、という流れになります。
ちょっと休憩?ループを途中で抜ける「break」
ループの途中で、ある条件を満たしたら繰り返しを完全に終了させたい場合があります。そんなときに使うのが `break` 文です。
例えば、配列の中から特定の数値を探し、見つかったらその時点でループを終える処理を考えてみましょう。
int[] numbers = {1, 5, 12, 25, 30, 42}; int target = 25; // 探したい数値 // 配列の中から target を探す for (int num : numbers) { System.out.println("チェック中: " + num); if (num == target) { System.out.println(target + "を見つけました!"); break; // ループを中断して抜ける } }
実行結果
チェック中: 1 チェック中: 5 チェック中: 12 チェック中: 25 25を見つけました!
`break`文が実行されると、その時点でfor文のブロックから抜け出すため、30や42はチェックされずに処理が終了します。無駄な処理を省くのに役立ちます。
今回はスキップ!処理を飛ばす「continue」
`continue` 文は、`break` 文と似ていますが、ループを完全に終了するのではなく、現在の回の処理だけを中断して、次の回の処理にスキップするという動きをします。
例えば、1から10までの数値のうち、偶数だけを表示したい場合に利用できます。
for (int i = 1; i <= 10; i++) { // もし i が奇数なら if (i % 2 != 0) { continue; // 以降の処理をスキップして、次のループへ進む } // この行は i が偶数のときだけ実行される System.out.println(i + "は偶数です。"); }
実行結果
2は偶数です。 4は偶数です。 6は偶数です。 8は偶数です。 10は偶数です。
`i`が奇数のときは `continue` によって `System.out.println` が実行されず、すぐに変化式 (`i++`) に処理が移ります。
Javaのfor文でハマらないための7つのポイント
for文は便利ですが、書き方を間違えると意図しない動作やエラーの原因になります。ここでは、初心者が特に陥りやすい7つの注意点とその対策を解説します。
- 無限ループにご用心!
- カウンタ変数のスコープを意識しよう
- 配列の「長さ」の指定ミス
- 拡張for文での要素の変更・削除はNG?
- 条件式の「=」のつけ忘れ
- 処理ブロックの「{}」を省略しない
- パフォーマンスを少しだけ意識してみる
① 無限ループにご用心!
条件式がいつまでも `false` にならないと、ループが永遠に終わらない「無限ループ」という状態に陥ります。特に、変化式の書き忘れや条件式の指定ミスが主な原因です。
無限ループの例
// 変化式 i++ がないため、i は永遠に 0 のまま // i < 10 という条件が常に true になり、無限ループする for (int i = 0; i < 10; ) { System.out.println("無限ループ中..."); }
もし無限ループに陥ってしまったら、実行環境の停止ボタンを押して強制終了させてください。for文を書く際は、ループが必ず終了する条件になっているかを確認する癖をつけましょう。
② カウンタ変数のスコープを意識しよう
for文の初期化式で宣言した変数(例:`int i = 0;` の `i`)は、そのfor文のブロック `{}` の中でのみ有効です。この有効範囲を「スコープ」と呼びます。
for文の外側でその変数を使おうとすると、コンパイルエラーになるので注意が必要です。
for (int i = 0; i < 5; i++) { System.out.println("ループ内: " + i); } // for文の外側で i を使おうとするとエラーになる // System.out.println("ループ外: " + i); // コンパイルエラー!
③ 配列の「長さ」の指定ミス
配列を扱う際、条件式で配列の長さ(要素数)を指定しますが、ここで間違いが起きやすいです。配列のインデックスは `0` から始まるため、要素数が5の配列のインデックスは `0, 1, 2, 3, 4` となります。
もし条件式を `i <= 5` のように書いてしまうと、存在しない6番目の要素 (`array[5]`) にアクセスしようとして `ArrayIndexOutOfBoundsException` というエラーが発生します。
int[] array = new int[5]; // 要素数は5 (インデックスは0〜4) // i <= array.length は間違い! // i が 5 のときにエラーが発生する for (int i = 0; i <= array.length; i++) { // ... } // 正しくは i < array.length for (int i = 0; i < array.length; i++) { // ... }
④ 拡張for文での要素の変更・削除はNG?
拡張for文のループ内で、ループ対象となっているリスト(`ArrayList`など)の要素を追加したり削除したりすると、`ConcurrentModificationException` というエラーが発生することがあります。
これは、ループ処理の途中でコレクションの構造が変わってしまうことで、処理の整合性が取れなくなるために起こります。ループ中に要素の削除を行いたい場合は、拡張for文ではなく、イテレータ(`Iterator`)という仕組みを使うのが安全です。
⑤ 条件式の「=」のつけ忘れ
「10回繰り返したい」場合、`i < 10`(0から9まで)とするか `i <= 9`(0から9まで)とするか、きちんと意識することが重要です。この `i < 10` と `i <= 10` の違い(「未満」と「以下」の違い)は、バグの原因になりやすいポイントです。特に `0` から始まるインデックスを扱う際は、`<` を使うのが一般的です。
⑥ 処理ブロックの「{}」を省略しない
for文で実行する処理が1行だけの場合、 `{}` (波括弧) を省略して書くことも文法的には可能です。しかし、後から処理を追記した際に `{}` をつけ忘れると、追加した行がループの対象外となり、意図しない動作の原因になります。
バグを防ぐため、処理が1行であっても、常に `{}` で囲む習慣をつけることを強く推奨します。
⑦ パフォーマンスを少しだけ意識してみる
数百万回といった非常に多くの回数をループする場合、ループ内の処理がパフォーマンスに影響を与えることがあります。例えば、ループのたびに毎回メソッドを呼び出して条件判定するような書き方は、処理速度が遅くなる原因になることがあります。
初心者のうちはあまり気にする必要はありませんが、大量のデータを扱う際には、ループ内の処理はできるだけシンプルに保つということを頭の片隅に置いておくと良いでしょう。
for文だけじゃない!Javaの他の繰り返し処理
Javaにはfor文以外にも繰り返し処理を行う構文があります。ここでは代表的な`while`文と`do-while`文を紹介し、for文とどのように使い分けるべきかを解説します。
- 条件が重要なときは「while文」
- 最低1回は実行したい「do-while文」
条件が重要なときは「while文」
`while`文は、指定した条件が`true`である間、処理を繰り返す構文です。
while (条件式) { // 繰り返したい処理 // ループを終了させるための更新処理も忘れずに! }
for文が「繰り返す回数」が明確な場合に適しているのに対し、`while`文は「ある条件を満たすまで」繰り返したい場合に適しています。例えば、「ユーザーが特定の文字を入力するまで待つ」といった処理でよく使われます。
構文 | 主な用途 | 特徴 |
---|---|---|
for文 | 決まった回数だけ繰り返す | 初期化、条件、変化が1行にまとまっていて見やすい |
while文 | 特定の条件を満たす間繰り返す | ループ回数が事前に分からない場合に適している |
最低1回は実行したい「do-while文」
`do-while`文は`while`文と似ていますが、最初に処理を実行してから条件判定を行う点が異なります。そのため、条件式の結果に関わらず、必ず最低1回は処理が実行されることが保証されます。
do { // 繰り返したい処理 (最低1回は実行される) } while (条件式);
例えば、「ユーザーにメニューを表示して入力を促し、不正な入力であれば再表示する」といった処理で利用されます。
Javaのfor文学習におすすめの学習サイト・書籍
for文の基本を理解したら、次は実際にたくさんのコードを書いてみることが上達への一番の近道です。ここでは、学習に役立つオンラインサイトや書籍を紹介します。
- 初心者におすすめのオンライン学習サイト
- ステップアップのための一冊
まとめ
この記事では、Javaのfor文について、基本的な書き方から拡張for文、二重ループ、そして初心者が注意すべきポイントまで幅広く解説しました。
for文は、Javaだけでなく多くのプログラミング言語で使われる基本的な構文です。for文を自由自在に使いこなせるようになれば、作れるプログラムの幅が大きく広がり、プログラミングがもっと楽しくなるはずです。
今回学んだ知識を元に、ぜひ色々なプログラムを自分で書いて動かしてみてください。たくさんのコードに触れることが、上達への一番の道筋となるでしょう。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。