왜 String을 비교할 때는 ==
이 아닌 equals()
를 써야할까?
두 문자열의 주소(참조)값이 같은 지 비교한다.
두 문자열이 메모리에서 동일한 위치를 가리키는 지 확인하는 것이다.
두 문자열이 동일한 값을 가지는 지 확인한다.
문자열은 값을 비교해야 하므로 equals()
를 사용하는 게 맞다!
문자열의 내용이 같아도 선언한 방식에 따라 주소값이 달라진다.
String s1 = "Hello";
String s2 = "World";
문자열 리터럴을 사용하면, 자바 컴파일러는 String Constant Pool
에 같은 값의 문자열을 공유해 값을 재사용하며 메모리 사용량을 최적화한다.
그래서, s1
과 s2
의 주소값은 동일하다.
String s3 = new String("Hello");
String s4 = new String("World");
new 연산자로 문자열 객체를 생성하면 Runtime Data Area의 Heap
에 저장돼 각각 다른 주소값을 할당 받는다.
Runtime Data Area의 Heap 메모리의 일부로 문자열 리터럴을 저장하는 메모리 영역이다.
문자열 처리 시 메모리 사용을 최적화하고 성능을 향상시키기 위해 사용된다.
public class StringPoolExample {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
String s4 = new String("Hello").intern();
// s1과 s2는 같은 객체를 참조
System.out.println(s1 == s2); // true
// s1과 s3는 다른 객체를 참조
System.out.println(s1 == s3); // false
// s1과 s4는 같은 객체를 참조 (s4는 intern 메서드를 통해 상수 풀의 객체를 참조)
System.out.println(s1 == s4); // true
}
}