5.4 비교 연산자 (Comparison Operators)

“누가 더 키가 큰가?”, “비밀번호가 일치하는가?” 처럼 두 값을 비교할 때 사용하는 연산자입니다. 결과는 무조건 참(true) 아니면 거짓(false)으로 나옵니다.


1. 크기 비교 (숫자) ⚖️

1) 개념

수학 시간에 배운 부등호를 그대로 사용합니다. (단, , 기호는 없어서 <= 형태로 씁니다.)

연산자 설명 예시 (a=10, b=5) 결과
> 크다 (초과) 10 > 5 true
>= 크거나 같다 (이상) 10 >= 10 true
< 작다 (미만) 10 < 5 false
<= 작거나 같다 (이하) 10 <= 5 false

2) 비유: “양팔 저울”

  • 양쪽에 물건을 올렸을 때 어느 쪽으로 기울어지는지(True/False) 확인하는 것과 같습니다.

그림


2. 등가 비교 (같니? 다르니?) 🤝

값이 같은지 다른지 확인할 때 사용합니다.

연산자 설명 예시 결과
== 같다 10 == 10 true
!= 다르다 10 != 5 true

주의: 수학에서는 =가 같다는 뜻이지만, 자바에서는 =대입(저장)이고, ==비교(같다)입니다.


3. 함정: 문자열(String) 비교 🚨

숫자는 ==로 비교하면 되지만, 문자열은 절대로 ==로 비교하면 안 됩니다!

1) 왜 안 되나요?

String은 참조 타입이라서 ==는 “내용이 같은가?”가 아니라 “같은 물건(주소)인가?”를 비교하기 때문입니다. 내용이 같아도 서로 다른 메모리 공간에 저장되어 있으면 false가 나올 수 있습니다.

2) 해결책: .equals()

문자열의 내용이 같은지 비교하려면 반드시 .equals() 기능을 써야 합니다.

String str1 = "Java";
String str2 = new String("Java"); // 내용은 같지만 주소가 다름

System.out.println(str1 == str2);      // false (주소가 다름) ❌
System.out.println(str1.equals(str2)); // true (내용이 같음) ✅

3) 비교 방식 시각화

graph TD
    subgraph Memory
        Addr1[주소 100번지] --> Val1["Java"]
        Addr2[주소 200번지] --> Val2["Java"]
    end
    
    Op1["== (주소 비교)"] -->|100번지 == 200번지?| Res1[false]
    Op2[".equals() (내용 비교)"] -->|"Java" == "Java"?| Res2[true]
    
    style Op1 fill:#fbb,stroke:#333
    style Op2 fill:#bfb,stroke:#333
서브목차