0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java 拡張for文

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

1. 拡張for文の特徴

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

2. 書き方

拡張for文の書き方
for (変数の型 変数名 : 配列名 または コレクション名) {
    // 変数を使った処理の内容
}

配列やコレクションの要素すべてを順番に取り出し、変数に代入して繰り返し処理をする、という場合の書き方です。
以下に具体例を示します。

3. 具体例

1~10までの数字(値)をすべて足していくと、合計値は55となります。
その処理を配列と通常のfor文、拡張for文を使って書いてみます。

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 + "となります。");
    }
}
実行結果
配列変数:numbersの要素の値をすべて足すと55となります。

4. 解説

ひとつひとつ見ていきましょう。

int[] numbers = new int[10];
int sum = 0;

要素数が 10int 型配列変数 numbers を宣言し、合計値を入れておくための int 型変数 sum を宣言します。

// 配列変数: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文の箇所です。

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

何が起きているか順を追って解説します。

【1ループ目】

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

【2ループ目】

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

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

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

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

5. 通常のfor文に置き換えると

上記、拡張for文の処理を、通常のfor文に置き換えると以下のようになります。

拡張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文はループカウンタを使用しないので、特定のループ回数のときのみ違う処理をさせる、といったことができません。

拡張for文ではできない処理
for (int i = 0; i < numbers.length; i++) {
    // 処理Aの内容
    // 6ループ目のときのみ、以下条件分岐に入るようにする
    if (i == 5) {
        // 処理Bの内容
    }
}

このように、処理Aをさせたあと、ループカウンタ i5 と等しいときのみ、処理Bをさせる…というような場合です。

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

7. おわりに

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

8. 参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?