String이 final 혹은 Immutable인 이유

김민혁·2022년 1월 22일
0

제임스 고슬링은 보안적인 이유로 final로 만들었다고 한다.
이에 대해 추가적인 5가지 이유를 제시한 글이 있다.\
https://www.java67.com/2014/01/why-string-class-has-made-immutable-or-final-java.html
이에 대해 정리해보겠다

String Pool

  • 자바 디자이너는 String이 가장 많이 사용되는 데이터 타입일것이라 예상함
  • 최적화가 필요하다
  • String pool에 String 리터럴을 포함시킴
  • 이를 통해 String 객체를 공유하여 템프러리하게 생성된 String 객체를 줄여줄려 했다.
  • 공유를 위해서 String 클래스는 Immutable class여야 한다.
  • 참고 : String pool은 Java Heap의 PermGen이라는 공간에 배치되어 Java Heap에 비해 상당히 제한되는 영역이다.(java 7 이후에는 String pool이 일반적인 힙공간으로 이동됨)

Security

  • 자바는 모든 서비스 레벨에서 보안 환경을 제공한다는 목표를 가지고 있다.
  • String은 호스트 및 포트, 디렉토리 경로 등에 사용되어 전반적인 보안에 중요하다.
  • 따라서 Immutable하지 않을 경우 액세스 권한을 얻은 후 PATH의 변경이 가능하다.

Use of String in Class Loading Mechanism

  • class loading mechanism에서 자주 사용된다.
  • 때문에 mutable할 경우 공격에 취약하게 된다
  • 이 또한 보안상의 이유라 할 수 있다.

Multithreading Benifits

  • Immutable하기 대문에 외부에서 동기화할 필요를 없앤다
  • 여러 스레드간에 String을 공유하는 부분에서 코드를 깨끗하게 정리해준다.
  • 즉, String은 concurrency하기 때문에 스레드간에 공유가 가능하고 결과적으로 읽기 쉬운 코드가 된다.

Optimization and Performance

  • 클래스가 변경 불가능하다는 점은 캐시 등의 많은 성능 최적화의 길을 열수 있게 한다.
  • String은 변경되지 않기 때문에 해시 코드가 캐시된다.
  • 따라서 해시가 자주 사용하는 경우에는 성능이 향상된다.
profile
학생

0개의 댓글