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(マップ) を紹介します。