java.svg

【Java】条件式と条件分岐

Java

条件式

条件式は、関係演算子、等価演算子、論理演算子によって構成され、boolean 型(true, false)を返します。

関係演算子

関係演算子は、基本的に数値(int 型、double 型など)の大小関係を条件とする場合に使用します。

演算子説明
n < 3nが 3 より小さい場合true
n > 3nが 3 より大きい場合true
n <= 3nが 3 以下の場合true
n >= 3nが 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 == 3nが 3 の場合true
n != 3nが 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";