자바에서 String 객체는 불변성이라는 특징을 갖습니다. 그렇다면, 자바에서 왜 String은 불변성 객체이어야만 하는지에 대해 알아보기 위해 해당 포스팅을 작성했습니다.
📜 참고 블로그
/**
* String 불변성 TEST
*/
public class StringImmutableTest {
public static void main(String[] args) {
String str1 = "ab";
String str2 = "ab" + "c";
// c라는 문자열을 추가만 했을뿐인데, str1의 주소값이 바뀔까?
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
}
}
/* 결과 */
925858445
798154996
ClassLoader : 자바는 String 객체를 매개변수로 사용합니다. 따라서, String 값이 가변성을 갖게될 경우, 로딩될 클래스 내부 값이 달라질 수 있게 됩니다. 이러한 오류를 방지하기 위해서 자바 String 객체는 불변성을 갖습니다.
Thread Safe : String 객체는 불변성을 갖기 때문에, 멀티 쓰레드로 String 객체를 공유 시 동기화를 신경쓰지 않아도 됩니다.
Security : String 객체는 클래스 로딩 시 올바른 클래스를 로딩함으로써 발생할 수 있는 오류들을 예방할 수 있습니다. 은행 같은 경우에, 사용자명과 비밀번호를 외부로 부터 수정되는 것을 막을 수 있습니다. 이는 String 은 불변성 객체이므로, 값을 변경하더라도 해당 값을 참조하는 것이 아니면, 기존의 값을 참조하기 때문입니다.
Heap Space : String 객체의 불변성은 heap 메모리를 최소로 사용할 수 있도록 도와줍니다. 개발자가 새로운 String 객체를 선언할 때, JVM에서는 String Constant Pool에 해당 String Literal이 존재하는지 확인 후 존재할 경우, 해당 객체의 참조값을 반환합니다. 이로 인해서 Heap 메모리를 효과적으로 사용할 수 있도록 해줍니다.