String 을 선언하는 방법에는 두 가지 방법이 있다.
두 방식은 저장 공간(메모리)에 차이가 있다.
리터럴로 선언
리터럴로 선언하는 경우 문자열을 String Constant pool에 저장하기 때문에 메모리의 효율이 좋다.
리터럴을 사용하여 생성할 때 상수 풀에 같은 값이 존재하면 객체는 이미 존재하는 값을 참조한다.
따라 동일한 문자열을 리터럴로 선언한 변수는 모두 같은 객체를 참조한다.
String Constant Pool의 동작
1. String Constant Pool은 JVM이 관리하는 특별한 메모리 영역으로, 문자열 리터럴을 저장하고 관리한다.
2. 문자열 리터럴을 선언하면, JVM은 먼저 String Constant Pool에서 동일한 문자열이 존재하는지 확인한다.
- 있는 경우: 기존 문자열 객체의 참조를 반환한다. 새로운 객체를 생성하지 않는다.
- 없는 경우: 새로운 문자열 객체를 생성하고, 이를 String Constant Pool에 저장한다.
따라서 String Constant Pool에 저장된 하나의 객체를 공유하기 때문에 중복 생성을 방지하고, 문자열 객체를 재사용하여
메모리를 절약할 수 있다.
new 키워드 사용
new 키워드를 이용하여 선언하는 경우 객체가 힙 메모리에 저장된다.
항상 새로운 객체가 생성되기 때문에 항상 새로운 인스턴스가 필요한 경우 사용한다.
또한 동일한 문자열의 내용이라도 다른 객체를 참조한다.
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false (두 변수는 다른 객체를 참조)
System.out.println(a.equals(b)); // true (두 변수의 문자열 내용은 같음)
'Java' 카테고리의 다른 글
Exception (1) | 2025.01.07 |
---|---|
Process와 Thread (2) | 2025.01.07 |
동등성과 동일성 (0) | 2025.01.06 |
Primitive 타입과 Reference 타입 (0) | 2025.01.06 |
Enum (0) | 2025.01.06 |