비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자이다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true와 false 둘 중의 하나이다.
비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교한다.
1. 대소비교 연산자 (<, >, <=, >=)
두 피연산자의 값의 크기를 비교하는 연산자이다. 비교 결과에 따라 참인 경우 true, 거짓인 경우에는 false를 반환한다.
기본형 중에서는 boolean형을 제외한 나머지 자료형들을 다 피연산자로 사용할 수 있지만 참조형은 피연산자로사용할 수 없다.
2. 등가비교 연산자 (==, !=)
두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다. 대소비교 연산자와는 달리 기본형은 물론 참조형, 즉 모든 자료형에 사용할 수 있다. 기본형의 경우 변수에 저장되어 있는 값을 비교하고, 참조형의 경우 객체의 주소값을 비교하여 같은 객체를 가리키고 있는지를 알 수 있다.
물론 기본형과 참조형은 서로 형변환이 가능하지 않기 때문에 등가비교 연산을 수행할 할 수 없다.
※ '>='와 같이 두 개의 기호가 합쳐진 연산자의 경우 '=>'와 같이 기호의 순서를 바꾸거나 '> ='와 같이 중간에 공백이 들어가서는 안된다.
비교 연산자도 이항 연산자이기 때문에 연산을 수행하기 전에 형변환을 통해 두 피연산자의 타입을 같게 맞춘다음 비교를 수행한다.
10 == 10.0f
// 10을 float로 변환하여 비교를 수행한다.
// 자동 형변환을 통해 10.0f == 10.0f 가 되기 때문에 true가 반환된다.
위의 예시와 같이 정수형과 실수형을 비교하는 경우 정수형 피연산자를 실수형으로 자동 형변환 하여 비교를 수행한다.
System.out.println(10.0 == 10.0f);
// true
System.out.println(0.1 == 0.1f);
// false
실수의 경우에는 주의해야할 사항이 있다. 위의 예제에서 10.0은 10.0f와 같은 값으로 판단하는데, 0.1은 0.1f와 다른 값으로 판단이 되기 떄문에 혼란스러울 수 있다. 그 이유는 정수형과 달리 실수형은 근사값으로 저장되기 때문에 오차가 발생할 수 있기 때문이다.
10.0f는 오차없이 저장할 수 있는 값이므로 double로 형변환해도 그대로 10.0이 되지만 0.1f는 저장할 때 2진수로변환하는 과정에서 오차가 발생한다. double 타입의 상수인 0.1도 저장되는 과정에서 오차가 발생하지만 float 타입의 리터럴인 0.1f보다 작은 오차로 저장된다.
float f = 0.1f;
// f에 0.10000000149011612로 저장된다.
double d = 0.1;
// d에 0.10000000000000001로 저장된다.
이로 인해서 0.1f와 0.1을 비교하였을 때 서로 다른 값으로 변환되어 비교가 되고, false를 결과로 받게된다.
그렇다면 float과 double은 비교할 때는 어떻게 해야할까? double 타입의 값을 float 타입으로 형변환한 다음에 비교해야 한다. 또는 어느 정도의 오차를 무시하고 두 타입의 값을 앞에서 몇자리만 잘라서 비교할 수도 있다.
- 문자열의 비교
두 문자열을 비교할 때는 '==' 연산자가 아닌 equals() 메서드를 사용해야 한다. 참조형에서 비교 연산자는 피연산자로 주어진 두 객체가 완전히 같은 것인지만 비교할 뿐 값을 비교하지는 않는다. 그렇기 때문에 값을 비교하기 위해서는 equals() 메서드를 사용해야 한다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 조건문 - if, switch (0) | 2021.08.21 |
---|---|
[JAVA] 연산자 - 논리 연산자 (0) | 2021.08.13 |
[JAVA] 연산자 - 산술 연산자 (0) | 2021.08.11 |
[JAVA] 연산자 - 단항 연산자 (0) | 2021.08.10 |
[JAVA] 연산자 (Operator) (0) | 2021.08.10 |