==을 사용하면 안 되는 이유Java에서 문자열(String)을 비교할 때 흔히 실수하는 부분 중 하나는
==연산자를 사용하는 것이다.
하지만==은 문자열을 비교할 때 내용이 아닌 주소(참조값) 를 비교하므로 정확한 비교가 되지 않는다.
==' vs '.equals()' 차이| 연산자 | 비교 대상 | 설명 |
|---|---|---|
== | 참조(주소) | 두 객체가 같은 메모리 주소를 가리키는지 비교 |
.equals() | 실제 값(내용) | 두 객체의 내용이 같은지 비교 |
"hello"를 참조함.String a = "hello";
String b = "hello";
System.out.println(a == b); // true (같은 리터럴을 참조)
System.out.println(a.equals(b)); // true
new String()은 새로운 객체를 생성하므로 같은 "hello"라도 주소가 다르다.String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false (주소 다름)
System.out.println(a.equals(b)); // true (내용 같음)
==은 주소 비교 → 값이 같아도 다른 객체면 false.equals()는 값 비교 → 실제 문자열이 같으면 trueString a = "abc";
String b = "abc";
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true
String c = new String("abc");
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
.equals()를 사용할 때는 NPE(NullPointerException) 에 주의해야 한다.null일 가능성이 있으면 "문자열".equals(변수) 형태로 비교String str = null;
// 안전한 방법
"hello".equals(str); // false (null이어도 안전)
// 위험한 방법
str.equals("hello"); // ❌ NullPointerException 발생 가능