Java入門：第6回 処理の制御（if文とswitch文）

## はじめに
　前回は繰り返し処理を学びました。繰り返し処理はwhile文とfor文の2種類の文法があることを学びました。どちらも同じ処理を実現できますが、使い分けとしては次のようになります。

* while文・・・条件を指定して処理を繰り返したい場合に利用する
* for文・・・回数を指定して処理を繰り返したい場合に利用する

　繰り返し処理を行っている時にある場合にだけ処理を変化させたい場合、どのようにすればいいでしょうか。条件によって処理を切り分けることを条件分岐といいます。Javaではif文とswitch文の2つの文法が用意されています。まずif文から見て行きましょう。

## 1. 条件分岐：if文

```java
if (条件) {
  //処理
}
```
のように、条件を指定すると、条件に合致した場合にのみ、処理が実行されます。例えば繰り返し文で値が3の時に、出力を変えたい場合は次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3) {
    System.out.println("Xの値が3です:" + x);
  }
  x++;
}
```

xの値が3かどうか調べる場合、==という演算子を使います。xの値が３の時のみ{}の中に記述した命令が実行されます。

### 補足
```java
x++;
```
と記述した、++はインクリメントと呼ばれる演算子になります。意味は

```java
x = x + 1;
x += 1;
```

と同じで、xの値を一つ増やすという意味になります。

反対に、

```java
x--;
```
と記述すると値を一つ減らすことが出来ます。--をデクリメントといいます。

### 比較演算子
x == 3と記述した時にxの値が3の場合は、boolean型のtrueとなります。xの値が3で無い場合はfalseとなります。if(条件)にはboolean型の値が入ることになります。==以外に次のような演算子があります。これらの演算子を比較演算子といいます。

* x > 3・・・より大きい
* x < 3・・・より小さい
* x >= 3・・・以上
* x <= 3・・・以下
* x != 3・・・否定

!（エクスクラメーション：感嘆符）は否定という意味になります。xが3では無い場合に処理を実行したい場合は次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x != 3) {
    System.out.println("Xの値が3でない:" + x);
  }
  x++;
}
```

### if-else文
xの値が3の場合は処理Aを実行し、xの値が3でない場合は処理Bを実行したい場合は

```java
if (x == 3) {
   //処理A
} else {
   //処理B
}
```
のようにelse句を利用します。具体的には次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3) {
    System.out.println("Xの値が3である:" + x); 
  } else {
    System.out.println("Xの値が3ででない:" + x);
  }
  x++;
}
```

### if-else if-else文
条件が複数ある場合は

```java
if (x == 3) {
   //処理A
} else if (別の条件){
   //処理B
}
```

のようにelse if句を利用します。具体的には次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3) {
    System.out.println("xの値が3である:" + x);
  } else if(x == 6){
     System.out.println("xの値が6である:" + x);
  }
  x++;
}
```

else if句はいくつも記述することが出来ます。また最後の部分にelse句を利用することも出来ます。例えば0-10までの3の倍数の時にif文を利用して出力する場合は、次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3) {
    System.out.println("xの値が3である:" + x);
  } else if(x == 6){
    System.out.println("xの値が6である:" + x);
  } else if(x == 9) {
    System.out.println("xの値が9である:" + x);
  } else {
    System.out.println("xの値は3,6,9でない:" + x);
  }
  x++;
}
```

このコードは動作しますが、else if句の数が多くなると、{}が多くなるので、プログラムの見通しが悪くなる場合があります。そのようなときはswitch文を利用します。switch文を利用すると上記のif文は次のように記述することが出来ます。

## 2. 条件分岐：switch文

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  switch(x) {
  case 3:
    System.out.println("xの値が3である:" + x);
    break;
  case 6:
    System.out.println("xの値が6である:" + x);
    break;
  case 9:
    System.out.println("xの値が9である:" + x);
    break;
  default:
    System.out.println("xの値は3,6,9でない:" + x);
    break;
  }
  x++;
}
```

switch(x)と記述することでxで処理を切り分けなさいという意味になります。{}内部に記述したcase 3:などの値に合致した場合は、以降の処理が実行されます。「case 値」の後は;(セミコロン)ではなく:(コロン)であることに注意しましょう。以降の処理なので、値が3の場合は、その後に続く出力命令がすべて実行されます。そこで処理を行ったらswitch文から抜けるために、break;というキーワードを記述するのが一般的です。

また、defaultはcaseに合致しない場合に実行されます。つまりif文のelse句に相当する動作になります。次のように記述することで、3または6または9の場合に処理を実行させることが出来ます。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  switch(x) {
  case 3:
  case 6:
  case 9:
    System.out.println("xの値の倍数である:" + x);
    break;
  default:
    System.out.println("xの値は3の倍数でない:" + x);
    break;
  }
  x++;
}
```

if文の場合、このような処理はどのように記述するかというと、次のように記述します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3 || x == 6 || x == 9) {
    System.out.println("xの値の倍数である:" + x);
  } else {
    System.out.println("xの値は3の倍数でない:" + x);
  }
  x++;
}
```
||は「または」という意味になります。オア(or)と読みます。このような演算子を論理演算子といいます。他には「かつ」を示す&&があります。次のように利用します。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if (x == 3 && i == 3) {
    System.out.println("xが3かつiが3");
  }
  x++;
}
```
### 余剰
ここまでのif文とswitch文を利用して、10までの3の倍数の時に出力を変えてきました。ただし、正確には3の倍数には0も入りますし、例えば100までの3の倍数で処理を分岐しようとした場合は、if文やswitch文が長くなってしまいます。計算を行う代入演算子には割った余りを求める余剰というものがあります。余剰は％で表現します。3で割った余りが0であれば3の倍数であることを示すので、3の倍数の時に処理を行うには次のように記述することが出来ます。

```java
int x = 0;
for (int i = 0; i < 10; i++) {
  if ((x % 3) == 0) {
    System.out.println("3の倍数：" + x);
  }
  x++;
}
```

このように記述することで、例えば繰返しの回数を10から100に変えても、for文の中のロジックを変更しないでも動作するようになります。

###【応用・考察】
（１）
インクリメントとデクリメントは

```java
x++;
x--;
```

などと記述しますが(後置)、次のように記述することもできます(前置)。

```java
++x;
--x;
```

後置と前置では動作が少し異なります。どのように異なるか考えてみましょう。

（２）
論理演算子は、||(または)、&&(かつ)と記述すると述べましたが、|や&と記述することも出来ます、
||と|、&&と&で動作が少し異なります。どのように異なるか考えてみましょう。﻿