HOWTO · Java

Java의 `!=` 비교 연산자와 `=!` 대입·부정 표현의 차이

`!=`는 Java의 같지 않음 비교 연산자입니다. `=!`는 연산자가 아니라 `a = !b`처럼 대입과 불리언 부정을 함께 쓴 표현입니다.

이 페이지의 내용

Java에서 !=는 피연산자의 값이 서로 다를 때 true를 반환하는 같지 않음 비교 연산자입니다. 문자 조합 =!는 연산자가 아닙니다. a = !b와 같은 식에서 Java는 =를 대입으로, !를 불리언 부정으로 해석하므로 b를 부정한 값을 a에 대입합니다.

아래 예제에서는 각 비교의 불리언 결과와 대입에 부정을 결합했을 때 조건문에 어떤 영향을 주는지 살펴봅니다.

Java != 같지 않음 비교 예제

!=를 사용하면 두 값을 비교할 수 있습니다. 두 값이 같으면 false, 다르면 true를 반환합니다. 기본형 숫자 값은 값 자체를 비교하고, 참조 값은 참조가 서로 다른 객체를 가리키는지 비교합니다. 같음 비교 결과를 부정하려면 !(a == b)라고 쓸 수 있으며, 이 식은 a != b와 같은 불리언 결과를 냅니다.

이 연산자는 불리언 값을 반환하므로 if 조건에 바로 사용하거나 불리언 변수에 저장할 수 있습니다. 예를 들어 if (count != limit)은 두 기본형 값이 다를 때 실행됩니다. 객체를 비교할 때 !=는 객체의 내용이 아니라 동일성을 확인합니다. 서로 다른 두 String 객체에 같은 문자열이 들어 있어도 참조 동일성 기준으로는 같지 않다고 판정될 수 있습니다. 객체의 내용을 비교하려는 경우에는 equals를 사용하세요. !(a == b)의 괄호는 먼저 같음 비교를 한 다음 그 결과를 부정한다는 순서를 분명히 해 줍니다. 긴 조건을 읽을 때 이 동치 관계가 도움이 될 수 있지만, 보통은 a != b가 더 간결합니다.

public class Main {
  public static void main(String[] args) {
    int a = 10;
    int b = 10;
    System.out.println(a != b);

    a = 20;
    System.out.println(a != b);
    System.out.println(!(a == b));
  }
}
false
true
true

첫 번째 값 쌍에서는 비교 결과가 false입니다. a를 바꾸면 두 값이 달라지므로 같지 않음 비교와 부정한 같음 비교가 모두 true가 됩니다.

Java =! 대입과 부정 예제

Java에는 결합된 =! 연산자가 없습니다. a = !b에서는 먼저 !b를 계산한 뒤 그 불리언 결과를 a에 대입합니다. 같은 대입식을 if 조건에도 사용할 수 있습니다. 조건은 대입된 불리언 값을 받으며, 그 값이 true이면 블록이 실행됩니다. 이 문법은 유효하지만 조건을 검사하는 동안 a의 값도 바뀝니다. 대입이 필요하지 않다면 if (!b)처럼 조건만 표현하는 편이 더 읽기 쉬운 경우가 많습니다.

대입은 단항 부정보다 우선순위가 낮으므로 식은 a = (!b)로 묶입니다. 대입식 자체도 불리언 값을 가집니다. 식의 값은 a에 방금 저장한 값입니다. 그래서 Java는 이 식을 if의 조건으로 허용합니다. 여기서는 a를 다른 값과 비교하는 것이 아닙니다. 대입이 의도된 경우에는 유용할 수 있지만, 비교식이라고 생각한 독자에게는 혼란을 줄 수 있습니다. 값을 저장하는 일과 별도의 검사가 모두 필요하다면 두 동작이 분명히 드러나도록 먼저 대입하고 다음 문장에서 검사하세요.

public class Main {
  public static void main(String[] args) {
    boolean a;
    boolean b = true;
    a = !b;
    System.out.println("a = " + a);

    b = false;
    if (a = !b) {
      System.out.println("condition is true; a = " + a);
    }
  }
}
a = false
condition is true; a = true

b가 true이면 !b는 false가 되고, 그 값이 a에 대입됩니다. 이후 b가 false일 때 조건식의 대입은 a에 true를 저장하며, 이 값이 true이므로 if 블록이 실행됩니다. 식을 a = !b처럼 띄어 쓰면 대입과 부정을 구분하기 쉽지만, 공백은 식의 의미를 바꾸지 않습니다.