<비교 연산자의 정의>
비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자로,
주로 조건문과 반복문의 조건식에 사용되며,
연산 결과는 오직 true와 false 둘 중 하나이다.
<비교 연산자의 종류>
수학에서 두 수 및 두 식에 대한 크기 비교를 나타내는 식인 부등식에서
사용하는 부등호(<,>,≤,≥,≠)와 같은 것이다.
영어 표현도 함께 익혀두는 것이 좋다.
x > y 라는 식을
수학에서처럼 'x가 y보다 크다' 또는
'x가 y가 크다면'의 조건적 해석보다는
'x가 y보다 큰가?'라고 해석하는 게 좋다.
true와 false 중 하나의 결과를 반환하기 때문이다.
int x = 10;
int y = 20;
boolean z = x < y;
System.out.println(z); // true
y = 10;
z = x == y;
System.out.println(z); // true
주의할 점은
>=와 같이 두 개의 기호로 이루어진 연산자는
=>와 같이 기호의 순서를 바꾸거나
> = 와 같이 중간에 공백이 들어가서는 안된다.
<대소 비교 연산자>
두 연산자의 값의 크기를 비교하는 연산자이다.
참이면 true를, 거짓이면 false를 결과로 반환한다.
기본형 중에서는 boolean 타입을 제외한
나머지 데이터 타입에 다 사용할 수 있지만
참조형에는 사용할 수 없다.
<등가 비교 연산자>
두 피연산자의 값이 같은지 또는 다른지 비교하는 연산자이다.
대소 비교 연산자와는 달리,
모든 데이터 타입에 사용할 수 있다.
기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고,
참조형의 경우 객체의 주소 값을 저장하기 때문에
두 개의 피연산자(참조 변수)가 같은 객체를 가리키고 있는지를 알 수 있다.
기본형과 참조형은 서로 형변환이 가능하지 않기 때문에
등가 비교 연산자로 기본형과 참조형을 비교할 수 없다.
<비교 연산자의 형변환>
비교 연산자도 이항 연산자이므로
연산을 수행하기 전에 형변환을 통해
두 피연산자의 타입을 같게 맞춘 다음
피연산자를 비교한다.
System.out.printf("'A' > 'B' \t %b%n", 'A' > 'B'); // false
System.out.printf("10f < 10d \t %b%n", 10f < 10d); // false
System.out.printf("'0' >= 10 \t %b%n", '0' >= 0); // true
System.out.printf("'A' <= 65 \t %b%n", 'A' <= 65); // true
System.out.printf("10 == 10.0f \t %b%n", 10 == 10.0f); // true
System.out.printf("'A'+ 1 != 'B' \t %b%n", 'A'+ 1 != 'B'); // false
※\t : tap만큼의 일정한 간격을 띄운다.
실수형인 float와 double 사용 시 주의사항이 있다.
System.out.println(10.0 == 10.0f); // true
System.out.println(0.1 == 0.1f); // false
위 예제에서 두 문장 모두 true가 나올 것 같지만,
아래 문장은 오차가 발생되어 false라는 결과가 반환되었다.
이유는 다음과 같다.
float f = 0.1f;
double d = 0.1;
System.out.printf("%19.17f%n", f); // 0.10000000149011612
System.out.printf("%19.17f%n", d); // 0.10000000000000000
※ %19.17f : 소수점 17번째 자리까지 출력하라.
정수형과 달리 실수형은 근사값으로 저장되어
오차가 발생할 수 있다.
10.0f는 오차 없이 저장할 있는 수 있는 값이라서
double로 형변환해도 그대로 10.0이 되지만
0.1f는 저장할 때 2진수로 변환하는 과정에서 오차가 발생한다.
double 타입이 float 타입보다 적은 오차로 저장되지만
float 타입을 double 타입으로 형변환하여 저장한다고 해서
오차가 적어지는 것은 아니다.
앞서 정수형의 사칙연산을 공부했듯이,
크기가 작은 타입을 큰 타입으로 형변환 시
빈 자릿수를 양수의 경우 0, 음수의 경우 1로 채우는 것일 뿐,
float의 오차값 값은 그대로 double 타입에 저장된다.
그렇기 때문에 아래 예제의 ①과 같이
'변수 f == double 타입으로 형변환된 변수'
결과가 true인 것을 확인할 수 있다.
float f = 0.1f;
double d = 0.1;
double d2 = (double)f;
System.out.println(d == f); // false
System.out.println(d == d2); // false
System.out.println(d2 == f); // true --- ①
System.out.println((float)d==f); // true --- ②
float 타입의 값과 double 타입의 값을 비교하려면
위 예제의 ②과 같이
double 타입을 자릿수가 더 적은
float 타입으로 형변환하여 비교해야 한다.
또는 어느 정도의 오차를 무시하고
두 타입의 값을 비교할 수 있도록
소수점 앞 몇 자리만 잘라서 비교할 수도 있다.
'. Java의 정석' 카테고리의 다른 글
[Java] 논리연산자 예제와 주의사항 (0) | 2021.07.09 |
---|---|
[Java] 논리 연산자 &&, ||, ! (0) | 2021.07.09 |
[Java] 나머지 연산자 % (0) | 2021.07.09 |
[eclipce] 느낌표가 그려진 노란 세모가 신경쓰인다면? (0) | 2021.07.08 |
[Java] 문자(char) 타입의 사칙연산 (0) | 2021.07.07 |