다음과 같은 사진에서, s1과 s2가 같은 경우 출력 되는 문장은 무엇일까? 당연히 두 문장 모두 true를 반환한다.
그러나 s1과 s2는 분명 다른 변수이다. 왜 저러한 결과가 나오는 것일까
출력문에 들어가는 문장은 주소를 비교하는 문장이다. 그러므로 저 결과값을 통해 알 수 있는 사실은 주소값이 같다는 의미가 되는 것인데, 기존 우리가 알고 있는 상식과는 매우 다른 이야기이다. 왜 그러한 것일까
자바에서는 어떠한 변수를 생성하면 new라는 명령어를 사용해야 한다. new라는 명령어를 사용함으로 인해 메모리에 있는 힙에 공간을 할당하여 정보를 저장하게 되는데, 해당 코드에서는 new를 사용하지 않았다. 그 말은 힙에 공간을 할당하지 않는다는 것이다.
그렇다면 해당 변수는 어디에 저장되는가? 문자열이 저장되는 전용 공간이 따로 있는데 이 공간을 Literal Pool이라고 한다. 이 공간은 문자열을 저장하는 공간인데, 만일 같은 문자열이 저장될 경우 새로이 공간을 할당하여 문자열을 저장하지 않고 이미 생성된 문자열의 주소로 연결된다. 문자열을 "" 로 뒤집어 씌우게 되면 해당 문자열이 담긴 literal Pool의 주소를 참조한다는 뜻이 되기 때문이다. 그렇기 때문에 위와 같은 코드에서 주소값이 같게 나오게 되는 것이다.
그렇다면 다음과 같이 new 명령어를 통해 새로 할당한 경우에는 어떠한 결과가 발생할까?
바로 이러한 결과가 출력된다. 위의 비교는 false를 반환하지만 아래의 equals는 true를 반환한다. 위의 비교연산자는 주소를 비교하지만 아래의 equals 함수는 문자열 자체를 비교하게 된다는 것을 알 수 있는 대목이다.
상황에 따라, 쓰는 사람의 습관에 따라서 비교 연산자는 각기 다른 출력문을 출력하게 되는 경우가 생길 수 있기 때문에 되도록이면 문자열을 비교하게 될 경우 비교 연산자가 아닌 equals함수를 쓰는 것이 좋다.
'Programming > Java' 카테고리의 다른 글
Thread Synchronized (0) | 2016.01.26 |
---|---|
vector (0) | 2016.01.22 |
equals, hashcode (0) | 2016.01.21 |
Singletone pattern / Synchro (0) | 2016.01.21 |
override & overload [오버라이딩 & 오버로딩] (1) | 2016.01.20 |