Java에서 문자열 비교는 흔히 발생하는 실수 중 하나입니다. ==
와 .equals()
는 각각 다르게 작동하므로, 올바르게 사용하는 방법을 알아야 합니다.
1. == 연산자와 .equals() 메서드의 차이
==
연산자==
는 두 객체의 **참조(메모리 주소)**가 동일한지 비교합니다. 문자열의 내용이 아니라, 동일한 객체를 가리키고 있는지를 확인합니다. 아래에서 `str1`과 `str2`는 동일한 값을 가지지만, 서로 다른 객체를 참조하므로 `false`를 반환합니다.
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false
.equals()
메서드.equals()
는 문자열의 값을 비교합니다. 즉, 문자열의 내용이 같은지를 확인합니다.
System.out.println(str1.equals(str2)); // true
2. 문자열 리터럴 비교에서 == 사용 가능
Java는 String Pool이라는 메모리 공간을 사용하여 문자열 리터럴을 재사용합니다. 동일한 리터럴은 같은 메모리 위치를 참조하므로 ==
비교에서 true
를 반환할 수 있습니다.
String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // true
하지만, 새로운 문자열 객체를 생성하거나 런타임에 문자열을 조작하면 ==
는 false
를 반환할 가능성이 높습니다.
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2); // false
3. .equals() 사용을 권장하는 이유
.equals()
는 문자열의 내용을 비교하므로 코드의 의도에 더 부합합니다. ==
는 참조를 비교하기 때문에 문자열 비교 시 버그를 유발할 가능성이 높습니다.
4. NullPointerException 방지
.equals()
를 사용할 때, null 값이 전달되면 예외가 발생합니다. 이를 방지하려면 다음과 같은 방법을 사용할 수 있습니다.
- 상수를 먼저 사용:
System.out.println("hello".equals(str)); // 안전
Objects.equals()
메서드 활용:
System.out.println(Objects.equals(str, "hello")); // 안전
5. 문자열 비교를 위한 기타 메서드
equalsIgnoreCase()
: 대소문자를 무시하고 비교
System.out.println("Hello".equalsIgnoreCase("hello")); // true
compareTo()
: 문자열을 사전순으로 비교
System.out.println("apple".compareTo("banana")); // 음수 반환
결론
Java에서 문자열을 비교할 때는 항상 .equals()
를 사용하는 것이 안전하며, 대소문자 무시 또는 null 처리와 같은 다양한 상황에 맞는 메서드를 선택하세요. String Pool로 인해 ==
가 작동할 때도 있지만, 안정성을 위해 .equals()
를 사용하는 습관을 기르세요.