///////
Search
💫

String이 final이고 Immutable한 이유는 무엇인가요?

1. String Pool

Java 개발자들은 모든 종류의 Java 어플리케이션에서 가장 많이 사용되는 데이터 타입이 String이 될 것이라고 예측했었다.
그래서 몇 가지 아이디어를 낸다.
1.
String pool(Constant pool)에 String 리터럴을 포함하는 것
목표는 String 객체를 공유해 temporary하게 생성된 String 객체를 줄여주는 것
공유를 하기 위해서는 Immutable(불변)한 String 클래스를 만들어야 함
따라서, Java에서 String pool에 String 리터럴을 포함시키고자 String이 final이자 Immutable한 것

2) Security

Java는 모든 서비스 레벨에서 보안 환경을 제공하자는 목표를 가지고 있다.
특히, String은 호스트 및 포트, 디렉터리 경로, DB 연결에 필요한 URL 등에 자주 사용되기 때문에 보안이 더 중요하다.
따라서, Immutable하지 않다면 스템의 특정 파일에 대한 액세스 권한을 얻은 후 변경이 가능하기 때문에 보안을 위해서 String은 Immutable하고, final인 것이다.

3) Use of String in Class Loading Mechanism

class loading mechanism에서 자주 사용됨
String이 Immutable하지 않다고 하면 공격자는 악용 가능
ex) java.io.Reader 등 Java 표준 클래스의 로드 요청시에 악성 com.unknown.DataStolenReader 클래스로 변경하게 할 수 있음
결국 이 또한, 보안상의 이유라고 할 수 있다.

4) Multithreading Benefits

멀티 쓰레드 환경에서 동기화 문제는 보통 공유 자원에 동시에 쓸 때(Write) 일어난다.
만약 공유 자원이 Immutable하다면 항상 동일한 값을 반환할 것이기 때문이 더 이상 동기화를 e덜 고려해도 된다.
즉, String이 Immutable하기에 동기화 과정을 고려하지 않아도 되고, String을 공유하는 부분에서 읽기 쉬운 코드가 만들어진다.

5) Hash

String은 HashMap, Hashtable과 같은 해시 기반 컬렉션의 키로 많이 사용되기 때문에 동일한 값으로 저장된 객체를 검색할 수 있도록 해시 코드 캐시가 가능해야 함
String이 Immutable하기 때문에 해시 코드 캐시가 가능