🔗 참고자료

  • 블로그 <Wonit> String과 String Constant Pool => 링크
  • 블로그 <doohong's blog> 자바의 기본 개념 정리-4.String pool => 링크

 

✍ 공부하게 된 계기

'자바의신' 이라는 책을 읽고 String에 대한 챕터를 읽다가 위의 내용들이 나왔습니다.

이번에 자바를 좀 더 깊게 공부하기 위해 모르는 단어를 직접 찾아보고 정리하기로 했습니다.

단어에 대해서 찾다보면 부가적으로 배우는 것들도 많아서 꼭 해야할 것들이라고 생각합니다.

 

 

 

String은 immutable(불변) 타입

String 객체의 값은 변경할 수 없다.

String text = "my Text";
text = "my new Text";

위 예제와 같이 String 자료형인 text 변수를 최초로 "my Text"로 할당했다.

그 다음줄을 보면 text 변수에 "my new Text" 값을 변경 시킨 것처럼 보인다.

 

하지만 실제로는 메모리에 "my new Text" 를 다시 만들고 text를 다시 참조하게 된다.

 

  • 자바에서 String은 constant 형태로 한 번 생성이 된다면 update 라는 개념이 사라진다.
  • 값을 수정할려고 하면 새로운 객체를 생성하고 그 값을 재할당해야 한다.

 

 

 

자바에서 String을 immutable 하게 한 이유 3가지

  • 캐싱
    JVM이 String Constant Pool 이라는 영역을 만들고 문자열들을 Constant화 하여 다른 변수 혹은 객체들과 공유하게 되는데, 이 과정에서 데이터 캐싱이 일어나고 그 만큼 성능적 이득을 취할 수 있다.

  • 동기화
    데이터가 immutable 하다면 Multi-Thread 환경에서 동기화 문제가 발생하지 않기 때문에 더욱 safe한 결과를 낸다.

  • 보안(Security)
    여러 참조 변수가 같은 String 객체를 참조하고 있다고 하더라도 안전하다.
    String 객체를 누가 조작할 수 없기 때문이다.
    그래서 원본 String 객체가 저장된 주소 자체를 넘겨도 안전하다.
    전달받은 곳에서 원본 값을 직접 읽을수 있으나 조작할 수는 없기 때문이다.
    예를들어 데이터베이스로 유저의 id나 비밀번호를 전송할 때 String 변수가 제 3자(해커)가 변경하지 못하도록 한다.

 

 

❓ String pool이란?

  • String은 재사용을 고려해서 Heap 영역에 내에 문자열 상수의 Pool 을 유지한다.
  • 해당 Pool로 사용자가 정의한 변수가 가지고 있는 value 들을 담게 된다.
  • String Constant Pool 을 이용하기 위해서는 Literal을 이용해 생성해야 한다.
    new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 된다.
    리터럴을 이용할 경우 String constant pool 이라는 영역에 존재하게 된다.

 

 

 

String pool의 위치

  • java 6 버전까지는 Perm 영역에 있었다.
    - Perm 영역은 고정된 사이즈이며 Runtime에 사이즈가 확장되지 않는 문제 발생
  • intern 되는 String 값이 커지면 OutOfMemoryException을 발생시킬 수 있었고,
    그에 따라서 java7 버전은 Heap 영역으로 String pool의 위치를 변경하였다.
반응형

+ Recent posts