본문 바로가기

프로그래밍언어/JAVA

[JAVA] 연산자 - 비교 연산자

반응형

비교 연산자는  피연산자를 비교하는  사용되는 연산자이다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 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