250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

[JAVA] String Constant Pool 이란? (String 객체 선언 방식에 대해서) 본문

[Snow-ball]프로그래밍(컴퓨터)/java

[JAVA] String Constant Pool 이란? (String 객체 선언 방식에 대해서)

Snow-ball 2021. 7. 13. 21:45
반응형

JAVA에서 String 객체를 생성하는 방법은 2가지가 존재한다.
첫번째는 String literal이다. 큰따옴표("")를 사용해서 선언하는것이고, 두번째는 new 연산자로 객체를 생성하는 것이다.

두가지 방법은 어떤 차이가 존재할까?

간단한 테스트를 해보았다.

좌 : 코드                                                               우 : 결과

위의 결과를 비교하면 모든 str에는 동일하게 "testStr"이라는 스트링값이 존재하고 있다.
하지만, str과 str2는 주소값이 동일하고, str3와 str4는 주소가 다른것을 확인 할 수 있다.

그렇다는것은 String literal로 생성한 객체는 내용이 같다면 같은 객체이며, 동일한 메모리 주소를 가리키고 있다는 것이다. 그러나 new 연산자로 생성한 String 객체는 내용이 같더라도 메모리 주소가 다르므로 다른 객체임을 알 수 있다.

여기에는 JVM의 특성이 존재하기 때문에 다른 결과가 나오는 것이다.



JAVA String Pool
개발을 하다보면 new 연산자로 String 객체를 생성하지 않는 것이 좋다는 말을 심심찮게 들을 것이다.

string literal로 생성하면 해당 String 값은 Heap 영역 내에서 "String Constant Pool"에 저장되어 재사용되지만, new 연산자로 생성하면 같은 문자열이라도 여러개의 객체가 각각 Heap 영역의 메모리를 차지하게 된다.

Java String Pool

위사진에서 보면 Heap 영역에 "Cat"과 "Dog"같은 값들을 확인할 수 있다. 하지만 그림에서 보면 [String s4 = new String("Cat")]이라고 선언한 것을 보면 String pool이 아닌 Java Heap영역에 존재하는 것을 알 수 있다.

정리해보자면,
1) String literal로 생성한 객체는 Java Heap 안의 String Pool에 존재하게 된다.
2) s1이 선언한 "Cat"객체가 이미 String Pool안에 존재한다면 literal로 선언했을시 새로 선언한 객체는 String Pool의 reference를 참조한다. 위에 사진에서 s1과 s2가 그 예시이다.
3) new 연산자로 생성한 String 객체는 같은 값이 String Pool에 이미 존재하더라도, Heap 영역 내 별도의 객체를 가리키게 된다.
4) new 연산자로 생성할 때마다 Heap 영역 내에 별도의 객체를 가르킨다.

결론적으로, 메모리를 효율적으로 사용하기 위해서는 String literal방식으로 String을 생성해서 사용하는 것이 좋을 듯하다.




베타존 : 네이버쇼핑 스마트스토어

나를 꾸미다 - 인테리어소품 베타존

smartstore.naver.com

반응형
Comments