あらためてJavaを学習する（その2）条件分岐・繰り返し処理

## はじめに
環境構築編：[あらためてJavaを学習する（その0）](https://qiita.com/takuyaTT/items/982a2706cf716f34774b)
変数編：[あらためてJavaを学習する（その1）変数](https://qiita.com/takuyaTT/items/0921708989920d2fd398)

今回はプログラミングを行う上で用いる条件分岐や繰り返し処理についての備忘録！

## 条件分岐
* [if文](#if文)
* [switch文](#switch文)

## 繰り返し処理
* [for文](#for文)
* [拡張for文](#拡張for文)
* [while文](#while文)
* [do-while文](#do-while文)

### 条件式
**boolean型を返す式**のことであり、条件分岐や繰り返し処理は条件式の結果が**trueかfalse**かで処理を実行するか決める。

***
### `if文`
「もし〇〇だったらこの処理を行う」の記述。
一文で終わる場合は{ } は省略可能。

```java:if文
if ( 条件式 ) {
    処理;
}

// 省略形式
if ( 条件式 ) 処理;
```



### `if ~ else文`

「もし〇〇だったらこの処理を行い、違う場合はこの処理を行う」の記述。
なお、こちらも**短文の場合は省略が可能**(`条件演算子`または`3項演算子`と呼ばれる)。

```java:if~else文
if ( 条件式 ) {
    処理;
} else {
    処理;
}

// 3項演算子での省略形
条件式 ? 条件がtrueの場合の処理 : 条件がfalseの場合の処理;
```

### `if ~ else if ~ else文`
「もし〇〇だったらこの処理を行い、もし▲▲だったらこの処理を行い、違ったらこの処理を行う」の記述。

```java:if~elseif~else文
if ( 条件式1 ) {
    処理;
} else if ( 条件式2 ) {
    処理;
} else {
    処理;
}
```

### `switch文`
条件式が複数ある場合はswitch文を使うと記述がスッキリする。
処理に`break`を指定するとswitch文から抜ける。
case文の代わりに`defalut`を記述すると、case文で指定した値以外もしくはbreak指定でswitch処理から抜けていない場合の処理を行う。

昔は式の部分に指定できた型が`byte`,`char`,`short`,`int`,`enum(列挙型)`だけであったが、今は`String`も指定できる。

```java:switch~case文
switch ( 式 ) {
    case 値1 :
        処理;
        break;
    case 値2 :
        処理;
        break;
    case 値3 :
        処理;
        // break文が無いので、defalutの処理も行われる
    default :
        処理;
}
```

※SE12からは**swich式**が利用できるようになり、矢印caseラベルが利用できるようになりました。(breakが不要になりました)
また、SE13にてcaseラベルでは、breakではなく**yield**を利用することを推奨しています。
気になる方は下記URLをご参照ください。
https://docs.oracle.com/javase/jp/13/language/switch-expressions.html

***

### `for文`
〜回まで繰り返し処理を行いたい。といった場合に記述する。
「何回繰り返したのか」を数えるカウントために、整数型 (int型）の変数を用意。この変数を`カウンタ変数`という。

```java:for文
for( カウンタ変数の宣言と初期化; 条件式; カウンタ変数の加算) {
    処理;
}
```

### `拡張for文`
配列の繰り返し処理を行う際に利用できる。

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

### `while文`
条件に見合うまで繰り返し処理を行いたい場合に利用する。
条件に合わなければ繰り返し処理は行われない。

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

### `do-while文`
while文と違い、一度処理を行い、その後に条件と合致するか確認を行う。
合致すれば繰り返し処理を行い、合致しなければ処理を行わない。

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

## `break`と`continue`

| 記述 | 説明 |
| --- | --- |
| break | 繰り返し処理などの**ブロックから抜ける** |
| continue | continue以降の処理は行わず、繰り返し処理の頭へ強制的に**戻る** |

```java:break
for( データ型 カウンタ変数 = 値; 条件式; カウンタ変数の加算;{
     for( データ型 カウンタ変数 = 値; 条件式; カウンタ変数の加算;{
            break; // 上のfor文から抜ける
     }
     break; // 最初のfor文から抜ける
}
```

```java:continue
for( データ型 カウンタ変数1 = 値; 条件式; カウンタ変数1の加算;{
      for( データ型 カウンタ変数2 = 値; 条件式; カウンタ変数2の加算;{
            if( 条件式 ) {
                 continue; // 以降の処理を行わずに2つめのfor文の先頭に戻る
            }
            処理;
      }
}
```

### 無限ループ
while文などの条件式にtrueを指定することで無限ループが実現する。

```java:無限ループ
while(true){
    処理;
}
```
ちなみに極端な例だが…下記のコードも無限ループになる。

```java:無限ループ2
for(int i = 1; i < 10; i++) {
     while(true){
         if( i == 3 ){
             break;
         }
     }
} 
```
カウンタ変数iが3になりbreak処理を行うが、break処理で抜けるのはwhile文からの処理であり、for文からは抜けない。つまり次のfor文に処理が移り、カウンタ変数iは4になるため無限ループに再度突入する。

実際に実行して試した場合は無限ループのため処理が終わらないので強制終了で止める。
止め方はキーボードの **ctrlボタン + c**

### 繰り返し処理からの抜け方
breakで指定の繰り返し処理からも抜けたい場合は、条件式の部分にtrue/falseを判定する変数(フラグ)を用意するか、`ラベル`を利用する。

#### 変数を利用する場合

```java:変数利用
boolean flag = true;
while(flag){
    for( int i = 1; i < 5; i++) {
          if(i == 3) {
               flag = false;
               break;
          }
    }
}
```

#### ラベルを利用する場合
`ラベル`は**コード中の場所を示す印**。
ラベルの記述方法は、`ラベル名:`
ラベル名は任意で付けられるが、予約語などの命名規約に注意。
breakの後にラベル名を指定することで、ラベル名を付けた処理から抜けられる。

```java:ラベル利用
LOOP: while(true) {
	for(int i = 1; i < 5; i++) {
		if(i == 3) {
			break LOOP;
		}
	}
}
```

## サンプルコード
* 条件分岐
* 繰り返し処理
* 2つの組み合わせ

```java:Sample4.java
public class Sample4 {

	public static void main(String[] args) {
		int num = 1;
		// 条件分岐(if)
		if(num == 1) {
			System.out.println("numは1");
		}else if(num == 2 ) {
			System.out.println("numは2");
		}else {
			System.out.println("numは2より大きい");
		}
		// 条件分岐(switch)
		switch(num) {
		case 1:
			System.out.println("numは1");
			break;
		case 2:
			System.out.println("numは2");
			break;
		default:
			System.out.println("numは2より大きい");
		}

		// 繰り返し処理(for)
		for(int i = 1; i < 5; i++) {
			System.out.print(i + "回目,");
		}
		System.out.println();
		// 繰り返し処理+条件分岐(for)
		for(int i = 1; i < 5; i++) {
			if(i < 4) {
				System.out.print(i + "回目,");
			}else {
				System.out.println(i + "回目");
			}
		}

		// 繰り返し処理(拡張for)+条件分岐(switch)
		String[] progs = {"Java","PHP","Ruby","JavaScript","fugafuga"};
		String url;
		for(String prog: progs) {
			switch(prog) {
			case "Java":
				url= "https://www.java.com/ja/";
				break;
			case "PHP":
				url= "https://www.php.net";
				break;
			case "Ruby":
				url= "https://www.ruby-lang.org/ja/";
				break;
			case "JavaScript":
				url= "https://developer.mozilla.org/ja/docs/Web/JavaScript";
				break;
			default:
				url= "???";
			}
			System.out.println("["+ prog + "] " + url);
		}

		// while文
		int count = 0;
		while(count < 3) {
			System.out.print(count);
			count++;
		}
		// do~while文
		do {
			System.out.print(count);
		}while(count < 3);
	}
}
```

実行結果

```
numは1
numは1
1回目,2回目,3回目,4回目,
1回目,2回目,3回目,4回目
[Java] https://www.java.com/ja/
[PHP] https://www.php.net
[Ruby] https://www.ruby-lang.org/ja/
[JavaScript] https://developer.mozilla.org/ja/docs/Web/JavaScript
[fugafuga] ???
0123
```