이전 포스트에서 문자열 클래스들에 대해 알아보았습니다.
그 중에서 "String은 불변 객체이다"라는 특징이 있었습니다.
그렇다면 왜 String은 불변 객체로 설계되었을까요?
String 객체가 불변 객체인 이유를 살펴보기 전에, 먼저 String 객체를 만드는 두 가지 방법에 대해 알아봅시다.
new 키워드를 사용해 String 객체를 생성하면, 이 객체는 Heap 메모리에 위치하게 됩니다. 동일한 문자열이라도 new 키워드를 사용해 각각 생성하면, 각 문자열은 서로 다른 메모리 주소를 가지게 됩니다.
반면에, 쌍 따옴표를 사용해 String 객체를 생성하면, 이 객체는 JVM의 String Constant Pool이라는 특별한 영역에 위치하게 됩니다. 이 영역에 있는 문자열은 재사용이 가능하므로, 같은 문자열이 여러 번 사용될 경우에도 한 번만 메모리를 차지하게 되어, 메모리 효율성과 성능이 향상됩니다.
그렇다면 이 String Constant Pool의 역할은 무엇일까요?
String Constant Pool의 역할은 중복된 String 객체의 생성을 최소화하는 것입니다. 즉, 같은 문자열에 대해 하나의 String 객체만을 생성하고, 이를 재사용하는 것입니다.
예를 들어, 'str = "abc"'라는 코드 실행 후 'str = "def"'를 실행하면, 'str'이 참조하는 주소값이 바뀝니다. 그러나 이는 'str' 변수가 참조하는 주소값만 바뀐 것으로, 실제로 "abc"와 "def"라는 문자열 데이터는 String Constant Pool에 그대로 유지됩니다.
요약하자면, String은 'String constant pool'이라는 특별한 영역에 문자열 데이터를 저장하며, String 변수는 이 주소를 참조합니다. 그리고 이 문자열 데이터는 한번 생성되면 절대로 변경되지 않으므로, String은 불변성을 가집니다.
String이 불변 객체인 이유에 대해 알아보았습니다.
불변성을 가짐으로 인한 이점은 무엇일까요?
보안
String의 불변성은 보안에 중요한 역할을 합니다. DB의 사용자 이름과 비밀번호, 네트워크 연결 정보와 같은 민감한 정보가 String으로 저장되는 경우가 많습니다. String이 불변성을 가지므로, 한 번 생성된 String 객체의 값은 변하지 않습니다. 따라서 개발자의 의도와는 별개로 String의 값이 예상치 못한 방식으로 변경되는 것을 방지할 수 있습니다.
성능
hashCode 메서드는 Java의 Object 클래스에 정의된 메서드로, 객체의 고유한 정수 값을 반환합니다. 이 메서드는 객체를 빠르게 비교하거나, 해시 기반의 자료구조에서 객체를 효율적으로 관리하기 위해 사용됩니다.
String 클래스에서는 이 hashCode 메서드가 문자열의 내용에 기반하여 고유한 정수 값을 생성하도록 재정의(오버라이딩)되어 있습니다. 즉, 동일한 문자열 내용을 가진 String 객체는 항상 같은 해시코드를 반환합니다.
또 String 클래스에서는 해시코드를 생성하는 작업이 한 번만 이루어지도록 설계되어 있습니다. 즉, hashCode 메서드가 처음 호출될 때 해시코드를 계산하고, 이 값을 내부에 저장(캐시)합니다. 그 이후로는 hashCode 메서드가 호출될 때마다 이 저장된 값을 반환합니다. 이렇게 해서 같은 String 객체에 대해 hashCode 메서드를 여러 번 호출하더라도 해시코드 계산은 한 번만 이루어지므로, 성능이 향상됩니다.
동시성 문제 방지
String 객체의 불변성은 여러 스레드에서 동시에 접근하더라도 안전하게 사용할 수 있도록 합니다. 여러 스레드에서 동일한 String 객체를 동시에 사용하더라도, 그 값은 변하지 않으므로 동기화 문제를 방지할 수 있습니다.
출처: https://velog.io/@ur2e/String%EC%9D%80-%EC%99%9C-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4%EC%9D%B8%EA%B0%80%EC%9A%94-String-Constant-Pool
https://readystory.tistory.com/139
https://velog.io/@indongcha/String-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%EB%B6%88%EB%B3%80%EC%84%B1