Java에 String은 불변(Immutable) 객체입니다.
불변 객체(Immutable)란, 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체를 말합니다.
즉, 변수에 객체가 한 번 할당되면, 해당 객체의 참조를 변경할 수도, 내부의 상태를 수정할 수도 없습니다.
String이 불변인 이유?
1. String Pool
String이 불변이기 때문에 String Pool도 존재할 수 있습니다.
Java에서는 String Pool이라는 공간에 String을 포함시켜서, 매번 String 객체를 새로 생성하기보다 값이 같은 String이라면 String Pool에 있는 객체를 재사용할 수 있도록 구현함
-> String 리터럴 변수 저장
즉, 값이 같은 String은 String Pool 내에서 String 객체를 공유하도록 한 것입니다.
그런데 공유를 하려면 String은 반드시 immutable, 즉 불변이어야 합니다.
mutable 하다면 두 객체의 공유는 불가능합니다.
Java에서는 String pool을 구현하기 위해 String을 immutable한 객체로 만들어야 했습니다.
2. 보안
Java에서 메서드의 파라미터로 String을 받는 경우는 매우 흔합니다.
사용자 이름, 비밀번호 혹은 네트워크 연결을 위한 포트 번호 등 중요한 정보를 String으로 받습니다.
JVM의 Class loader가 Class loading을 수행할 때도 마찬가지입니다.
String이 mutable 하다면, 메서드의 인자로 받은 값은 메서드의 caller(호출자)에 의해 언제든지 바뀔 수 있게 되므로, 이는 보안상 엄청난 취약점을 발생시킵니다.
3. 동기화(Synchronization)
객체가 불변이면 멀티 스레드 환경에서도 값이 바뀔 위험이 없기 때문에, 자연스럽게 Thread-safe한 특성을 갖게 되고, 동기화와 관련된 위험 요소에서 벗어날 수 있습니다.
여러 스레드에서 동시에 접근해도 별다른 문제가 없습니다.
또한, String의 경우 한 스레드에서 값을 바꾸면, 해당 객체의 값을 수정하는 것이 아니라 새로운 객체를 String Pool에서 생성합니다. 따라서 Thread-safe 하다고 볼 수 있습니다.
4. Hashcode Caching
String의 hashCode() 메서드 구현을 보면, 아직 hash 값을 계산한 적이 없을 때 최소 한 번만 실제 계산 로직을 수행합니다.
이후부터는 이전에 계산했던 값을 그냥 리턴만 하도록 되어 있습니다.
즉, hashCode 값을 캐싱(Caching)하고 있습니다.
caching이 가능한 것도 결국 String이 불변이기 때문에 얻을 수 있는 이점입니다.
5. 성능
String이 불변성을 가짐으로써 "성능" 이라는 측면에서 유리하다는 것을 알 수 있습니다.
String은 상대적으로 자주 쓰이는 타입이기 때문에, String의 성능을 개선하는 것은 전체 애플리케이션의 성능에도 긍정적인 영향을 주게 됩니다.
'Back-end > Java' 카테고리의 다른 글
[Java] Java 8 VS Java 11 (0) | 2022.04.18 |
---|---|
[Java] Compiler VS Interpreter (0) | 2022.03.09 |
[Java] String = " " VS new String(" ") (0) | 2022.03.08 |
[Java] Wrapper class (0) | 2022.03.07 |
[Java] Checked Exception 과Unchecked Exception (0) | 2022.03.07 |