문자열 a
는 cat
라는 문자열이 저장되어 있으며,
문자열 b
도 cat
라는 문자열이 저장되어 있다.
그렇게 두 문자열이 같은지 확인했는데 false
가 나왔다.
왜 이런 결과가 나오게되는지 알아보자.
위처럼 문자열의 내용이 같더라도, 어떤 방법으로 선언하였는지에 따라 주소(참조)값이 달라질 수 있다.
// 리터럴로 선언
String str1 = "cat";
String str2 = "cat";
// new 연산자로 선언
String str3 = new String("cat");
String str4 = new String("cat");
리터럴로 선언
: Heap 영역 내의 String Pool
이라는 영역에 같은 값의 문자열을 공유해 메모리 사용량을 최적화므로, str1
과 str2
의 주소값은 같다.
String Constant Pool
: Java에서 문자열 리터럴을 저장하는 독립된 영역new 연산자로 선언
: Heap 영역 내에 별도로 저장되며 다른 주소값을 할당받는다.
==
연산자는 두 문자열의 주소(참조)값이 같은지 비교한다.
즉, 두 객체가 메모리에서 동일한 위치를 가리키는지 확인하는 것이다.
String str1 = "cat";
String str2 = "cat";
String str3 = new String("cat");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
리터럴로 선언한 str1
과 str2
는 주소값이 같으므로 true
를 리턴한다.
하지만 리터럴로 선언한 str1
과 new 연산자로 생성한 객체 str3
는 주소값이 다르므로 false
를 리턴한다.
equals()
메소드는 두 문자열의 내용을 비교한다.
즉, 두 문자열이 동일한 값을 가지고 있는지 확인하는 것이다.
String str1 = "cat";
String str2 = "cat";
String str3 = new String("cat");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
str1
, str3
는 주소 값이 다르더라도 두 문자열이 같으므로, true
를 리턴한다.
문자열의 내용을 비교할 때는 ==
연산자보단 equals()
메소드를 사용하는 것이 좋다.