본문 바로가기
JAVA BASE/operator(연산자)

05. [자바] 비교 연산자

by staticClass 2020. 12. 2.

비교 연산자란?

비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자다.

주로 조건문과 반복문의 조건식에 사용되며 연산결과는 오로지 true false이다.

비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 일치하지 않으면

자료형의 범위가 큰 쪽으로 자동 형변환 한 뒤 비교한다

 

대소비교 연산자 < > <= >=

두 연산자간 값의 크기를 비교하는 연산자이다. 참이면 true를, 거짓이면 false를 반환한다.

기본형 중에서는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만

참조형에는 사용할 수 없다.

비교연산자 연산결과
>  좌변 값이 크면, true 아니면 false
<  좌변 값이 작으면, true 아니면 false
>=  좌변 값이 크거나 같으면, true 아니면 false
<=  좌변 값이 작거나 같으면, true 아니면 false

 

등가비교 연산자

두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다.

대소비교 연산자 < > <= >=와 달리 기본형은 물론 참조형 즉 모든 자료형에 사용 가능하다

기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고

참조형의 경우 객체의 주소값을 저장하기 때문에 두 개의 피연산자(참조변수)가 같은

객체를 가리키고 있는지 알 수 있다.

비교연산자 연산결과
==  두 값이 같으면, true 아니면 false
!=  두 값이 다르면, true 아니면 false

 

대소비교, 등가비교 연산자 예제

비교 연산자도 이항 연산자이므로 연산을 수행하기 전에 형변환을 통해  두 피연산자의 타입을 같게 맞춘 다음

피연산자를 비교한다. 10==10.0f 에서 10은 int 타입이고 10.0f는 float타입이므로 10을 float으로 변환한 다음에 비교한다. 두 값이 10.0f 이므로 값은 true이다.

10 == 10.0f
// → 10.0f == 10.0f
// true

 

문자 'A'의 유니코드는 10진수로 65이고, 'B'는 66, '0'은 48이므로 나머지 식들은 다음과 같은 과정으로 연산된다.

'0' == 0 → 48 == 0 → false
'A' == 65 → 65 == 65 → true

'A' > 'B' → 65 > 66 → false
'A'+1 != 'B' → 65+1 != 66 → 66 != 66 → false

 

실수형을 비교연산 하다보면 재미있는? 혼란스러운 일이 발생할수 있다.

10.0 == 10.0f // 결과 : true
0.1 == 0.1f // 결과 : true????????가 아니다 false가 결과이다.

 

결과의 이유는 double의 정밀도가 float보다 크기 때문!

float f = 0.1f	// f에 0.10000000149011612로 저장된다.
double d = 0.1	// d에 0.10000000000000001로 저장된다.

 

이런 현상의 해결방법으로는 double과 float형을 비교할때는 double을 float으로 형변환 한 뒤에 비교해야 하거나

어느 정도의 오차는 무시하고 두 타입의 값을 앞에서 몇 자리만 잘라서 비교할 수도 있다.

 

 

문자열의 비교

두 문자열을 비교할 때는 비교연산자 == 대신 equals()라는 메서드를 이용하자

String a = "가나다";
String b = new String("가나다");
System.out.println(a == b);

//결과는 false이다.

a와 b의 내용이 같은데 false로 결과를 얻는다. 내용은 같지만 서로 다른 객체라서 그렇다

그렇기 때문에 객체가 달라도 내용이 같으면 true를 반환하는 equals()를 사용해야 한다.

만일 대소문자를 구별하지 않고 비교하고 싶으면, equals()대신 equalsIgnoreCase()를 사용하면 된다.

나는 바보같이 equalsIgnoreCase()를 몰라 toUpperCase()로 맞춰준 뒤 비교를 하고는 했다.

 


 

실수형의 비교연산을 할때 float과 double의 정밀도 차이로 문제가 생길거라고는
생각해본적이 없는데 이번에 잘 잡아놓고 넘어가서 다행이고
equalsIgnoreCase()를 왜 이제야 알았을까.. 잘 써먹어야지

댓글