본문 바로가기

Java

String이 참조하는 값

참조 자료형 String은 데이터값 자체를 저장하지 않고 메모리 주소값을 저장한다.

 

String str1 = "HelloWorld";
        String str2 = "Hello";
        str2 = str2 + "World";
        String str3 = new String("HelloWorld");
        String str4 = "HelloWorld";
 
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
 
        if (str1 == str2) {
            System.out.println("str1==str2");
        } else if (str1 == str3) {
            System.out.println("str1==str3");
        } else if (str1 == str4) {
            System.out.println("str1==str4");
        }
 
 
cs

 

예시코드의 실제 문자열은 모두 같으나 str2는 다른 문자열들의 다른 주소값을 합해서 새로운 heap영역에 할당,

str3은 new로 인스턴스를 새로 생성해서 heap 영역에 할당,

str4는 str1과 내용이 완전 같으므로 constant pool에 저장된값을 참조해서

결론은 str1==str4 만 true인 것이다.

 

여기서 실제 주소값을 비교해보고 싶었지만

Java에선 주소값을 직접적으로 다루지는 않는것 같다.

그래서 참조값이라도 비교해보려고 디버깅을 돌려봤는데 

 

eclipse 디버깅
vscode 디버깅

 

이클립스에서는 str1==str4로 결과값 출력과 같이 나오는데

vscode에서는 str1==str3==str4... vscode쪽이 뭔가 이상하다.

원래대로라면 새로운 heap영역을 할당받은 str3은 다른값을 참조해야되지않나?

왜 같게 나오는건지 원인을 알수가 없다.