[ 생성 방식 ]
- 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에 사이즈가 확장되지 않는다.
'#Java' 카테고리의 다른 글
| Java 클래스(Class) (0) | 2024.04.03 |
|---|---|
| 오버로딩(Overloding) vs 오버라이딩(Overriding) (0) | 2024.04.03 |
| 메소드의 오버라이딩 (Method Overriding) (0) | 2024.04.03 |
| 메소드의 오버로딩 (Method Overloading) (0) | 2024.04.03 |
| 메소드(Method) (0) | 2024.04.02 |