== 연산자는 기본 타입일 때에는, 두 대상이 동일한지를 비교합니다. 그러면 그 대상들이 object일 때에는 어떻게 동작할까요? 같은 객체인지를 비교합니다. 즉, 같은 object를 가르키는지를 검사합니다. 그렇다면 True이고, 아니라면 false입니다. 정말 이것이 다인가요? 네. 내용이 동일한지를 검사하기 위해서는 equals 메서드를 오버라이딩을 할 수 있는데요. 이는 다음에 언급해 드리도록 하겠습니다.

 

 


예제 1번 프로그램을 봅시다.

 

 Point 클래스가 있습니다. 이 안에는 필드 x, y가 있네요.

 

 

 15번째 줄과, 16번째 줄에 Point 객체를 생성합니다. 그리고 17번째 줄에서 a == b인지를 검사합니다. 결과는 어떻게 나올까요? new 연산자는 힙에다가 객체를 생성합니다. 즉, 15번째 줄은 점 a에 대한 정보를, 16번째 줄은 점 b에 대한 정보를 힙에다가 생성을 합니다.

 

 

 이 둘은 별개의 공간에 있습니다. 따라서, a와 b는 다른 공간에 있는 객체를 가리킵니다. 따라서 a == b는 false가 되고, 출력 결과는 false입니다. 그러면, 이런 경우에는 어떨까요?

 

 

 이번에는 17번째 줄에 b = a; 구문이 추가되었습니다.

 

 

 그러면, a가 가리키는 객체와 b가 가리키는 객체가 같아집니다. 따라서 a == b는 true가 됩니다. 그러면 기존에 b가 가리키고 있던 객체는 어떻게 될까요? 유저가 프로그램에서 노란색으로 칠한 부분에 접근할 수 있는 방법이 없습니다. 이러한 것을 '가비지' 라고 하는데요. 자바에는 이것들을 자동으로 수거해 가는 가비지 컬렉터가 있어요.

 

 


 이 경우에는 어떨까요? 먼저, String a = "chogahui" 구문을 봅시다.

 

 

 pool에, "chogahui"가 없습니다. 따라서, 풀에 "chogahui" 라는 문자열을 추가하고, a가 풀에 있는, 문자열 리터럴을 가리킵니다. 아래와 같이 그릴 수 있겠습니다.

 

 

 다음에 b = "chogahui"; 문장을 봅시다. "chogahui"가 풀에 있는지 찾을 건데요. 이미 있어요. 따라서, 풀에 있는 "cho.."를 갈킵니다. 이를 그림으로 그려보면 아래와 같은데요.

 

 

 a와 b가 가리키는 대상이 같습니다. 따라서, a == b는 true입니다. 다음에 c = new String("chogahui"); 가 있습니다. 이것은, 힙에다가 새로운 객체를 생성하는데요.

 

 

 이 때에는 풀에 있는 "chogahui"와 다른 공간을 가리킵니다. 그러면, b == c는 참일까요? 거짓입니다. 서로 다른 객체를 가리키고 있기 때문입니다.