참.. 공부를 하면 할수록 그동안 몰랐던게 계속해서 튀어나옵니다..
저는 지금까지 String만 예외적으로 new String을 조금 편하게 쓸 수 있도록 해주고, 나머지 동작방식은 동일하다고 생각했습니다
그런데 전혀 아니었습니다.
지금부터 자바에서의 String에 대해서 알아가 보도록 하겠습니다.
우선 아래 코드에서 몇개의 객체가 생성이 될 지 한번 생각해보고 진행하도록 하겠습니다.
public class StringTest {
public static void main(String[] args) {
String str1 = new String("Hi");
String str2 = "Hi";
String str3 = "Hi";
}
}
당연히 3개의 객체가 만들어지지 않을까??? 라고 생각했었는데, 사실 답은 2개입니다.
왜 2개일까요?
Java에서 String이라는 타입은 다른 참조 자료형과는 조금 다르게 취급합니다.
자바에서 문자열을 생성할 때는 new String을 사용하거나, ""안에 값을 입력하여 바로 생성하는 두 가지의 방법이 있습니다.
그리고 후자의 방식이 '리터럴'을 이용한 방식입니다.
String str1 = new String("Hi"); //new 연산자를 이용한 방식
String str2 = "Hi";//리터럴을 이용한 방식
이 두가지의 문자열 생성 방식은 JVM이 관리하는 메모리 구조상에서 차이가 발생합니다.
String은 다른 객체들에 비해 광범위하고, 빈번하게 사용되므로 String을 사용할 때마다 객체를 생성하는 방식으로 사용하게 된다면, 새로운 객체를 계속 만들어내는 것이기 때문에 메모리 관리 측면에서 비효율적입니다.
이러한 String을 효율적으로 관리하기 위해, Heap 메모리영역 속에 String Constant Pool을 만들었습니다.
이곳에는 생성된 문자열의 값을 보관하고 있으며, 리터럴로 생성된 같은 값을 가지는 객체는 같은 레퍼런스(참조값, 주소)를 가지게 됩니다.
따라서 위 코드에서는 new String 연산자로 생성된 객체(Heap 메모리 영역에 저장), 그리고 리터럴로 생성된 객체(String Pool에 저장), 총 2개의 객체가 생성되는 것입니다.
간단하게만 알고 싶으면 여기까지만 보시면 됩니다.
아래는 String Constant Pool에 대해 조금 더 공부한 내용입니다.
https://ttl-blog.tistory.com/389
'☕️ Java > 기본' 카테고리의 다른 글
[Java] Method Signature와 Method Type (0) | 2022.02.06 |
---|---|
[Java] String Constant Pool (0) | 2022.01.28 |
[Java] final 키워드 (상수와 리터럴) (0) | 2022.01.28 |
[Java] static 파헤치기 (feat. Hiding (static Method의 Overriding)) (0) | 2022.01.24 |
자바는 어떻게 작동하는가? (JVM, Class Loader, JVM Memory 등) (0) | 2022.01.24 |