Java 拡張for文について

# Java 拡張for文
通常のfor文では初期化式や条件式、変化式を記述しないといけませんが、ある変数の要素を最初から最後までループさせるとわかっている場合、拡張for文を使うと簡単に記述することができます。

## 1. 拡張for文の特徴
- 記述量が少ないため、可読性が高い
- 配列やコレクションなど、複数の要素を順番に取り出す繰り返し処理に適している

## 2. 書き方
```Java:拡張for文の書き方
for (変数の型 変数名 : 配列名 または コレクション名) {
    // 変数を使った処理の内容
}
```
配列やコレクションの要素すべてを順番に取り出し、変数に代入して繰り返し処理をする、という場合の書き方です。
以下に具体例を示します。

## 3. 具体例
1～10までの数字(値)をすべて足していくと、合計値は55となります。
その処理を配列と通常のfor文、拡張for文を使って書いてみます。
```Java:EnhancedForLoop.java
public class EnhancedForLoop {
    public static void main(String[] args) {
        int[] numbers = new int[10];
        int sum = 0;

        // 配列変数:numbersに1から10までの値を連番で格納する
        for (int i = 0; i < 10; i++) {
            numbers[i] = i + 1;
        }

        // 【拡張for文】
        // 配列「numbers」の各要素を先頭から順番に1つずつ変数「number」に代入し、ループ処理を行う
        for (int number : numbers) {
            // 変数「number」の値を変数「sum」に加算し、合計を計算する
            sum += number;
        }

        System.out.println("配列変数:numbersの要素の値をすべて足すと" + sum + "となります。");
    }
}
```
```tex:実行結果
配列変数:numbersの要素の値をすべて足すと55となります。
```

## 4. 解説
ひとつひとつ見ていきましょう。
```Java
int[] numbers = new int[10];
int sum = 0;
```
要素数が `10` の `int` 型配列変数 `numbers` を宣言し、合計値を入れておくための `int` 型変数 `sum` を宣言します。
```Java
// 配列変数:numbersに1から10までの値を連番で格納する
for (int i = 0; i < 10; i++) {
    numbers[i] = i + 1;
}
```
通常のfor文の書き方ですね。
配列の添え字は `0` から始まるので、初期化式は `int i = 0` とし、10回繰り返すため、条件式は `i < 10` です。
また、配列に格納する数字(値)は `1` から始まるため、 `numbers[i] = i + 1` としています。

次は、いよいよ拡張for文の箇所です。
```Java
// 【拡張for文】
// 配列「numbers」の各要素を先頭から順番に1つずつ変数「number」に代入し、ループ処理を行う
for (int number : numbers) {
    // 変数「number」の値を変数「sum」に加算し、合計を計算する
    sum += number;
}
```
何が起きているか順を追って解説します。

【1ループ目】
1. int型配列変数 `numbers` の `0` 番目の値（ `numbers[0] = 1` ）を int型変数 `number` に代入します
2. この時点で、まず `number = 1` となります
3. これを合計値を求めるための int型変数 `sum` に加算代入します（ `sum = 1` ）
4. これで拡張for文の中の処理（1ループ目）が終わりましたので、 int型配列変数 `numbers` の次の要素に移ります

【2ループ目】
1. `numbers` の `1` 番目の値（ `numbers[1] = 2` ）を `number` に代入します
2. ここで `number = 2` となります
3. そして、先ほどと同じように `sum` に加算代入します。合計値 `sum` の値は `1 + 2 = 3` となります
4. 2ループ目の処理が終わり、続けて、`numbers` の次の要素に移ります

【3ループ目】
～以降、繰り返し～

以上を、拡張for文で書いた int型配列変数 `numbers` の要素数すべて終わるまで繰り返します。

```tex:実行結果
配列変数:numbersの要素の値をすべて足すと55となります。
```

## 5. 通常のfor文に置き換えると
上記、拡張for文の処理を、通常のfor文に置き換えると以下のようになります。
```Java:拡張for文の処理の内容を通常のfor文で書く
for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}
```
拡張for文のほうが圧倒的に記述量が少なく、可読性も高いように思います。

ですが、必ずしも拡張for文のほうが優れているというわけでもないので、
結局はコードを書く人、読む人、プロジェクトの方針次第なところもあるかと思われます。

例えば、通常のfor文の書き方ですと、変数 `sum` に加算代入されているのが配列変数 `numbers` の `[i]` 番目の値だな、と一目瞭然です。
条件式も `i < numbers.length` なので、配列変数 `numbers` の要素数分ループさせるのだな、とループ回数がわかりやすいです。
また、新しい変数名（拡張for文で使用した `int number` ）が登場しない点も良いところでしょう。

## 6. 注意点
通常のfor文と違い、拡張for文はループカウンタを使用しないので、特定のループ回数のときのみ違う処理をさせる、といったことができません。
```Java:拡張for文ではできない処理
for (int i = 0; i < numbers.length; i++) {
    // 処理Aの内容
    // 6ループ目のときのみ、以下条件分岐に入るようにする
    if (i == 5) {
        // 処理Bの内容
    }
}
```
このように、処理Aをさせたあと、ループカウンタ `i` が `5` と等しいときのみ、処理Bをさせる…というような場合です。

このケースでは通常のfor文を使いましょう。
拡張for文は最初から最後まで、同じ処理を行いたいときに使います。
ただし、配列やコレクションの要素を使用した条件で、上記のような処理を行うこともできます。

## 7. おわりに
配列やコレクションなど、要素が複数個ある変数の要素数分ループさせる必要があり、またすべての要素の値を使う処理（合計値を計算させる、名前をすべて出力する、etc...）を書く場合に、拡張for文を使って実装できると、コードがすっきりして良いのではないでしょうか。
コーディング規約やプロジェクトの方針、レビューアなどと、相談しながら検討してみてください。

## 8. 参考記事
- [繰り返し処理の基礎学習(for文について)](https://qiita.com/git2024/items/92bcf3fd4c32467ab2e3 "繰り返し処理の基礎学習(for文について)")
- [Java配列](https://qiita.com/git2024/private/0af362eb6b1700177202 "Java配列")
- [【Java】拡張 for文](https://qiita.com/takahirocook/items/470b2858de1a4f99b334 "【Java】拡張 for文")