비교 연산자
는 두 피연산자를 비교해서 결과에 따라 ture/false
를 반환하는 연산자입니다.
피연산자가 두 개인 이항 연산자이기 때문에, 산술 연산자처럼 두 타입 중 크기가 더 큰 타입으로 형변환을 수행한 후에 비교 연산을 수행합니다.
대소비교 연산자
는 두 피연산자의 크기를 비교합니다. 수학 시간에 배웠던 부등호와 동일한 표식입니다. boolean
을 제외한 7가지 기본형에 사용할 수 있습니다.
단, <=, >=
는 조금 생소할 수 있는데 <=
는 ≤
, >=
는 ≥
의 역할(크거나/작거나 같다)을 합니다.
System.out.println(1 < 2);
System.out.println(1 > 2);
System.out.println(1 <= 1);
등가비교 연산자
는 두 피연산자 같은지 다른지를 비교하고 true/false
를 반환하는 연산자입니다. 대소비교 연산자와는 다르게 참조형
에도 사용할 수 있다는 특징이 있습니다.
참조형은 주소를 가리키기 때문에, 주소가 동일해야 같다고 판정합니다.
System.out.println(1 == 1.0); //int형 1이 더 큰 타입인 double형 1.0으로 변환되어 비교
System.out.println(0 == '0'); //char형 '0'이 더 큰 타입인 int형 30으로 변환 (0은 \u0030)
System.out.println(1 != 0);
우리가 볼 때 0.1과 0.1f는 자료형만 각각 double, float로 다르고 완전히 같은 숫자로만 보입니다. 하지만 자바에서 이를 실행시켜보면 다음과 같이 false라는 결과를 보여줍니다.
System.out.println(0.1 == 0.1f);
이러한 결과가 나타나는 이유는 실수 타입이 정확한 값이 아니라 근사값을 통해 저장되기 때문입니다.
0.1f
라는 float형 실수를 double로 캐스팅해서 출력해보면 다음과 같이 내부적으로는 전혀 다른 값이 저장되어있음을 알 수 있습니다.
System.out.println((double) 0.1f);
그래서 실수간의 연산을 수행할 때는 캐스팅을 하거나, 근사값 오차가 발생하지 않도록 주의해야합니다.