for文に慣れたと思ったら、新しいやつが来た件。
Javaの勉強を始めたころ、「for文って便利!」と少しずつ慣れてきて、ようやく「私、成長してるかも」と感じ始めていたある日。
コードの中に、突然見慣れない書き方が登場しました。
for (String item : items)
「なにこのコロン(:)!?」
「普通のforじゃダメなの!?」
そう、これが“拡張for文”との出会いでした。完全に油断していました。
普通のfor文と見た目も動きも違うし、「便利そうなのにどう違うのかがわからない…」と混乱してしまったのをよく覚えています。
この記事では、そんな「2種類のfor文の使い方の違いに戸惑っている方」のために、
- 通常のfor文の基本構文
- 拡張for文との違い
- どちらをいつ使えばいいか
などを、初心者目線でやさしく解説していきます!
拡張for文に戸惑って、そっとエディタを閉じたことがある方も大丈夫。
このページを読み終えるころには、「使い分け、わかってきたかも!」という感覚を持てるようになるはずです
基本のfor文の書き方と仕組みをマスターしよう
Javaを学び始めたとき、まず登場するのがこの「for文(通常のfor)」です。
最初はちょっととっつきにくく見えますが、ちゃんと構造を理解すれば「あ、こう動くのか!」と納得できるようになります。
for文って何をしてるの?
一言でいうと、「同じ処理を何度も繰り返す仕組み」です。
たとえば「0〜4までの数字を順番に出力したい」とき、こんなふうに書きます。
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
出力結果:
0
1
2
3
4
for文の3つのパーツ
ぱっと見だと「なんだこのカッコの中身は…」となりますが、実はとても論理的。
中身は3つのパートでできています。
for (① 初期化; ② 条件; ③ 増減処理) {
④ 繰り返したい処理
}
さっきのコードで分解してみましょう:
for (int i = 0; // ① 初期化:変数iに0を代入
i < 5; // ② 条件:iが5より小さい間、処理を続ける
i++) { // ③ 増減処理:1回ごとにiを+1する
System.out.println(i); // ④ 処理:今のiを表示
}
この流れで、「i = 0から始まって、i < 5の間だけ繰り返して、1ずつ増えていく」という動きをしているわけです。
頭でイメージするとわかりやすい!
for文を「繰り返しマシン」として擬人化してみると…
- i = 0 からスタート(初期化)
- 条件(i < 5)をチェック → true なら処理へ!
- 中のコードを実行
- i++ でインクリメント
- また条件チェック → true ならもう1周!
こうして、条件がfalse(=iが5以上)になるまでぐるぐる回ります。
この“回るルール”をつかむと、for文がぐっと身近になりますよ。
応用:カウントダウンもできる!
for (int i = 5; i > 0; i--) {
System.out.println("あと " + i + " 回!");
}
出力:
あと 5 回!
あと 4 回!
あと 3回!
あと 2 回!
あと 1 回!
i– とすればカウントダウンも可能!方向を変えるだけでできるのもfor文の強さです。
for文が向いている場面
- 配列のインデックスを使って処理したいとき
- 開始と終了条件を明確に設定したいとき
- 何回ループしたかをカウントしたいとき
まとめ
通常のfor文は、最初は「呪文っぽくて難しそう」に見えますが、 中身の3ステップ(初期化・条件・更新)が理解できれば、自在にデータをループさせられる便利な文法です!
次の章では、この通常のfor文よりも「シンプルで読みやすい」拡張for文をご紹介します。
拡張for文(foreach)の使い方と特徴
通常のfor文にようやく慣れてきたころ、「拡張for文」という新キャラが登場してきて、「ちょ、待ってください!」ってなりませんでしたか?
私はなりました。 しかも、構文が全然違う。
コロン(:)がいきなり出てきて、もはやパニック。
けれど実はこれ、とっても便利なやさしい文法なんです。
拡張for文って何?
拡張for文は、「配列やコレクションの中身を1つずつ取り出して処理する」ための、よりシンプルな書き方です。
読み方は「foreach(フォーイーチ)」と呼ばれることもあります。
基本の構文
for (型 変数名 : コレクションや配列) {
// 1つずつ取り出された要素を使って処理
}
実例を見てみましょう
String[] fruits = {"りんご", "バナナ", "みかん"};
for (String fruit : fruits) {
System.out.println(fruit);
}
出力:
りんご
バナナ
みかん
やってることは「fruits配列の中身を1つずつ取り出して、fruitという変数に入れながら処理している」というイメージです。
通常のfor文とどう違うの?
たとえば、同じ処理を通常のfor文で書こうとするとこうなります:
for (int i = 0; i < fruits.length; i++) {
System.out.println(fruits[i]);
}
これも全然アリですが、「インデックス(i)を使わなくてもよいなら、もっとスッキリ書きたいよね?」という場面には拡張for文がピッタリです。
拡張for文のメリット
- 読みやすく、短い
- コレクションの中身をすべて処理するのに向いている
- インデックスを気にしなくていいからミスが減る
逆に、こんなときは不向き
拡張for文にも弱点はあります。
以下のような場面では通常のfor文の方が適しています:
目的 | 拡張forでできる? |
---|---|
要素の途中から始めたい | ❌(一律で先頭から) |
インデックスが必要 | ❌ |
要素を削除・追加したい | ❌(ConcurrentModificationExceptionになることも) |
単純に全件処理したいだけ | ⭕️ |
Listでも使ってみよう!
List<String> names = List.of("Taro", "Hanako", "Jiro");
for (String name : names) {
System.out.println("こんにちは、" + name + "さん!");
}
とてもスッキリ!慣れてくると、拡張for文を見て「あ〜はいはい、全件処理ね」とすぐに意味がわかるようになります。
まとめ
拡張for文は、「配列やListの中身を全部取り出して処理したい!」というときのお助けショートカットのような存在です。
見た目はちょっと違和感ありますが、使い方がわかれば「むしろ楽かも」と思えるはず。
次の章では、そんな通常for文と拡張for文の使い分けを整理して、どっちをいつ使えばいいの?という永遠のテーマに一緒に向き合ってみましょう。
通常forと拡張for、どう使い分けるのが正解?
Javaのfor文には2種類ある── それがわかったところで、次に出てくるのが「で、どっちをいつ使えばいいの?」という疑問です。
この章では、通常for文と拡張for文の違いや使いどころの目安をわかりやすく整理していきます!
ざっくりまとめると…
比較項目 | 通常のfor文 | 拡張for文(foreach) |
---|---|---|
書き方 | 自由度高め(インデックス操作あり) | 短くて簡潔 |
配列の一部だけ処理 | できる | できない(全件処理のみ) |
添字(index)が必要 | 必要に応じて使える | 使えない |
要素の追加/削除 | 可(ただし注意が必要) | 基本的に非推奨 |
可読性 | 多少複雑になりがち | スッキリして読みやすい |
それぞれの得意な場面
通常のfor文が向いているケース
- インデックス(i番目)を使いたい 例:奇数番目だけ取り出したい、末尾を判定したい など
- 一部の要素だけを処理したい 例:途中でbreakしたい、3番目以降だけ処理したい
- ループ中に要素を変更・削除したい(←要注意)
for (int i = 0; i < items.length; i++) {
if (i % 2 == 0) {
System.out.println(items[i]); // 偶数番目だけ処理
}
}
拡張for文が向いているケース
- 単純にすべての要素を処理したいとき
- 書くコードをスッキリさせたいとき
- 要素の中身だけ使えばOKなとき
for (String item : items) {
System.out.println(item); // 全部出力するだけならこれでOK!
}
実務ではどうなの?
業務コードでは、シンプルな処理には拡張for文が多く使われます。
一方で、インデックスが必要な複雑な場面には通常forが登場します。
だから、「拡張forだけでいいじゃん!」というわけではなく、「状況に応じて使い分ける」というのが現実的なスタンスです。
最後にひとこと:迷ったらまずは拡張for文でOK!
学習の最初の段階では、「ループで全部回したいだけ」な場面が多いと思います。
そういうときは、まず拡張for文で書いてみて大丈夫です。
あとから「この処理、i番目が必要だな」となったら、通常のfor文に切り替えればOK!
次の章では、実際の業務コードでよく見かける「for文」の使われ方をピックアップして、 「これってどう読むの?」という疑問に答えていきます。
業務コードでよくあるループのパターンを読み解こう
「for文、なんとなくわかってきた!」と思った矢先、業務のコードを見ると、
for (User user : userList) { ... }
…え?Userって何?
ていうかuserListはどこで作られてるの?
そして、このfor文何してるの?
わかります、私も最初はそうでした。
for文そのものというより、「業務でどう使われてるか」がわからない。
それが本当の壁でした。
ここでは、実務でよく見かけるループのパターンをいくつか紹介しながら、それぞれ何をしているのかを“言葉でかみ砕いて”解説していきます!
パターン①:一覧データを全件処理する
for (Product p : productList) {
System.out.println(p.getName());
}
何をしている?
→ 商品一覧(productList)の中身を1つずつ取り出して、商品名を表示しているだけです。
ポイント解説:
- productList は List 型(Listの中にProduct型のデータが入ってる)
- p が1つずつ取り出されたProduct型の変数
- p.getName() で「商品名の文字列」を取得
つまり、商品一覧に「for-each」でぐるぐるしてるだけ!
パターン②:ループ内で条件分岐する
for (User u : userList) {
if (u.isActive()) {
activeCount++;
}
}
何をしている?
→ ユーザー一覧の中から「アクティブなユーザー」だけを数えている。
ポイント解説:
- u.isActive() は「このユーザーは有効か?」を返すメソッド
- 条件に合った人だけを数えてる=フィルター的な使い方
- 集計や検索によく使われる定番パターン!
パターン③:ループの中でデータを生成・加工
List<String> names = new ArrayList<>();
for (User u : userList) {
names.add(u.getName());
}
何をしている?
→ User型のListから「名前だけ取り出したList」を新しく作っている。
これ、Stream APIのmapに進化する前の“原始的なmap処理”だったりします!
初心者が混乱しやすいポイント
つまずきポイント | 解説 |
---|---|
List<User>って何型? | 「User型のデータを複数入れられる箱(List)」です |
u.getName() の意味が不明 | Userという型が持っている「名前を返すメソッド」 |
for (User u : userList)の書き方に戸惑う | 拡張for文で1人ずつuに取り出しているだけです |
最初のうちは「どこからどこまでが型で、どこが変数なの?」と見分けづらいですが、読み慣れてくると自然と見えてきます。焦らなくてOK!
補足:Stream APIで見かける未来バージョン
List<String> names = userList.stream()
.filter(User::isActive)
.map(User::getName)
.toList();
この書き方も、やってることは「ループ+条件分岐+変換」です!
初心者のうちは「これってfor文でやってたやつの進化系か〜」くらいの認識で十分です。
まとめ:業務で使われるfor文の8割は“繰り返し+条件分岐”
for文を読み解く力は、業務コードを読む力そのものに直結します。
「なんか難しそう」と感じたら、
- どんなListを回してる?
- 何を取り出してる?
- 中で何をしてる?
この3つの視点で一度止まって眺めてみてください。
そしてわからなければ、「これは全部“箱から中身を取り出して処理してる”だけ」と一度ざっくり解釈してみましょう。だいたい合ってます。
次の章では、初心者の方が陥りがちな「ループ処理の落とし穴」について紹介します。
「あれ、これ動かない!?」となる前に、一緒に回避ポイントを押さえておきましょう!
よくある初学者のつまずきと注意点
for文の仕組みがわかってきた…!と思った矢先に「なぜかエラーが出る」「思ったように動かない」という壁にぶつかるのが、誰しも通る道。
この章では、初心者がfor文でつまずきがちなポイントをまとめてご紹介します。
「あ、これ自分のことだ…」と思ったら、それは成長のチャンスです!
無限ループになってプログラムが止まらない!
for (int i = 0; i >= 0; i++) {
System.out.println(i);
}
何が起きてる? :
- 条件がi >= 0なので、0以上の間ずっとループが続きます。そしてiは増え続けるので、終了条件に永遠に到達しません。
対処法:
- 終了条件が正しく設定されているかを確認!
- 「どこで終わるか?」をイメージして書く習慣を
インデックスの境界で「ArrayIndexOutOfBoundsException」
String[] fruits = {"りんご", "バナナ", "みかん"};
for (int i = 0; i <= fruits.length; i++) {
System.out.println(fruits[i]);
}
エラー発生:
Index 3 out of bounds for length 3
なぜ?:
- fruits.length は3ですが、配列のインデックスは0〜2まで。i <= fruits.length と書くとi == 3でエラーになります。
正しくはこう書く!
for (int i = 0; i < fruits.length; i++)
「=ではなく<」! ここ、初学者の永遠の落とし穴です。
for文の中でリストを変更してエラーに
for (String item : items) {
if (item.equals("削除対象")) {
items.remove(item); // エラーの元!
}
}
ConcurrentModificationExceptionが出ることも…
何が起きてる?:
- 拡張for文で回している最中にリストをいじると「おい、いま見てるリスト書き換えないでくれ!」と怒られます。
回避策:
- Iteratorを使うか、通常for文で対応する
条件が間違っていてループしない・しすぎる
例1:1回も回らない
for (int i = 10; i < 5; i++) {
System.out.println(i); // 実行されない
}
例2:条件がずれてて1回多く回る
for (int i = 0; i <= 4; i++) {
// 実は5回回ってる(i=0〜4)
}
「何回回すつもりか」について落ち着いて考えてみるといいですね。
拡張for文でindexを使いたくなる問題
for (String item : items) {
// itemが何番目か知りたい!
}
でも、拡張for文では“順番”はわからないのが特徴です。
indexが必要なら、素直に通常のfor文を使いましょう!
for (int i = 0; i < items.size(); i++) {
System.out.println(i + "番目: " + items.get(i));
}
最後に:つまずくのは“伸びしろ”の証拠
for文は基本にして奥深し。
どんなに簡単に見えても、「想定外の動き」を経験してこそ理解が深まります。
「失敗したけど次は気をつけよう」と思えたなら、それはもう立派なスキルアップです。
まとめ 〜for文がわかると、Javaがもっと楽しくなる!
ここまでお疲れさまでした! Javaのfor文をめぐる旅、いかがでしたか?
最初はややこしく見えた通常のfor文。
「なんでコロン使ってるの!?」と驚いた拡張for文。
業務コードで出くわしては「意味不明…」と目をそらしていたループたち。
でも、ひとつずつ分解して読み解いていくと、「あ、そういうことだったのか!」とスッと理解できる瞬間があったのではないでしょうか。
この記事では、次のことを一緒に学んできました。
- 通常のfor文の基本構文と“3ステップ”の流れ
- 拡張for文の読みやすさと便利さ
- それぞれの使いどころと違い
- 実務でよくあるコードのパターンとその意味
- 初心者がつまずきやすいポイントとその回避法
知識として知るだけでなく、「自分が書くとき」「人のコードを読むとき」に役立つ実践的な力を、少しずつ蓄えてきました。
for文って、ただの文法のひとつかと思いきや、「ループという考え方」そのものがプログラミングの基礎なんですよね。
だから、ここがわかると、「配列やリスト」「条件分岐」「データ操作」など、いろんなトピックがつながって見えてきます。
まるで霧が晴れていくように、Javaの世界が広がっていく感覚。
それを、この記事で一緒に体験できていたらうれしいです!

私自身、Javaのfor文に出会ったとき、「よし、理解できたぞ!」と思ったのも束の間、突然現れた“拡張for文”にまた戸惑って…。そんなふうに、学習の途中で立ち止まってしまった経験がたくさんあります。
だからこの記事は、過去の自分に向けるつもりで書きました。 「何が違うの?」「どうやって使い分けるの?」そんなモヤモヤにやさしく寄り添えるように。 もしこの記事が、あなたの中の“わからない”をちょっとでもほぐす手助けになっていたなら、それ以上にうれしいことはありません。
コメント