자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리됨
문자열 리터럴은 String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성해서 사용할 수도 있음
public class StringExample {
public static void main(String [] args) {
//배열 전체를 String 객체로 생성
String str = new(byte[] bytes);
//배열의 offset 인덱스 위치부터 length만큼 String객체로 생성
String str2 =
new String(byte[] bytes, int offset, int length);
}
}
자바의 String은 참조 자료형임
다른 참조 자료형과 공통점 : new 생성자를 이용해서 인스턴스를 생성한 후, heap에서 메모리 관리가 이루어짐
차이점 : immutable함 -> 한 번 저장된 String 객체의 값은 변하지 않음 (기존의 값은 변경하면 객체가 변하는게 아니라 새로운 객체를 생성하고 재할당함)
=> String 객체들의 연산이 이루어질 때마다 새로운 객체를 계속 만들어 내기 때문에 메모리 관리 측면에서 상당히 비효율적임
=> 그래서 만들어진 메모리 영역이 Heap 안에 있는 String Constant Pool

public class StringPool {
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
}
}
s1 == s2 : true
s1 == s3 : false
s1은 heap 메모리에 개별 객체가 만들어지고, s2, s3는 String Constant Pool에 만들어진 하나의 객체를 참조함