Java入門⑬ 拡張for文 ── 中身を、ラクに全部取り出す
Java入門⑬ 拡張for文 ── 中身を、ラクに全部取り出す
前回まで、配列と ArrayList(データのまとまり)をやりました。
今回は、そのまとまりの中身を、もっとラクに全部取り出す方法。拡張for文(かくちょうフォーぶん)です。「for-each文」とも呼ばれます。
拡張for文とは、「まとまりの中身を、ひとつずつ、最後まで取り出す」くり返しです。
ふつうのfor文の、ちょっと面倒なところ
前回まで、配列や ArrayList の中身を全部取り出すのに、ふつうのfor文を使っていました。
int[] scores = {80, 95, 70};
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
これでちゃんと動きます。でも、やりたいことに対して書くことが多いんです。
本当にやりたいのは「中身を順に表示する」だけ。なのに、カウンター i を用意して、条件を書いて、増やして、番号で取り出す。そして第11回で見たように、番号を1つ間違えるとエラーになる危険もあります。
拡張for文なら、こう書ける
同じことを、拡張for文で書くと、こうなります。
int[] scores = {80, 95, 70};
for (int score : scores) {
System.out.println(score);
}
実行結果は同じ。80・95・70 が順に表示されます。でも、書く量がぐっと減りました。カウンターも、番号も、個数も出てきません。
形を見てみましょう。
for (int score : scores)
これは、「scores の中身を、ひとつずつ score に取り出して、最後までくり返す」という意味です。
scores… 取り出したいまとまりscore… 取り出した中身を、一時的に入れる箱- 1回ごとに、
scoreに 80 → 95 → 70 と順に入る
真ん中の :(コロン)は、「〜の中の、それぞれについて」と読みます。「scores の中の、それぞれの score について」ですね。
何が嬉しいのか
拡張for文の良いところは、番号を気にしなくていいことです。
ふつうのfor文では「0から始まる」「最後は個数マイナス1」と、番号の管理に気を使いました。番号をはみ出すとエラーにもなりました。
拡張for文は、「全部、順番に」やってくれるので、その心配がありません。「中身を全部、順に処理したい」だけなら、拡張for文の方が安全で読みやすいんです。
ArrayList でも、同じように使えます。
ArrayList<String> names = new ArrayList<String>();
names.add("山田");
names.add("田中");
for (String name : names) {
System.out.println(name + "さん");
}
ふつうのfor文と、どう使い分けるか
- 拡張for文 … 中身を 全部、順番に 処理したいとき。番号は気にしない
- ふつうのfor文 … 番号そのものを使いたいとき。「3番目だけ」「逆順で」など
「全員の点数を表示」なら拡張for文で十分。「奇数番目だけ」「後ろから」のように番号を細かく操作したいなら、ふつうのfor文。
ふだんは拡張for文、番号で細かい操作がしたいときだけ、ふつうのfor文。そんな使い分けが自然です。
つまずきポイント
学生が戸惑うのが、真ん中の : の読み方です。
for (int score : scores)
: は「〜の中の、それぞれについて」。英語の for-each(それぞれについて)から来ています。「scores の中の、それぞれの score について、くり返す」と読めれば大丈夫です。
もうひとつ、取り出した中身(score)を書き換えても、元のまとまりは変わらない点に注意。score は「一時的に取り出したコピー」なので、それを変えても元の配列には影響しません。中身を書き換えたいときは、ふつうのfor文と番号を使います。
まとめ
拡張for文は、まとまりの中身を、頭から順に全部取り出すくり返し。
for (int score : scores) {
System.out.println(score);
}
- 番号を気にせず、全部を順に処理できる
:は「〜の中の、それぞれについて」- 「全部見る」なら拡張for文、「番号を操作する」ならふつうのfor文
次回は、名前をつけてデータを引ける Map(マップ) を紹介します。

