
문자열 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() 메소드를 사용하는 것이 좋다.