Java for文の完全ガイド!拡張for文やforEachの使い方も紹介

「for文ってどう使うの?」
「初期化式、条件式、変化式って何?」
「具体的なコーディング例を教えて欲しい」

Javaのfor文の使い方に関して知っていますか?Javaのfor文は、繰り返し処理の際に使います。

初心者にとっては初めて見ると以下のような疑問を抱えているかもしれません。

そこで、この記事ではJavaのfor文に焦点を当て、サンプルコードをもとにfor文の基本から応用までを解説します。

for文を使う際の注意点もまとめているので、ぜひ最後までをご覧ください。

Javaのfor文とは

Javaのfor文は、プログラム内で同じ処理を繰り返すための処理です。

Javaのfor文は、同じ処理を指定した回数だけ繰り返し実行する場合に使います。
具体的な書き方に関しては次の章で説明していきますね。

この章では、for文の理解を深めるために以下の項目を解説します。

  • for文と拡張for文の違い
  • 省略形のfor(;;)

順番にみていきましょう。

for文と拡張for文の違い

for文と拡張for文は、どちらもJavaで繰り返し処理の際に使用される処理です。

結論、for文は条件制御が必要な場合に、拡張for文は要素に順番にアクセスする単純な処理に適しています。

for文は条件に応じた繰り返し処理ができるため、特定の条件でループを終了する場合やループの中で特定の処理を実行したい場合に使用しましょう。

以下がfor文のサンプルコードです。

  
// for文の処理(0から4までの数字を昇順に表示)
    for (int i = 0; i < 5; i++) {
    System.out.println("通常のfor文: イテレーション番号 " + i);
}
  

int i を0からスタートし、i の値が5未満の間、ループを繰り返します。イテレーションごとに i の値が増加し、ループ内で特定の処理が可能です。

  
// for文の処理(0から4までの数字を表示)結果
通常のfor文: イテレーション番号 0
通常のfor文: イテレーション番号 1
通常のfor文: イテレーション番号 2
通常のfor文: イテレーション番号 3
通常のfor文: イテレーション番号 4
  

一方、拡張for文はJava 5.0以降で導入された構文で、主に配列やコレクションの要素に順番にアクセスする場合に使用されます。

通常のfor文と比べて、より簡潔にコードを記述できるのが特徴です。

具体的な構文は以下の通り。

  
//拡張 for文の処理(リスト内フルーツを順番に表示)
String[] fruits = { "りんご", "バナナ", "いちご" };
    for (String fruit : fruits) {
    System.out.println("拡張for文: フルーツ " + fruit);
}
  

文字列の配列 fruits 内の各要素に順番にアクセスし、ループ内で fruit を使用して要素ごとにループを回します。

  
//拡張 for文の処理(リスト内フルーツを順番に表示)結果
拡張for文: フルーツ りんご
拡張for文: フルーツ バナナ
拡張for文: フルーツ いちご
  

for文と比べてコードが簡潔で読みやすいため、要素の順番に処理を実行するだけの場合に便利です。

拡張for文の使い方に関しては、後ほど解説しますね。

省略形のfor(;;)

略形のfor(;;)は、無限ループを作成するための方法です。

通常のfor文では、初期化式、条件式、変化式が必要ですが、それらを省略し、ループを無限に実行できます。

無限ループを使用する場合、終了条件を備えることが重要です。ループから抜けるには、break文を使用します。

  
public class Main {
    public static void main(String[] args) {
        String[] colors = {"赤", "青", "緑", "黄"};

        // 省略なしの通常のfor文
        for (int i = 0; i < colors.length; i++) {
            System.out.println("色: " + colors[i]);
        }

   // 初期化式を省略
        for (; i < colors.length; i++) {
            System.out.println("色: " + colors[i]);
        }


   // 初期化式と変化式を省略
        for (; i < colors.length;) {
            System.out.println("色: " + colors[i]);
            i++;
        }
  
// 条件式を省略すると常にtrueになり、無限ループになる
        for (;;) {
            if (i >= colors.length) {
                break; // 配列の要素数以上になったらループを終了
            }
            System.out.println("色: " + colors[i]);
            i++;
        }
    }
}
  

上記の例では、for (int i = 0; ; i++)を使用して無限ループを作成し、配列内の色の要素を表示しています。

iが配列の要素数以上になると、break文が実行されてループ終了です。

省略形のfor(;;)は、ループの終了条件をループ内で明示的に指定するため、柔軟性が高いんですね。

Java for文の基本的な書き方

次にJavaのfor文の基本的な書き方に関して説明しますね。

Javaのfor文は以下の3つの構成からなります。

  • 初期化式
  • 条件式
  • 変化式

for文の基本構造を理解することが重要です。

基本の構造は以下の通り。

  
for(初期化式; 条件式; 変化式){
      // ここで処理を行います
}
  

この章では、下記の例を用いてJavaのfor文の基本的な書き方を詳しく解説していきますね。

  
for (int i = 0; i < 5; i++) {
    // ループ内で実行される処理
    System.out.println("ループ回数: " + i);
}
  
  
//出力結果
ループ回数: 0
ループ回数: 1
ループ回数: 2
ループ回数: 3
ループ回数: 4
  

初期化式

f​​or文では、最初に1回だけ実行されるのが「初期化式」です。

ループ回数を表すカウンターなどの変数を宣言し、初期化します。

例でいうと、`int i = 0 `が初期化式です。一般的に、変数を「0」や「1」を使って初期化します。

条件式

ループを継続する条件を指定するのが「条件式」です。

条件式で設定されている条件が真の場合、ループは続行され、偽になるとループが終了します。

上記の例では、条件式` i < 5 `が条件式です。初期化式である0から4までがtrueの間となり、ループが実行されます。

5以上の場合は偽になるので、ループが継続されることはありません。

変化式

変化式は、ループ変数を変更するために使用されるのが「変化式」です。for文内の処理が最後まで行われた後に実行されます。

上記の例では、`i++ `が変化式です。ループが1回実行されるたびに変化式が適用され、ループ変数の値が更新されます。

以下が具体的に加算されていくイメージです。

  • ループの最初で i の値は0(初期化式:`int i = 0 `)
  • ループが1回実行された後、変化式` i++ `により i の値は1増加して「1」になる
  • ループが2回実行された後、再び `i++ `により i の値は1増加して「2」になる
  • これが続き、指定した条件式` i < 5 `が false になるまで(例の場合、4まで) i の値が1ずつ増加

初期値0から始まり、1回のループごとに1ずつ増加していくことで、ループが指定した条件を満たす間、繰り返し処理が行われます。

Java for文の基礎的な使い方

Javaのfor文の基本的な使い方を学びましょう。

この章では、Javaのfor文における以下の項目の使い方を順番に解説していきます。

  • for文のネスト(入れ子)
  • 配列へのアクセス

繰り返し処理を効果的に活用して、プログラムを効率的に記述できるようになりましょうね。

for文のネスト(入れ子)

多次元の配列を処理したい場合には、for文を入れ子にして使いましょう。この場合、外側のループが1回実行されるごとに、内側のループが全て実行されます。

以下は、2重のfor文を使用して九九の表を表示する例です。

  
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.print(i * j + " ");
    }
    System.out.println(); // 改行して次の行に移る
}
  

具体的な処理の流れは以下の通りです。

  1. 外側のfor文 iが1のとき内側のfor文j が1から9まで変化しながら、iとjの掛け算の計算結果を表示
  2. 外側のfor文iが次の値2に進み、同様にj が1から9まで変化しながら、iとjの計算が繰り返される
  3. 外側のfor文iが9になるまで続き、九九の表が完成する
  
//出力結果
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
  

外側のfor文と内側のfor文の2つのループから構成されており、内側のfor文は外側のfor文が1回実行されるたびに9回繰り返されます。

配列へのアクセス

for文は、配列の要素にアクセスするのにも便利です。

以下の例では、numbers という整数型の配列内の要素を、for文を使って順番に表示しています。

  
int[] numbers = {1, 2, 3, 4, 5};

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

```

```java

//出力結果
1
2
3
4
5
  

numbers.length は配列の長さを表し、i の値を0からnumbers.length – 1 まで増加させながら、各要素にアクセスしています。

Java for文の応用的な書き方

基本的なfor文の使い方を理解したら、より応用的な書き方をマスターしていきましょう。

Javaのfor文をさらに応用的に使用するための以下の方法を紹介します。

  • 複数の初期化式・変化式
  • 入れ子のfor文

応用的なfor文の使い方を習得することで、より発展的な処理ができるようになります。

複数の初期化式・変化式

通常、for文の初期化式や変化式には1つの式が使われますが、複数の式をカンマで区切って記述することも可能です。これにより、異なる変数を同時に操作できます。

以下のコードでは、2つの変数を初期化し、それらを同時に増加させています。

  
for (int i = 0, j = 10; i < 5; i++, j--) {
    System.out.println("i: " + i + ", j: " + j);
}
  

初期化式では、i は0から、j は10から始まり、条件式の`i< 5`になるまで、i は増加し、j は減少します。条件式は1つしか書くことができないので注意しましょう。

  
//出力結果
i: 0, j: 10
i: 1, j: 9
i: 2, j: 8
i: 3, j: 7
i: 4, j: 6
  

入れ子のfor文

基礎的な書き方では、2つのfor文を使った入れ子の方法を解説しました。応用編では、3つの入れ子のfor文を使用する3重のループ構造を理解しましょう。

以下のサンプルコードを見てください。

  
int threeDimensionalArray = new int[3][3][3];

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 3; k++) {
            threeDimensionalArray[i][j][k] = i + j + k;
            System.out.println("[" + i + "][" + j + "][" + k + "] = " + threeDimensionalArray[i][j][k]);
        }
    }
}
  

3つの変数が同時に変化しながら繰り返し処理が行われ、変数i、j、kの値の加算結果が表示される処理です。

この構造では、外側のループ、中間のループ、内側のループの3つのループが順番に実行されます。

基礎編と考え方は同様です。外側のループが1回実行されるごとに、中間のループと内側のループがすべての組み合わせで実行されます。

  
//出力結果
[0][0][0] = 0
[0][0][1] = 1
[0][0][2] = 2
[0][1][0] = 1
[0][1][1] = 2
[0][1][2] = 3
[0][2][0] = 2
[0][2][1] = 3
[0][2][2] = 4
[1][0][0] = 1
[1][0][1] = 2
[1][0][2] = 3
[1][1][0] = 2
[1][1][1] = 3
[1][1][2] = 4
[1][2][0] = 3
[1][2][1] = 4
[1][2][2] = 5
[2][0][0] = 2
[2][0][1] = 3
[2][0][2] = 4
[2][1][0] = 3
[2][1][1] = 4
[2][1][2] = 5
[2][2][0] = 4
[2][2][1] = 5
[2][2][2] = 6
  

3つの入れ子のfor文は、3次元のデータ構造を操作する場合や、多重の状態を考慮するアルゴリズムを実装する場合に役立ちます。

3次元ができれば、4次元やそれ以上も可能です。ただ適切な使い方をしないとコードが複雑になるので、慎重に使うようにしましょう。

Java for文の処理を途中で抜ける方法

Javaのfor文は、特定の条件が満たされるまで繰り返し処理を実行するのが基本です。

しかし、処理の途中でループを抜けたり、特定の条件を満たす場合に処理をスキップしたりする方法もあります。

本章では処理を途中で抜ける以下2つの方法を解説しますね。

  • break文でループを抜ける方法
  • continue文でループをスキップする方法

順番にみていきましょう。

break文でループを抜ける方法

break文を使用すると、ループを途中で終了させることが可能です。特定のある条件が満たされた場合に、ループから抜け出すために使用します。

以下のサンプルコードを見てください。

  
// break文を使用してループを抜ける
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break; // iが5のときループを抜ける
    }
    System.out.println("iの値: " + i);
}
  

for ループ内で変数 i を1から10まで増やしながら処理を実行していますが、`if (i == 5)` の条件式が成立すると、break 文が実行され、ループが途中で終了します。

6以降の値は表示されません。

  
//出力結果
iの値: 1
iの値: 2
iの値: 3
iの値: 4
  

このように、break 文はループ内での条件が満たされた場合にループを抜け出すことができます。

continue文でループをスキップする方法

continue文は、for文全体を終わらせるのではなく、現在のループ処理の残りをスキップして次のループ処理を開始したい場合に使います。

以下は、continue 文を使用した例です。

  
for (int i = 1; i <= 5; i++) {
    if (i % 2 == 0) {
        continue; // iが偶数のとき、次のイテレーションに進む
    }
    System.out.println("iの値: " + i);
}
  

1から5までの数値をループで処理し、偶数の場合にはその数値を表示せず、奇数の場合には表示しています。

i % 2 は i を2で割った余りを表しており、偶数か奇数かを判定していますね。

i の値が偶数の場合、continue 文が実行され、そのループ処理がスキップされます。

  
//出力結果
iの値: 1
iの値: 3
iの値: 5
  

continue 文は、特定の条件に基づいて無駄な処理をスキップしたり、特定の条件下でのみ処理を実行したりするために役立ちます。

拡張for文の使い方

拡張for文は、コレクション内の要素を簡単に取得するための便利な方法です。

拡張for文の基本構文は以下の通り。

  
for (要素の型 変数名 : 配列名) {
    // 要素に対する処理を記述
}
  

アクセスする要素の型、変数名と配列名、コレクション名を書きます。

整数型の配列から要素を取り出して表示する例を見ていきましょう。

  
public class Main {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};

        for (int number : numbers) {
            System.out.println(number);
        }
    }
}
  

int 型の numbers 配列から要素を1つずつ取り出して number という変数に格納して格納されている順番通り出力しています。

  
//出力結果
1
2
3
4
5
  

拡張for文は便利ですが、要素のインデックスや要素自体を変更することはできません。

要素の変更が必要な場合は、通常のforループを使用するようにしましょう。

Java8のforEachメソッドの使い方

Java8以降では、forEachメソッドを使用してコレクション内の要素にアクセス可能です。

拡張for文と同様、forループを書かずにシンプルなコードで要素にアクセスできるため、プログラミングをより効率的に行えます。

forEachメソッドを使ったラムダ式の構文は以下の通りです。

  
コレクション名.forEach(要素 -> 処理);
  

具体例を見てみましょう。

  
import java.util.ArrayList;
import java.util.List;

public class ForEachExample {
    public static void main(String[] args) {
        List fruits = new ArrayList<>();
        fruits.add("りんご");
        fruits.add("バナナ");
        fruits.add("いちご");

        // リストの要素を表示
        fruits.forEach(fruit -> System.out.println(fruit));
    }
}
  

fruitsリストに対してforEachメソッドを呼び出し、ラムダ式`(fruit -> System.out.println(fruit))`を指定しています。

  
//出力結果
りんご
バナナ
いちご
  

このように、forEachメソッドを使用することで、リストやコレクション内の要素に対して簡単にアクセスし、処理が実行可能です。
Java8以降では、forEachを活用して、より効率的で可読性の高いコードを書くようにしましょう。

Java for文を使う際の注意点

for文は繰り返し処理を実行するために便利ですが、特に無限ループに陥ることがあるので注意しましょう。

無限ループは、条件式が常に真のままであるため、ループが永遠に終了しない状態です。

無限ループに陥ると、プログラムは応答しなくなり、システムの負荷が上昇する可能性があります。以下は無限ループの例です。

  
//条件式が省略されている場合の無限ループ
for (int i = 0;; i++) {
    // 無限ループ
}

//条件式がある場合の無限ループ
for (int i = 0; i < 5; i--) {
    // 無限ループ
}
  

このループは条件式を省略しているため、常に真と判定され、永遠に続行します。

また、条件式があるにもかかわらず、変化式が条件を満たさない場合も無限ループに陥ることもあるんですね。

無限ループに陥った場合、デバッグツールを使用して問題を特定し、修正しましょう。

CPUやメモリリソースを無駄に消費せず、スムーズなプログラムの実行を確保するために、for文の使い方に注意が必要です。

まとめ

これまで、Javaのfor文について網羅的に紹介してきました。Javaのfor文はプログラム内で同じ処理を繰り返す際に短いコードで処理が書けるので便利です。

しかし、無限ループに陥ると、CPUやメモリリソースを無駄に消費してしまうので注意しましょう。変化式が条件を満たすかどうか、ループが終了することを確認してみてください。

まだまだ知識が浅く、Javaの他の処理に関しても基礎知識をつけたい!応用的なJavaの書き方も学びたい!という方もいるでしょう。

本記事ではプログラミングに関する多くの疑問を解決できるので、参考にしてみてくださいね。