[Java] String은 왜 불변(Immutable)일까?

해니·2024년 10월 17일
0

Java

목록 보기
19/34
post-thumbnail

String 객체 생성 방법

String literal 로 생성

String name = "haeni";
String name1 = "haeni";
  • ""을 이용하여 문자열을 생성한다.
  • String 값이 Heap 영역 내 String Constant Pool(String Pool)에 저장된다.
  • 동일한 문자열을 생성할 경우 해당 객체들은 String Constant Pool 내의 동일한 객체를 바라본다.
    • 동일한 문자열은 저장소를 공유할 수 있다.

Java 7 버전 이전에는 Perm 영역에서 관리되었으나, Java 7부터 String Constant PoolPerm영역에서 Heap 영역으로 옮겨졌다. Heap 영역은 GC 대상으로 String Constant Pool에서 참조를 잃은 문자열 객체들은 다시 메모리로 반환처리 된다.


String Object

String name2 = new String("haeni");
String name3 = new String("haeni");
  • new 연산자로 문자열을 생성한다.
  • Heap 영역에 저장된다.
  • 동일한 문자열을 생성하더라도 Heap에서 서로 다른 객체를 만들고 바라본다.
    • 문자열이 같더라도 저장소 공유가 불가능하다.
  • intern() 메서드로 등록하면 new 연산자를 통해 문자열을 생성하더라도 String Pool에 등록된다.

💡 불변성의 장점을 위해 String Literal을 이용해서 String을 생성하는 것이 좋다.



문자열 비교

==와 equals() 차이점

  • == : 두 객체가 동일한 객체인지 주소값을 비교한다.
  • equals() : 두 객체의 값 자체를 비교한다.



String 불변(Immutable)

Heap 영역의 많은 메모리 절약

  • String literal로 생성한 경우, 동일한 값을 갖는 String은 같은 메모리를 참조할 수 있기 때문에 메모리를 절약할 수 있다.
  • String이 불변이 아니었다면, 해당 메모리에 값이 언제 바뀔지 알 수 없기 때문에 String pool 형태로 관리할 수 없다.

멀티스레드 환경에서 안전(thread-safe)

  • 불변 객체는 값이 바뀌지 않기때문에 멀티스레드 환경에서 Thread-safe하다.
  • 스레드가 값을 변경하면 동일한 String을 수정하는 대신 String Constant Pool에 새 문자열이 생성된다.

해시코드 캐싱 (Hashcode Caching)

  • Stringhashcode는 생성 단계부터 캐싱하기 때문에, 쓰일 때마다 매번 계산되지 않는다.
  • HashMap의 경우, 다른 객체를 Key로 했을 때보다 StringKey로 했을 때 더 빠른 속도로 사용할 수 있다.

💡 Q. MapKey 값을 Object가 아닌 String으로 선언하는 이유는 ?
-> Key가 잘못 참조되는 것을 방지할 수 있음



String, StringBuilder, StringBuffer 차이


가변(mutable) 객체

  • String 클래스는 불변하지만 StringBuilder, StringBuffer 클래스는 변할 수 있다.
    • StringBuilder, StringBuffer 클래스는 연산시 주소의 변경 없이 기존 객체의 공간이 부족하게 되면 기존 버퍼의 크기를 증가 시키면서 새로운 문자열을 더한다.
    • 문자열 연산이 많은 경우 String 클래스 보다 StringBuilder, StringBuffer 클래스가 성능이 나은 편이다.

동기화의 유무

  • StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전(thread-safe)하다.
  • StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않다.
    • 단일쓰레드에서의 성능은 StringBuffer보다 StringBuilder가 뛰어나다.






출처

[Java] 불변 객체(Immutable Object)와 final
String Constant Pool이란? | Java String Pool
문자열은 불변한다(String is Immutable)
Java String 객체와 String 리터럴
String은 왜, 어떻게 불변 객체인가요? String Constant Pool

profile
💻 ⚾️ 🐻

0개의 댓글