JAVA LV 2-3

비교 연산자

Posted by Gihoon on March 14, 2023

비교 연산자는 두 피연산자를 비교하는데 사용되는 연산자이다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true, flase 이다.

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

기본형 중에서는 boolean형을 제외한 나머지 자료형에는 다 사용할수 있지만, 참조형에는 사용할 수 없다. | 비교연산자 | 연산결과 | | — | — | | > | 좌변 값이 크면 true 아니면 false | | < | 좌변 값이 작으면 true 아니면 false | | >= | 좌변 값이 크거나 같으면 true 아니면 false | | <= | 좌변 값이 작거나 같으면 true 아니면 false |

등가비교 연산자 == !=

두 피연산자의 값이 가은지 또는 다른지를 비교하는 연산자이다. 기본형을 포함한 참조형, 즉 모든 자료형에 사용할 수 있다. 기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 두개의 피연산자가 같은 객체를 가리키는지 알 수 있다. 기본형과 참조형은 형변환이 불가하므로 등가비교 연산자로 둘을 비교할 수 없다 | 비교연산자 | 연산결과 | | — | — | | == | 두 값이 같으면 true 아니면 flase | | !=| 두 값이 다르면 true 아니면 flase |

1
2
3
4
5
6
7
8
9
10
11
12
13
        System.out.printf("10 == 10.0f  \t %b\n", 10==10.0f);
        System.out.printf("'0'== 0      \t %b\n", '0'== 0);
        System.out.printf("'\\0'== 0    \t %b\n", '\0'== 0);
        System.out.printf("'A'== 65     \t %b\n", 'A'== 65);
        System.out.printf("'A' > 'B'    \t %b\n", 'A' > 'B');
        System.out.printf("'A'+1 != 'B' \t %b\n", 'A'+1 != 'B');
실행결과:
10 == 10.0f       true
'0'== 0           false
'\0'== 0         true
'A'== 65          true
'A' > 'B'         false
'A'+1 != 'B'      false

비교 연산자도 이항 연산자 이므로 연산하기 전에 형변환을 통해 두 피연산자의 타입을 같게 맞춘 다음 다음 피연산자를 비교한다.
따라서 10 == 10.0f 에서 10.0f는 float 타입이므로, 10 을 float로 형변환 한다음 비교한다. 따라서 두 값이 10.0f로 같으므로 true를 얻게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        float  f  = 0.1f;
    double d  = 0.1;
    double d2 = (double)f;

        System.out.printf("10.0==10.0f  %b\n", 10.0==10.0f);
        System.out.printf("0.1==0.1f    %b\n",  0.1==0.1f);
        System.out.printf("f =%19.17f\n", f);
        System.out.printf("d =%19.17f\n", d);
        System.out.printf("d2=%19.17f\n", d2);
        System.out.printf("d==f   %b\n", d==f);
        System.out.printf("d==d2  %b\n", d==d2);
        System.out.printf("d2==f  %b\n", d2==f);
        System.out.printf("(float)d==f  %b\n", (float)d==f);
실행결과:
10.0==10.0f  true
0.1==0.1f    false
f =0.10000000149011612
d =0.10000000000000000
d2=0.10000000149011612
d==f   false
d==d2  false
d2==f  true
(float)d==f  true

double타입이 저장되는 과정에서도 오차가 발생하지만 float타입의 저장 과정에서는 더 많은 오차가 생기게 되기 때문에 결과값이 달라질 수 있다.

문자열의 비교

두 문자열을 비교할 때는 ‘==’ 대신 ‘eauals()’라는 메서드를 이용해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
		String str1 = "abc";
		String str2 = new String("abc");

		System.out.printf("\"abc\"==\"abc\" ? %b%n", "abc"=="abc");
		System.out.printf(" str1==\"abc\" ? %b%n",    str1=="abc");
		System.out.printf(" str2==\"abc\" ? %b%n",    str2=="abc");
		System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc"));
		System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc"));
		System.out.printf("str2.equals(\"ABC\") ? %b%n", str2.equals("ABC"));
		System.out.printf("str2.equalsIgnoreCase(\"ABC\") ? %b%n", str2.equalsIgnoreCase("ABC"));
실행결과:
"abc"=="abc" ? true
 str1=="abc" ? true
 str2=="abc" ? false
str1.equals("abc") ? true
str2.equals("abc") ? true
str2.equals("ABC") ? false
str2.equalsIgnoreCase("ABC") ? true

str2와 “abc” 의 내용이 같은데도 ‘==’로 비교하면, false를 결과로 얻는다. 내용은 같지만 서로 다른 객체라서 그렇다. 대소문자를 구별하지않고 비교하고싶으면 equalsIgnoreCase()를 사용하면 된다