[備忘録 その８] Java Silver ～制御文～

# 制御文
制御文とは、プログラムの実行フローを制御するための文法です。代表的な制御文には以下のものがあります

### 1 \. 条件分岐(if文)
### 2 \. switch文
### 3 \. 繰り返し文(for文)
### 4 \. 繰り返し文(while文)

## 1 \. 条件分岐(if文)
### if文
if文は条件が真か偽かを評価し、真の場合にのみ特定のコードを実行します。されに、'else if'や'else'を使うことで、複数の条件に応じた分岐を作ることができます。

#### 基本構文(if-else)
```java
if (条件式) {
    // 条件式が真の場合に実行する処理
} else {
    // 条件式が偽の場合に実行する処理
}
```
#### 例
```java
int number = 10;

if (number > 0) {
    System.out.println("numberは正の数です。");
} else if (number < 0) {
    System.out.println("numberは負の数です。");
} else {
    System.out.println("numberは0です。");
}
```
#### 基本構文(else if)
```java
if (条件式1) {
    // 条件式1が真の場合に実行する処理
} else if (条件式2) {
    // 条件式1が偽で、条件式2が真の場合に実行する処理
} else {
    // 条件式1と条件式2がどちらも偽の場合に実行する処理
}
```
#### 例
```java
int number = 0;

if (number > 0) {
    System.out.println("numberは正の数です。");
} else if (number < 0) {
    System.out.println("numberは負の数です。");
} else {
    System.out.println("numberは0です。");
}
```
### 条件演算子
条件演算子(三項演算子)は、簡単な条件分岐を1行で記述するための演算子です。条件演算子は次のような形式となります。
```java
条件式 ? 真の場合の値 : 偽の場合の値
```
条件演算子を使うと、条件式が真であれば「真の場合の値」が返され、条件式が偽であれば「偽の場合の値」が返されます。これにより、短い条件分岐を簡潔に記述することができます。

#### 基本構文
```java
型 変数名 = 条件式 ? 真の場合の値 : 偽の場合の値;
```
例1
```java
int number = 10;
String result = (number > 0) ? "正の数" : "負の数または0";
System.out.println(result); // 正の数
```
例2
```java
int number = 7;
String result = (number % 2 == 0) ? "偶数" : "奇数";
System.out.println(result); // 奇数
```
例3
```java
int a = 5;
int b = 10;
int max = (a > b) ? a : b;
System.out.println(max); // 10
```
### if文のネスト
if文のネストとはif文の内部にさらにif文を含めることを指します。ネストされたif文を使うことで、複雑な条件分岐を細かく制御できます。ただし、深くネストさせるとコードの可読性が低下する可能性があるため、適切に使用することが重要です。

#### 基本的なネスト例
```java
int number = 10;

if (number > 0) {
    System.out.println("numberは正の数です。");
    
    if (number % 2 == 0) {
        System.out.println("numberは偶数です。");
    } else {
        System.out.println("numberは奇数です。");
    }
} else {
    System.out.println("numberは正の数ではありません。");
}
```
#### 多重ネストの例
```java
int a = 5;
int b = 10;
int c = 15;

if (a > b) {
    if (a > c) {
        System.out.println("aはbより大きく、かつcより大きいです。");
    } else {
        System.out.println("aはbより大きいですが、cよりは小さいです。");
    }
} else {
    if (b > c) {
        System.out.println("bはaより大きく、かつcより大きいです。");
    } else {
        System.out.println("bはaより大きいですが、cよりは小さいです。");
    }
}
```

## 2 \. switch文
switch文は、単一の変数や式の値に基づいて、複数のケースの中から実行するブロックを選択する条件分岐文です。これは、if-else文の複数条件をシンプルに表現するのに適しています。
#### 基本構文
```java
switch (式) {
    case 値1:
        // 式が値1と一致する場合に実行される処理
        break;
    case 値2:
        // 式が値2と一致する場合に実行される処理
        break;
    // 他のケース
    default:
        // どのケースにも一致しない場合に実行される処理
        break;
}
```
* 式：整数、文字、列挙型、文字列などの評価結果を使います。
* case：それぞれのケースは、式の評価結果と一致する値を指定します。
* break：各ケースの末尾に置かれ、スイッチ文から抜け出します。breakがない場合は、次のケースも続けて実行されます(フォールスルー)。
* defalut：どのケースにも一致しない場合に実行されるブロックです。
#### 例1
```java
int day = 3;
String dayName;

switch (day) {
    case 1:
        dayName = "月曜日";
        break;
    case 2:
        dayName = "火曜日";
        break;
    case 3:
        dayName = "水曜日";
        break;
    case 4:
        dayName = "木曜日";
        break;
    case 5:
        dayName = "金曜日";
        break;
    case 6:
        dayName = "土曜日";
        break;
    case 7:
        dayName = "日曜日";
        break;
    default:
        dayName = "無効な日付";
        break;
}

System.out.println(dayName); // 水曜日
```
#### 例2
```java
String color = "red";
String message;

switch (color) {
    case "red":
        message = "色は赤です";
        break;
    case "green":
        message = "色は緑です";
        break;
    case "blue":
        message = "色は青です";
        break;
    default:
        message = "未知の色です";
        break;
}

System.out.println(message); // 色は赤です
```

### フォールスルー
break文がない場合、次のケースに続けて実行されます。
```java
int month = 8;
String season;

switch (month) {
    case 12:
    case 1:
    case 2:
        season = "冬";
        break;
    case 3:
    case 4:
    case 5:
        season = "春";
        break;
    case 6:
    case 7:
    case 8:
        season = "夏";
        break;
    case 9:
    case 10:
    case 11:
        season = "秋";
        break;
    default:
        season = "無効な月";
        break;
}

System.out.println(season); // 夏
```



## 3 \. 繰り返し文(for文)
### for文
for文は、指定した回数だけ繰り返し処理を行うための制御構文です。

#### 基本構文
```java
for (初期化; 条件; 増分) {
    // 繰り返し処理
}
```
* 初期化：ループ開始時に一度だけ実行されるコード
* 条件：各反復の前に評価される式。trueである限りループを繰り返します。
* 増分：各反復の後に実行されるコード。通常、カウンタ変数を増減します。

```java
for (int i = 0; i < 10; i++) {
    System.out.println("iの値は " + i);
}
```
#### 例
```java
for (int i = 0; i < 10; i++) {
    System.out.println("iの値は " + i);
}
```
### 拡張for文(for-each文)
拡張for文は、配列やコレクション(ListやSetなど)の要素を順に処理するために使用されます。

### 基本構文
```java
for (要素の型 変数名 : 配列またはコレクション) {
    // 繰り返し処理
}
```
* 要素の型：配列またはコレクションの要素のデータ型
* 変数名：現在の要素を示す変数。
* 配列またはコレクション：繰り返し処理する配列やコレクション

### ネストされたfor文
for文の中に別のfor文を入れることができます。
#### 例
```java
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        System.out.println("i = " + i + ", j = " + j);
    }
}
```
### breakとcontinue
* break：ループを終了します。
* continue：ループの現在の反復を終了し、次の反復を開始します。
#### 例
```java
for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;  // iが5になるとループを終了
    }
    System.out.println("iの値は " + i);
}

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;  // iが偶数の場合、次の反復にスキップ
    }
    System.out.println("iの値は " + i);
}
```
### 無限ループ
条件を指定せずにfor文を使用すると、無限ループを作成できます。
#### 例
```java
for (;;) {
    // 無限ループ
    System.out.println("無限ループ");
}
```

## 4 \. 繰り返し文(while文)
while文は条件が真(true)である間、繰り返し処理を行う制御構文です。条件が偽(false)になった時点でループが終了します。while文には2種類あり、通常のwhile文とdo-while文があります。

### while文
#### 基本構文
```java
while (条件) {
    // 繰り返し処理
}
```
* 条件：ループを続けるかどうかを決定するブール式。条件が真である限り、ループ内の処理が繰り返されます。

#### 例
```java
int i = 0;

while (i < 5) {
    System.out.println("iの値は " + i);
    i++;
}
```

### do-while文
do-while文は、少なくとも一度はループ内の処理を実行し、その後条件を評価してループを続けるかどうかを決定します。
#### 基本構文
```java
do {
    // 繰り返し処理
} while (条件);
```

* 条件：ループを続けるかどうかを決定するブール式。ループ内の処理が少なくとも一度は実行され、その後条件が真である限り、ループが繰り返されます。
#### 例
```java
int i = 0;

do {
    System.out.println("iの値は " + i);
    i++;
} while (i < 5);
```
### breakとcontinue
while文とdo-while文でもbreakとcontinueを使用してループの制御を行うことができます。
※内容はfor文と同じ
#### 例
```java
int i = 0;

while (i < 10) {
    if (i == 5) {
        break;  // iが5になるとループを終了
    }
    System.out.println("iの値は " + i);
    i++;
}

i = 0;

while (i < 10) {
    if (i % 2 == 0) {
        i++;
        continue;  // iが偶数の場合、次の反復にスキップ
    }
    System.out.println("iの値は " + i);
    i++;
}
```
### while文とfor文の使い分け
* while文: 事前に繰り返し回数が決まっていない場合や、条件が変化するまで繰り返し処理を行う場合に適しています。
* for文: 繰り返し回数が事前に決まっている場合や、カウンタ変数を使って繰り返し処理を行う場合に適しています。


最初のページ
[[備忘録 その１] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/9fcf3a2cb4a7162aafcf "[備忘録 その１] Java Silver ～Javaプログラミング基礎～")

前のページ
[[備忘録 その７] Java Silver ～基本データ型の型変換～](https://qiita.com/MagicShowTime/items/f6ec6a1ae77954263c0a "[備忘録 その７] Java Silver ～基本データ型の型変換～")

次のページ
[[備忘録 その９] Java Silver ～クラス定義・オブジェクトの使用 その１～](https://qiita.com/MagicShowTime/items/f4b353f6aa1b4e8e6123 "[備忘録 その９] Java Silver ～クラス定義・オブジェクトの使用 その１～")