[Java] String 객체 선언 방식의 차이

류미나·2024년 3월 10일
post-thumbnail

  • String Pool은 Heap 메모리 영역 내에 존재하는 문자열 Pool이다.
  • String Pool은 문자열을 생성하는 데 더 많은 시간이 걸리지만
    (문자열을 생성하기 전 같은 문자열이 존재하는 지 찾기 때문)
    Java Runtime시에 많은 공간을 절약하는 데 도움이 된다.

이제 각 방식에 따라 어떻게 값이 저장되는 지 알아보자

1. String v1 = "java";
2. String v2 = new String("java");

1. String 리터럴로 선언하는 경우

  • String Pool에서 동일한 값을 가진 문자열을 찾는다.
    내부적으로 intern() 메서드가 호출되는데 해당 문자열이 String Pool에 존재하는지 확인한다.
  • 동일한 값이 있다면 해당 주소값을 반환, 그렇지 않으면 새로 문자열을 생성한 후 새로운 주소값을 반환한다.

2. new String 으로 선언하는 경우

  • Heap 영역에 새로운 String 객체가 생성된다.

 
코드로 보면 아래와 같다.

public class StringPool {
    public static void main(String[] args) {
        String v1 = "java";
        String v2 = "java";
        String v3 = new String("java");
        
        System.out.println("v1 == v2 :" + (v1 == v2));
        System.out.println("v1 == v3 :" + (v1 == v3));
    }

}

그리고 결과는
v1과 v2는 같은 주소값을 가지기 때문에 true,
v1과 v3는 다른 주소값을 가지기 때문에 false라는 결과가 나온다.

v1 == v2 :true
v1 == v3 :false

 


메모리 주소값을 통해서도 확인해보자.
해당 객체의 메모리 주소를 기반으로 한 해시 코드를 반환하는 메서드를 사용해보았다.

String test1 = "test";
String test2 = "test";
System.out.println("test1 주소값 : " + System.identityHashCode(test1));
System.out.println("test2 주소값 : " + System.identityHashCode(test2));

String test3 = new String("test");
System.out.println("test3 주소값 : " + System.identityHashCode(test3));
test1 주소값 : 1047087935
test2 주소값 : 1047087935
test3 주소값 : 464887938
profile
개발과 새발의 환상적인 만남

0개의 댓글