Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바에서 문자열 리터럴이 문자열 상수 풀(String Constant Pool)에 저장되는 이유

Java에서 String 객체를 생성하는 방법은 크게 두 가지가 있습니다.

  • new 연산자를 사용하는 방법
String str = new String("Tutorials Point");
  • 문자열 리터럴(String literal)을 사용하는 방법
String str = "Tutorials Point";

Java에서 new String()을 호출할 때마다 힙(Heap) 메모리에 새로운 객체가 생성됩니다. 반면, 문자열 리터럴은 문자열 상수 풀(String Constant Pool, 이하 SCP)에 저장됩니다.

JVM은 Java에서 메모리를 효율적으로 관리하기 위해 SCP를 활용합니다. 다른 일반 Java 객체와 달리 String 객체를 단순히 힙 영역에서 관리하지 않고, 별도의 문자열 상수 풀을 도입한 것이 바로 그 예입니다.

SCP의 가장 중요한 특징 중 하나는 동일한 문자열 상수가 이미 풀에 존재하면 새로운 String 객체를 생성하지 않고 기존 객체를 재사용한다는 점입니다. 이러한 메커니즘 덕분에 반복되는 문자열로 인한 메모리 낭비를 크게 줄일 수 있으며, 불변(immutable)인 String의 특성과 결합해 안전하게 공유하여 사용할 수 있습니다.

예제 코드

public class SCPDemo {
    public static void main (String args[]) {
        String s1 = "Tutorials Point";
        String s2 = "Tutorials Point";
        System.out.println("s1과 s2는 문자열 리터럴:");
        System.out.println(s1 == s2);
        String s3 = new String("Tutorials Point");
        String s4 = new String("Tutorials Point");
        System.out.println("s3와 s4는 new 연산자 사용:");
        System.out.println(s3 == s4);
    }
}

실행 결과

s1과 s2는 문자열 리터럴:
true
s3와 s4는 new 연산자 사용:
false

결과 분석

위 실행 결과를 보면 두 경우의 차이를 명확히 확인할 수 있습니다.

  • s1과 s2 (리터럴 사용): 두 변수 모두 SCP에 존재하는 동일한 문자열 객체를 참조하므로 == 비교 결과가 true입니다.
  • s3와 s4 (new 연산자 사용): new 키워드를 사용하면 호출할 때마다 힙 메모리에 서로 다른 새로운 객체가 생성되므로 참조값이 달라 false가 출력됩니다.

참고로, new로 생성한 String 객체를 SCP의 리터럴과 통합하고 싶다면 intern() 메서드를 사용할 수 있습니다. 이 메서드를 호출하면 해당 문자열이 SCP에 이미 존재하는 경우 기존 객체의 참조를 반환하고, 없는 경우 풀에 추가합니다.