String
String은 참조 타입이지만, 리터럴 표기 방식을 사용할 수 있다.
String str = "Hello";
Java
복사
불변성
String은 한 번 생성되면 값을 읽기만 할 수 있고, 변경할 수 없다.
new 키워드로 생성할 경우 Heap에 개별적인 메모리를 갖게 되고,
리터럴로 생성할 경우 Heap의 String Pool에 생성하게 된다.
동일한 값이 존재한다면 String Pool에 있는 주소 값을 반환하고,
동일한 값이 존재하지 않다면, 새로운 주소를 할당하고 해당 주소를 반환한다.
만약 A라는 String 리터럴을 저장하고 있는 변수에 다른 String 리터럴 B를 대입한다면?
Java는 B라는 리터럴이 String Pool에 존재하지 않는다면 String Pool에 생성 후 참조 값을 반환하고,
만약 B라는 리터럴이 존재할 경우 B의 참조 값을 반환하여 중복 생성되지 않도록 한다.
또 덧셈(+) 연산자를 이용하여 문자열 결합을 수행하면, 기존 문자열의 내용이 변경되는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스가 생성된다.
결론적으로 Value가 같지 않은 String 서로 다른 객체라고 할 수 있고, 이 객체는 변하지 않는 객체이다.
String의 불변성 덕분에 Thread-Safe를 가져갈 수 있다.
→ 멀티스레드 환경에서 장점을 갖는다.
String이 구현하는 인터페이스
1.
java.io.Serializable:
•
객체의 직렬화(serialization) 및 역직렬화(deserialization)를 지원하는 인터페이스입니다.
•
String 클래스는 이 인터페이스를 구현하여 객체를 바이트 스트림으로 변환하고 다시 복원할 수 있습니다.
2.
java.lang.CharSequence:
•
문자 시퀀스를 나타내는 인터페이스로, String 클래스는 CharSequence 인터페이스를 구현합니다.
•
문자열을 다루는 다양한 작업을 가능하게 합니다.
3.
java.lang.Comparable<String>:
•
객체의 순서를 정의하기 위한 인터페이스로, String 클래스는 Comparable<String>을 구현하여 문자열을 비교할 수 있도록 합니다.
4.
java.lang.constant.Constable:
•
Java 12에서 도입된 상수 표현을 위한 인터페이스입니다.
•
String 클래스는 Constable 인터페이스를 구현하여 상수 표현에 사용될 수 있습니다.
5.
java.lang.constant.ConstantDesc:
•
Java 12에서 도입된 상수 설명을 위한 인터페이스입니다.
•
String 클래스는 ConstantDesc 인터페이스를 구현하여 상수에 대한 메타데이터를 제공할 수 있습니다.
이러한 다섯 가지 인터페이스를 구현함으로써 String 클래스는 직렬화, 문자 시퀀스 처리, 비교, 상수 표현, 상수 설명 등 다양한 기능을 제공합니다.