【Java開発】第4回 ループ

#初めに

皆さん。こんにちは！

DreamHanksの254cmです。

今回はループについて説明していきます。。

Java記事のまとめは[こちら](https://qiita.com/DreamHanks/items/6b1996e1f8ed66bbd456)です。

前回の記事は[【Java開発】第3回 条件分岐](https://qiita.com/drafts/45b1df7ba96f3bbe2209/edit)です。

##ループ

###・ループとは？

ループは何かの条件を満足している間、任意の処理を繰り返して実行させることです。

Javaではループ動作を行うために四つの技術を提供しています。

###・Javaループの種類

  　・for文
　・拡張for文
　・while文
　・do while文

上記の四つのものがJavaのループです。

##for

###・forとは？

```java
for(初期化式 ; 条件式 ; 変化式 ) {	
	処理
	処理
}	
```
for文は条件式がTRUEなっていた間に括弧「**{ }**」の中にある処理を繰り返して行うものです。

処理はfor文の条件式がFALSEになると行わないです。

つまり、処理は条件式がtrueになる間には実行され、falseになってからは終了されます。

forは繰り返す回数が定められている場合によく使われます。

####〇 初期化式とは？

初期化式に記述したソースコードはfor文で最初に条件式が判定される前に一回だけ実行されるソースコードです。

普段はfor文の回数をカウントするための変数を初期化します。

・サンプル

```java
int sum = 0;

for(int i = 0; i < 5; i ++) {
    sum += i;
}
```

上記のソースコードを見ると

初期化式で「**int i = 0;**」と作成して変数 iを宣言しています。

このように初期化式ではforで使う変数を宣言したりします。

####〇 変化式とは？

変化式には繰り返す処理が一度終わるたびに実行されるソースコードを作成します。

主にforの繰り返す回数を増やすために使われます。

・サンプル

```java
int sum = 0;

for(int i = 0; i < 5; i ++) {
    sum = sum + i;
}
```
上記のソースコードを見ると、

変化式に初期化式で宣言されたiを操作しています。

増減演算子「**++**」を使ってiの値を変化させています。

forについての理解を深めるために上記のforのループ1回目の実行順序を説明します。

① 初期化式が実行され、「**int i = 0;**」が宣言および初期化されます。

② 条件式を確認します。現在iの値は0であり、i < 5条件はtrueになります。

③ 条件式がtrueなので、括弧の処理「**sum = sum + i;**」が実行されます。

④ sumの値0とiの値０を足した結果を変数sumに代入します。

⑤ ブロックの処理が終わり、iの増減演算子が実行されます。

⑥ 増減演算の結果が反映され、iの値は1になります。

ここまでが1回目のループの過程です。

2回目のループからは初期化式が実行されなく、②~⑥まで栗化されます。

このようなループは条件式がfalseになるまで繰り返されます。

つまり、iが5になるまで繰り返されます。

##拡張for

###拡張forとは？

```java
for (データ型 変数名: 配列変数の変数名){	
	処理
	処理
}
```

拡張forは配列やコレクションから要素を一個ずつ出し、出された値を変数に代入して操作するforです。

拡張for文は抽出したい配列やコレクションと抽出された値を入れる変数で構成されています。

拡張for文はコレクションのデータをすべて抽出するまで、繰り返します。

要素はindex 0から順に抽出されます。

拡張forは配列やコレクションを学ぶ前には理解しにくいので、

今後、配列を学んでから勉強すると良いです。

※変数は抽出された値を代入するために存在するので、抽出される値とデータ型が一致しなければなりません。

・サンプル

```java
int[] arr = {1, 2, 3, 4, 5};

for(int a : arr) {
    System.out.println(a);
}
```

上記のソースコードを実行してみると、拡張forが配列の要素を一個ずつ抽出します。

要素が抽出されるたびに括弧の内容が実行され、実行結果は

```
1
2
3
4
5
```

になります。

##while

###whileとは？

```java
while (条件式){	
処理	
処理	
}	
```


whileは条件が満足されている間は括弧の中にある処理を何度でも繰り返すものです。

for文は繰り返す回数を指定していますが、while文は条件が満足されている間には無限に繰り返します。

つまり、繰り返す回数をよくわからない場合によく使われます。

whileは条件式を判定してtrueだった場合には括弧の処理を行います。

whileは初期化式がないので、必要な変数はwhileの外で宣言して使う方が楽です。

※forとwhileは中の処理を繰り返すものなので、中で変数を宣言すると次のループでまた宣言されるので
値の変化が保存されません。

・サンプル

```java

int value = 0;
int count = 0;
while (value < 100) {
    if (count%2 == 0){
         value = value + count;
    }
    count++;
}
```

上記のソースコードを見ると何回繰り返すのかわからなくても

特定の条件式「**value < 100**」が満足されるまで繰り返すことができます。

##do/while

```java
do{					
	処理				
	処理				
} while (条件式);					

```

do/whileは条件式がtrueであるまで、doの中の処理を繰り返すものです。

do/whileはwhileと似たようなものですが、

今までのループと異なり、do/whileは実行される時に条件式がfalseでも最初の1回は無条件に実行されます。


・サンプル

```java
int a = 1;

do {
    System.out.println(a);
} while(a > 10);

```

上記のソースコードを見ると変数aは1なので条件式「**a > 10**」は満足できません。

しかし、do/whileは条件式が満足できなくてもdoの処理を1回実行します。

なので、上記のソースコードを実行すると

```
1
```

が出力されます。

#ループの制御

今までのループは条件式がtrueであると次のループに行くまで中にある処理を全部実行します。

しかし、Javaではその流れを強制に制御することができます。

Javaはループの処理を制御するために二つのものを提供します。

　　・continue
　　・break

ただし、このようなループ制御は注意して使わないと意図した通り動かないです。

##continue

continueは実行されるとcontinueが書いている以下の処理を無視して

次のループに行きます。

・サンプル

```java

for(int i = 0; i < 5; i++) {
    if( i == 3) {
        continue;
    }
    System.out.println(i);
}
```

上記のソースコードではiが3になった時、ifの条件式が満足され、

ifのcontinueが実行されます。

continueが実行された時、continue以下に存在する「**System.out.println(i);**」が無視されて

実行されません。

ですから上記のソースコードの実行結果は

```
0
1
2
4
```

になります。

ただし、continueはifとかで注意して管理しなければなりません。

ifを使わないと

```java

for(int i = 0; i < 5; i++) {
    continue;
    System.out.println(i);
}
```
continueがループするたびに実行され、continue以下のソースコードは永遠に実行されません。


##break

breakは実行された時、該当ループ自体を完全に終了させます。

・サンプル

```java

for (int i = 0; i < 5 ; i++) {
    if( i == 3) {
        break;
    }
    System.out.println(i);
}
```
上記のソースコードではiが3になった時、ifの条件式が満足され、

ifのbreakが実行されます。

breakが実行された時、ループが終了され、4番目と5番目のループは実行されません。

ですから上記のソースコードの実行結果は

```
0
1
2
```

になります。

このbreakも上記のcontinueと同じように実行されるタイミングを注意して管理します。

#終わりに

今回の記事は以上になります。

次回はJavaの[クラス](https://qiita.com/DreamHanks/items/bf001a3ff9290cbbaec1)を学びましょう。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認することができます。

ご覧いただきありがとうございます。