【Java】制御文 ( if, else, else if, switch )

#制御分とは
読んで字のごとく「プログラムを制御する文」 ですがプログラムの制御は「分岐」と「繰返し」の2つに分類できます。

- 「分岐」には、if文とswitch文の2つの構文
- 「繰返し」には、for文とwhile文、do-while文の3つの構文が存在します。

##if文
if文 は、括弧の中の条件によって処理の流れを分岐させます。
**条件式の判定がtrueのときに実行する処理を記述します。**それ以外の時には処理は行われない。

```
if (条件式) {
     条件式が true の場合に行う処理
}
```
##else文
else文 「それ以外」の場合、つまり**if文の条件式の判定がfalseのときに実行する処理**を記述します。

```
if (条件式) {
     条件式が true の場合に行う処理
} else {
     条件式が false の場合に行う処理
}
```
##else if文
else-if文 は、**if文の条件式の判定結果が false だった場合に、別の条件式を付け加えて判定が行われます。**
そして、else-if文の条件式の判定結果が true だった場合に、else-if文の { } 内の処理が実行されます。

```
if (条件式１) {
     条件式１が true の場合に行う処理
} else if (条件式２) {
     条件式１が false で、条件式２が true の場合に行う処理 
}
```
制御文を用いたサンプルプログラム（数字）

```java
// 年齢を入れるint型の変数oldに34を代入
int old = 34;

// もし、20歳以上の場合は、"成人です。"と表示
if (old >= 20) {
    System.out.println("成人です。");

// でももし、19歳の場合は、"もうすぐ二十歳です。"と表示
} else if (old == 19) {
    System.out.println("もうすぐ二十歳です。");

// それ以外の場合は、"未成年です。"と表示
} else {
    System.out.println("未成年です。");
}

```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613675/c3ea6690-e67d-c85f-ecb7-b5f8e5fd7925.png)

##制御文を用いたサンプルプログラム(文字列)

先程行ったように、Stringクラス（文字列を扱うクラス）の比較の場合、== ではなく equals を使用します。
下記は自分がでんきタイプのポケモンだった場合、相手のポケモンに対して攻撃を与えた場合のメッセージを出力するイメージです。（本当はもっと複雑で簡単に書けるとは思いますが、多めにみてください。。）

```java
        // 自分のタイプと敵のタイプをいれるStringクラスを用意。
        String myType = "でんき";
        String enemyType = "敵のタイプを入力する";

        // もし enemyType が"みず"の場合、"こうかは ばつぐんだ！"と表示
        if (enemyType.equals("みず")) {
            System.out.println("こうかは　ばつぐんだ！");

            // でももし、enemyType が "じめん","いわ" の場合、"こうかがないようだ"と表示
        } else if (enemyType.equals("じめん") || enemyType.equals("いわ")) {
            System.out.println("こうかがないようだ");
            // でももし、enemyType が同じタイプ( myType )の場合、"こうかはいまひとつのようだ"と表示
        } else if (enemyType.equals(myType)) {
            System.out.println("こうかはいまひとつのようだ");
            // それ以外の場合、"ダメージをあたえた"と表示
        } else {
            System.out.println("ダメージをあたえた");
        }
```

実行結果

```java

String enemyType = "でんき"; //こうかはいまひとつのようだ
String enemyType = "じめん"; //こうかがないようだ
String enemyType = "みず"; //こうかは ばつぐんだ！
String enemyType = "ノーマル"; //ダメージをあたえた
```

##複数条件の分岐
条件文を複数にしたいときもあります。
例えば、年齢が25歳未満で学生であれば、学割パックが使えます、としましょう。

```java
// 年齢
int age = 24;

// 学生かどうか
boolean is_student = true;
```

複数条件を指定する場合には [論理演算子](https://blue-inc.backlog.jp/wiki/JAVA_STUDY/%E5%88%B6%E5%BE%A1%E5%88%86%28%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%29) を使用します。

|記号	| 意味  |機能                             |
|-------|-------|--------------------------------|
|a && b	| 〜かつ    |aとbが共にtrueの場合にtrue       |
| a &#124;&#124; b|〜または    |aかbのどちらかがtrueの場合にtrue  |
|! a     | 〜ではない    |aがtrueでないときにtrue       |


ここで、普通の男性の条件を満たしていて結婚していい相手かどうか判定するプログラムを組んでみます。

```java

        int height = 168;//身長
        int annual_income = 3000000;//年収
        boolean college_graduation = false;//大卒
        boolean regular_employee = false;//正社員
        boolean cleanliness = false;//清潔感
        boolean manners = false;//常識やマナー

        if (height < 170 && annual_income < 5000000 && college_graduation && regular_employee && cleanliness && manners) {
            System.out.println("結婚してもいい");
        } else {
            System.out.println("お見送り");
        }

``` 

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613675/f4cd42c6-bd4e-9cbe-522a-1fb96fb7fc1d.png)

## else if

普通の男の条件を満たしていれば女性と結婚する資格を得ることができますが、**年収が600万以上であれば、とりあえず一度お会いする権利を得られる**としましょう。

```java
        int height = 168;// 身長
        int annual_income = 3200000;// 年収
        boolean college_graduation = false;// 大卒
        boolean regular_employee = false;// 正社員
        boolean cleanliness = false;// 清潔感
        boolean manners = false;// 常識やマナー

        // 身長170以上, 年収500万以上、大卒、正社員、清潔感がある、マナーがある場合は結婚を検討する
        if (height < 170 && annual_income < 5000000 && college_graduation && regular_employee && cleanliness
                && manners) {
            System.out.println("結婚してもいい");
            // でももし、年収が600万以上であれば、とりあえず一度お会いする権利を得られる
        } else if (annual_income > 6000000) {
            System.out.println("一回会ってみる？");
            // それ以外はお見送りする
        } else {
            System.out.println("お見送り");

        }
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613675/f4cd42c6-bd4e-9cbe-522a-1fb96fb7fc1d.png)

##switch文
switch文は、括弧内の式によって処理の流れを分岐します。
ひとつの式の結果から多方向に分岐する、多分岐処理で使用します。

主な特徴、記述方法は以下のとおりです。

```
switch (式) {
    case 値１:
        式が 値１ の場合に行う処理;
        break;
    case 値２:
        式が 値２ の場合に行う処理;
        break;
    default:
        式が上記case選択肢のどれにも当てはまらない場合に行う処理;
        break;
}
```

記述の手順は

 1. 複数のcaseという選択肢を記述し分岐させる
 2. 各々のcaseの最後にbreak文を記述することで、処理中の
 3. caseを終了してswitch文から抜ける
 4. どのcase選択肢にも当てはまらない場合は、defaultを記述することで、 if文の else と同等の機能を持たせる

###switch文を使ったプログラム例

```java
      String myType = "かくとう";
        String enemyPokemon = "ユンゲラー";
        String defenseEnemyType = "エスパー";
        int atack_dmg_point = 50;

        switch (defenseEnemyType) {
            case "いわ":
                System.out.println("こうかはばつぐんだ！");
                System.out.println("てきの" + enemyPokemon + "に" + atack_dmg_point * 2 + "ダメージ!");
                break;
            case "エスパー":
                System.out.println("こうかはいまひとつのようだ");
                System.out.println("てきの" + enemyPokemon + "に" + atack_dmg_point /2 + "ダメージ!");
                break;
            case "ゴースト":
                System.out.println("こうかがないようだ");
                break;
            default:
                System.out.println("てきの" + enemyPokemon + "に" + atack_dmg_point + "ダメージ!");
                break;
        }
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613675/dd62e4a5-84f6-ce46-705f-802019dae81f.png)
少しゲームの内側がわかってきて楽しくなってきましたｗ

# 参考文献
- [【Java入門】if文って何？条件分岐（else、and・or・not）の使い方](https://www.internetacademy.jp/it/programming/java/java-if-statement.html)
- [【ポケモン剣盾】タイプ相性表と弱点一覧｜検索機能付き【ソードシールド】](https://game8.jp/pokemon-sword-shield/298091)