2014년 9월 4일 목요일

Java 연산자(비교연산자)

4. 비교 연산자

비교 연산자는 두 개의 변수 또는 리터럴을 비교하는데 사용되는 연산자로 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 true 또는 false입니다.
 비교 연산자 역시 이항 연산자이므로 비교하는 피ㅣ연산자의 자료형이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 형변환하여 피연산자의 타입을 일치시킨 후에 비교합니다.

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

두 연산자의 크기를 비교하는 연산자이다. 기본형 중에서너는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형은 사용할 수 없습니다.

4.2 등가비교 연산자 ==, !=


두 피연산자에 저장되어 있는 값이 다른지 혹은 다른지를 비교하는 연사자입니다. 대소비교연산자와는 달리, 모든 자료형에 사용할 수 있습니다. 기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 저장하기 때문에 두 개의 피연사자가 같은 객체를 가리키고 있는지를 알 수 있습니다.
기본형과 참조형 간에는 서로 형변환이 불가능 하기 때문에 등가비교 연산자(==, !=)의 피연산자로 기본형과 참조형을 함께 사용할 수 없습니다.

public class Operator23 {

public static void main(String[] args) {

if(10 == 10.0f){
System.out.println("10과 10.0은 같습니다.");
}
if('0' != 0){
System.out.println("'0'과 0은 같지 않습니다.");
}
if('A' == 65){
System.out.println("'A'는 65와 같습니다.");
}
int a=5;
if(a>0 && a<10){
System.out.println("5는 0보다 크고 10보다 작습니다.");
}
}

}

실행결과

10과 10.0은 같습니다.
'0'과 0은 같지 않습니다.
'A'는 65와 같습니다.
5는 0보다 크고 10보다 작습니다.

비교 연산자에서도 연산을 수행하기 전에 형변환을 통해 피연산자의 타입을 맞춤 다음 피연산자를 비교합니다. 10==10.0f에서 10은 int이고 10.0f는 float이므로 int형인 10을 float형으로 변환한 다음 비교합니다. 두개의 값이 서로 같으므로 결과로 true를 얻게 되는 것입니다. 또한 'A'==65는 'A'를 int로 변환하여 65의 값을 얻고 65==65을 계산하므로 true를 얻게 됩니다.

public class Operator23 {

public static void main(String[] args) {
float a = 0.1f;
double b = 0.1;
double c = (double)a;
System.out.println("10.0==10.0f ? "+(10.0==10.0f));
System.out.println("0.1==0.1f ? " +(0.1==0.1f));
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("a==b ? " +(a==b));
System.out.println("b==c ? " +(b==c));
System.out.println("c==a ? " +(c==a));
}

}

실행결과

10.0==10.0f ? true
0.1==0.1f ? false
a=0.1
b=0.1
c=0.10000000149011612
a==b ? false
b==c ? false
c==a ? true

10.0==10.0f는 true인데 0.1==0.1f는 false라는 결과가 나왔다. 정수형과 달리 실수형이 float와 double의 값은 근사값으로 저장되기 때문에 이런 결과가 나오는데, 10.0f을 double로 변환하면 10.0을 얻지만, 0.1f를 double로 변환하면 0.1이 아닌 0.10000000149011612을 얻는다. 이값은 0.1에 상당히 가갑지만 정확한 0.1이 아니기 때문에 false로 출력된다.
이 정도의 오차는 산술계산에서는 무시할 수 있을 정도로 아주 작은 것이지만 값의 크기와 같고 다름을 판단하는 비교연산자에서는 문제가 된다. 따라서 이 문제를 해결하기 위해서 형변환을 통해 두 피연산자의 타입을 flaot로 맞춰 비교연산과정에서 형변환이 일어나지 않도록 하거나, 소수점 몇 째 자리까지 동일하게 잘라서 비교해야합니다.

댓글 없음:

댓글 쓰기