자바 레퍼런스와 스트링

조회수 1039회

클래스의 주소 값을 저장하는 참조 변수는 System.out.print()로 출력시에 주소 값이 나오는데

스트링 클래스를 참조 하는 참조 변수는 System.out.print()로 출력시에 주소 값이 아닌 실제 값이 출력되는 이유는 뭔가요 ?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 간단하게 답만적으면 toString 메소드 때문에 그렇습니다.

    일반 클래스도 toString 메소드를 오버라이드 해주면 println 시에 값등을 출력할 수 있습니다.

    그런데 자바에서 문자열이라는 것은 조금 독특하게 취급합니다.

    문자열 객체를 만드는 방법은

    1번. String str = "abcd";
    2번. String str = new String("abcd");
    

    와 같이 2가지 방법이 있고 각각 다른 방법으로 메모리상에 저장이 됩니다.

    jvm내에는 constants pool 이라는 영역이 있습니다.

    1번 형식과 같이 리터럴 형식으로 생성한 문자열이 contant pool 에 저장이 되며 같은 값이면 같은 항목을 참조하는 형태가 됩니다. (intern 메소드 참고)

    2번 형식과 같이 생성할 때는 일반 객체와 같이 heap에 생성되고 그 주소를 저장하게 됩니다.

    결과적으로 1번 형식으로 문자열을 생성하는 것이 유리한 방법입니다.

    더 심화적으로 permanent 영역, permanent 영역이 metaspace 로 변경된 이유 등을 더 살펴보시면 도움이 될겁니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)