【Java】条件式と条件分岐
条件式
条件式は、関係演算子、等価演算子、論理演算子によって構成され、boolean 型(true
, false
)を返します。
関係演算子
関係演算子は、基本的に数値(int 型、double 型など)の大小関係を条件とする場合に使用します。
演算子 | 説明 |
---|---|
n < 3 | n が 3 より小さい場合true |
n > 3 | n が 3 より大きい場合true |
n <= 3 | n が 3 以下の場合true |
n >= 3 | n が 3 以上の場合true |
以下のように型の違う比較もできます。
int n1 = 1;
double n2 = 1.5;
System.out.println(n1 < n2); // true
数値以外にも文字(char 型)の比較もできます。文字を比較する場合は文字コードによって大小関係が決まります。
char c1 = 'a', c2 = 'b';
System.out.println(c1 < c2); // true
等価演算子
等価演算子は、値が等しいまたは等しくないことを条件とする場合に使用します。
演算子 | 説明 |
---|---|
n == 3 | n が 3 の場合true |
n != 3 | n が 3 でない場合true |
等価演算子は、数値や文字だけに限らず、文字列やインスタンスの比較にも使用できます。
しかし、これは単純な値の比較ではありません。以下の文字列の比較をみてもらうとわかる通り、値は同じでも結果はfalse
となります。
String s1 = "abc", s2 = "abc";
System.out.println(s1 == s2); // false
MyClass o1 = new MyClass();
MyClass o2 = new MyClass();
System.out.println(o1 == o2); // false
これは、設定された値の比較ではなくアドレスを比較しているためです。 アドレスとは、インスタンスの保存先を表す値になります。
文字列やインスタンスを論理的に比較する場合は、equals()
を使用します。
String s1 = "abc", s2 = "abc";
System.out.println(s1.equals(s2)); // true
自作クラスの場合は、equals()
をオーバーライドして定義します。
class MyClass {
String field = "";
@Override
public boolean equals(MyClass org) {
return this.field.equals(org.field);
}
}
論理演算子
論理演算子には&&
, ||
, !
の 3 種類があります。
&&
は、複数の条件を扱う場合に使用し、すべての条件を満たす場合にtrue
となります。
int n1 = 1, n2 = 2;
System.out.println(n1 > 0 && n2 > 0); // true
System.out.println(n1 > 0 && n2 < 0); // false
System.out.println(n1 < 0 && n2 < 0); // false
||
も複数の条件を扱う場合に使用し、どれか 1 つの条件を満たせばtrue
となります。
int n1 = 1, n2 = 2;
System.out.println(n1 > 0 || n2 > 0); // true
System.out.println(n1 > 0 || n2 < 0); // true
System.out.println(n1 < 0 || n2 < 0); // false
論理演算子の判定順は通常の数式と同じく左から順に判定されます。()
がある場合はそちらが優先されます。
また判定が不要になった時点で、後続の条件式は無視されます。
int n1 = 1, n2 = 2;
//n1 < 0 が false のため もう1つの条件式に限らず false になる
//よってn2 > 0 は実行されない
n1 < 0 && n2 > 0
//n1 > 0 が true のため もう1つの条件式に限らず true になる
//よってn2 > 0 は実行されない
n1 > 0 || n2 > 0
後続の条件式を無視せず判定を行いたい場合は、&
、|
のように記号 1 つとします。
String s = null;
//これは正しく動く
s != null && s.equals("abc")
//これはequals()が実行されるタイミングでエラーになる
s != null & s.equals("abs")
!
は排反(否定)になります。
System.out.println(!(true)); //false
System.out.println(!(false)); //true
if 文
if 文は最も基本的な条件分岐です。
if (条件式) {
//trueの場合に処理する
} else {
// falseの場合に処理する
}
else
は不要であれば省略できます。
また以下のように else if
で複数の条件分岐ができます。
if (n == 1) {
System.out.println("One");
} else if (n == 2) {
System.out.println("Two");
} else if (n == 3) {
System.out.println("Three");
} else {
System.out.println("Other");
}
switch 文
switch 文には条件式ではなく、変数がどのような値をもつかで条件分岐を行います。
switch (変数) {
case 値:
//変数が指定した値の場合に処理する
break;
default:
//全ての条件に当てはまらない場合に処理する
}
case
の最後には必ずbreak
が必要になります。break
を忘れると、その後の判定も実行されてしまいます。
if 文で使用したelse if
の例を switch 文に置き換えると以下になります。
swtich (n) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
case 3:
System.out.println("Three");
break;
default:
System.out.println("Other");
}
java7 以降のバージョンであれば、文字列を指定することができます。
switch (str) {
case "One":
System.out.println("1");
break;
case "Two":
System.out.println("2");
break;
case "Three":
System.out.println("3");
break;
default:
System.out.println(str);
}
三項演算子
三項演算子は、条件によって値を分岐したい場合に使用します。
int var = 条件式 ? trueの場合の値 : falseの場合の値
以下のように単純の条件であれば三項演算子を用いることでコーディングの量を減らすことができます。 複雑な条件の場合は可読性が下がるため通常の if 文を使うほうが良いとされています。
//ifを使う場合
String str1 = "";
if (n == 1) {
str1 = "One";
} else {
str2 = "Other"
}
//三項演算子を使う場合
String str2 = n == 1 ? "One" : "Other";