우선 ==는 객체의 주소값을 비교한다.
예를들어
String a = "java";
String b = a;
String c = new String("java"); 가 있다고 본다면 우선
a == b의 결과는 true이다. 왜냐하면 ==는 주소값을 비교한다고 했는데 String b= a 라고 선언해놨기 때문이다.
그렇다면 a == c는 어떤 결과가 나올까 ? 결과는 false이다.
이유는 String a = "java"; 와 String c = new String("java"); 는 서로 저장되는 위치가 다르기 때문이다.
우선 우리가 자주 사용하는 String a = "java"와 같은 리터럴 방식은 Heap영역의 String constant pool이라는 리터럴 상수값을 저장하는 공간에 저장이되고
String c = new String("java");는 Heap영역에 저장이되기 때문에 서로 저장되는 주소값이 다르다.
즉! a와 b는 같으므로 임의의 주소값 100을 할당받고 c는 임의의 주소값 200을 할당받아
a=b //true
a=c //false
b=c //false 라는 결과가 나오게 된다.
또한
String str1 = "hello";
String str2 = "hello"; 가 있다고 했을 때
str1==str2는 어떤 결과가 나올까? 결과는 true이다.
==연산자는 주소값을 비교한다고 했는데 true라는 결과가 나온 이유는 String은 불변성(Immutable)이라는 성질을 가지고 있기 때문이다. 즉 같은 값의 문자열에 대해서는 단 하나의 문자열 객체만을 생성하도록 설계 되어있기 때문이다.
또한 Java의 Heap영역에는 String객체들을 관리하는 String pool이라는 영역이 있다. 이 String객체를 생성하면
String pool에 기존에 같은 값을 가지고 있는 String 객체가 있는지 검사를 한다. 만약 같은 값을 가진 객체가 있다면 그 객체의 참조값을 리턴하고 같은 값을 가진 객체가 없다면 새로운 String객체를 생성하고 그 참조값을 리턴한다.
다음은 equals이다.
equals는 객체의 내용, 즉 값을 비교하는 메서드이다.
아까와 같이
String a = "java";
String b = a;
String c = new String("java"); 가 있다고 본다면
a.equals(b) // true
a.equlas(c) // true
c.equals(b) // true
값은 모두 "java"로 동일하므로 eqauls()메서드로 비교했을 때 모두 true가 출력되는 것을 확인할 수 있다.
<결론>
*String은 불변성(immutable)속성을 가짐 -> 같은 값의 문자열에 대해서는 단 하나의 문자열 객체만을 생성
*String a = "hello" -> Heap영역의 String Constant Pool(리터럴 상수값을 저장하는 곳)에 저장
*String b = new String("world!") -> Heap영역에 저장
*== -> 객체의 주소값을 비교
*equals() -> 객체의 값(내용)을 비교