char a = 'a';
char b = 'a';
String c = "a";
String d = "a";
String e = new String("a");
String f = new String("a");
System.out.println(a==b); //true
System.out.println(c==d); //true
System.out.println(e==f); //false
System.out.println(c.equals(d)); //true
System.out.println(e.equals(f)); //true
System.out.println(c.equals(f)); //true
String의 경우 리터럴을 이용한 생성과 new 연산자를 이용한 생성으로 생성방법이 나뉜다.
리터럴을 이용한 생성은 String pool 영역에 문자 a를 넣으며 그 좌표 값을 참조한고,
d는 같은 문자가 이미 String pool 영역에 있기 때문에 c와 동일한 값을 참조하게 된다.
new 연산자를 이용한 생성은 새로운 객체를 생성하게 되면서 String pool이 아닌 다른 객체를 생성하여 생성된 객체의 좌표 값을 참조한다. 따라서 e와 f의 주소가 각각 다른 좌표를 가지게 된다.
결과적으로 변수의 값 자체를 비교하는 == 연산자는 같은 좌표 값을 가진 c와 d는 같다고 판단하지만 다른 좌표 값을 가진 e와 f는 다르다고 판단한다.
그리고 변수가 가리키는 값을 비교하는 equals() 은 서로 다른 좌표 값을 가졌더라도 결과적으로 같은 문자를 가지고 있는 e와 f가 같다고 판단한다.
==
: 기본 자료형의 경우 자바와 동일하게 동작하지만 String과 같은 참조 자료형을 비교할 경우 ==을 사용하여도 내부적으로 equals를 호출하여 결과적으로 두 변수의 실제 값을 비교한다.
===
: 자바에서 참조 자료형을 ==으로 비교할때 와 같이 두 변수가 가진 좌표를 비교한다.