[Java] String 객체 생성 방식과 String Pool

Jay·2023년 8월 2일
0

Keyword: String, JVM, String pool, heap

String 객체를 생성하는 방법으로 new 키워드를 이용한 객체 생성 방식과 리터럴 생성 방식이 있다.

new 연산자를 이용한 객체 생성 방식

String word1 = new String("word");
String word2 = new String("word");

new 연산자를 이용해 String 객체를 생성할 경우, JVM내 Heap 영역에 저장된다. 문자열 변수들이 같은 값을 가지고 있더라도 Heap 내에 독립된 메모리 영역에 각각 저장된다.

System.out.println(word1==word2);            // false
System.out.println(word1.equals(word2));     // true

따라서 == 연산자로 두 변수를 비교할 경우 다른 메모리 영역에 저장되어 있기 때문에 false를 리턴하고, 값은 일치하기 때문에 equals로 동등성 비교를 할 경우 true를 리턴한다.

리터럴 생성 방식

String word3 = "word";
String word4 = "word";

리터럴 생성 방식으로 String 객체를 생성할 경우, JVM의 메모리 영역인 Runtime Data Area의 Heap 영역 내에 있는 String Pool 영역에 저장된다. 위 예제 처럼 word3 이라는 문자열 변수를 선언하면 JVM은 우선 String pool에서 “word”이라는 값이 저장이 되어있는지를 확인한다. string pool에는 “word”라는 값이 저장되어 있지 않기 때문에, string pool에 “word” 를 저장하고, 그 값의 메모리 주소를 word3 문자열 변수에 할당한다. JVM이 String pool로 문자값을 관리하는 이유는 메모리 최적화를 위해서다.

예제와 같이 word4라는 문자열 변수를 선언하면 JVM은 String pool에서 “word”라는 값이 저장되어 있는지를 먼저 확인한다. 이미 word3 변수를 선언할 때 “word”라는 값이 String pool에 저장되었기 때문에 JVM은 “word”값을 String pool에서 찾아서 그 값의 메모리 주소를 획득해 word4 문자열 변수에 할당한다. 즉, JVM의 String pool 내에는 “word”라는 값이 한번만 선언되고, 같은 값을 가지는 변수가 여럿 존재할 경우 변수간에 메모리 주소를 공유하여 메모리를 절약할 수 있다.

System.out.println(word3==word4);            // true
System.out.println(word3.equals(word4));     // true

따라서 동일성 비교를 하는 == 연산자로 word3, word4 변수를 비교할 경우 true를 리턴한다.
값은 동일하기 때문에 동등성 비교를 하는 equals 메서드로 비교해도 true를 리턴한다.

System.out.println(word1.equals(word3));     // true

다른 방식으로 생성한 문자열을 비교하더라도 equals는 값 자체를 비교하기 때문에 true를 리턴한다.


new 키워드로 생성한 객체를 String pool에 등록하는 방법

new 연산자로 문자열 객체를 생성하더라도 String pool 영역에서 관리하도록 할 수 있는데, intern 메서드를 사용하면 된다.

String word1 = "word";
String word2 = new String("word");
String word3 = word2.intern();

intern 메서드를 사용하면 스트링 풀로 관리되기 때문에 리터럴로 생성된 문자열과 동일하게 취급된다.

System.out.println(word1==word3);        // true
System.out.println(word2==word3);        // false
System.out.println(word1.equals(word3)); // true
System.out.println(word2.equals(word3)); // true

같은 값을 가지고 있고, 스트링 풀에 등록되어 있어 같은 메모리 영역을 공유하는 word1과 word3은 동일성, 동등성 비교를 했을 때 true를 리턴하고, 다른 메모리 영역에 저장된 word2와 word3은 동일성 비교를 했을 때 false를 리턴한다.

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

많은 도움이 되었습니다, 감사합니다.

답글 달기