[ 생성 방식 ]

 - new 연산자를 이용한 방식 : new를 통해 String을 생성하면 heap 메모리영역에 존재하게 된다.

 - 리터럴을 이용한 방식 : String constant pool이라는 메모영역에 존제하게 된다.

 

[ 특징 ]

 - String/리터럴로 생성하게되면 해당 String 값은 heap 메모리 영역 내 String Constant Pool 메모리 영역에 저장되어 재사용 되지만, new 연산자를 이용하여 생성하게 될 경우, 같은 내용이라도 여러 개의 객체가 각각 heap 메모리 영역에 생성되게 된다.

 

[ Code ]

public static void main(String[] args) {
	String s1 = "Cat";
    String s2 = "Cat";
    String s3 = new String("Cat");
    String s4 = "Dog";
    
    // 객체간 주소값 비교
    System.out.println(s1 == s2); // true
    System.out.println(s1 == s3); // false
    // 문자열 비교
    System.out.println(s1.equals(s3));
}

 

위 코드를 봤을 때, Heap영역에 생성된 String 객체와 리터럴을 이용한 생성한 String Contant Pool 영역의 저장된 String 객체의 주소값은 다를 수 밖에 없다.

 

 - String/literal로 생성한 객체 -> String Pool

 - String/literal로 생성한 객체가 미치 Pool에 존재한다면, 해당 객체의 Reference(주소)를 참조한다.

 - new 연산자로 생성한 객체는 같은 값이 Pool에 존재하더라도 heap영역내 별도의 객체를 생성한다.

 

[ String Constant Pool 이란? ]

이전 Java 6 버전까지는 Perm 메모리 영역에 존재하였으나 Java 7 이후부터 OOM 문제로 인하여 Heap 메모리 영역으로 변경 되었다.

Perm 메모리 영역은 고정된 사이즈이며 Runtime에 사이즈가 확장되지 않는다.

 

+ Recent posts