<비교 연산자의 정의>

 

비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자로,

주로 조건문과 반복문의 조건식에 사용되며,

연산 결과는 오직 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로 채우는 것일 뿐,

([Java] 사칙연산 시 주의사항 #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 타입으로 형변환하여 비교해야 한다.

 

또는 어느 정도의 오차를 무시하고

두 타입의 값을 비교할 수 있도록

소수점 앞 몇 자리만 잘라서 비교할 수도 있다.