본문 바로가기
cs

String의 불변성과 StringBuilder와 StringBuffer의 차이

by 이쟝 2023. 6. 8.
기술면접 스터디에서 String의 불변성과 StringBuilder와 StringBuffer에 대해서 공부해봤습니다 :)

불변 객체란?

객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체

문자열 데이터는 스택 메모리에 직접 저장되는 것이 아니라 Heap 영역 중에서 String constant pool이라는 곳에 메모리를 할당 받아서 값을 저장하고, String은 그 주소 값을 참조하게 된다. 그래서 값이 변경된다고 해도, 참조 값이 변경된 것이지 실제 데이터가 변경된 것이 아니다. => String의 불변성

String 객체가 불변객체인 이유

1. 메모리 절약

  String은 가장 많이 사용되는 데이터 타입 중 하나 이기 때문에 String 타입의 객체들이 가장 많은 메모리를 차지하게 된다. 문자열 객체는 재사용 될 가능성이 높기 때문에 같은 값일 경우 애플리케이션 당 하나의 String 객체만을 생성해서 Heap 영역의 메모리를 절약하고자 한다.

 

  String pool을 통해 String을 관리해서 같은 값을 갖는 String에 대해 같은 메모리를 참조할 수 있게 하기 때문에 Runtime에서 Heap 영역의 많은 메모리를 절약할 수 있다.

 

  만약 String이 불변이 아니면, 해당 메모리에 값이 언제 바뀔지 알 수 없기 때문에 String pool 형태로 관리할 수 없게 된다.

2. 보안상의 문제

  String이 불변이 아니면 보안상의 문제를 야기할 수 있다. 문자열로 이루어지는 정보들(사용자 이름, 등)은 불변이어야지 해커의 공격으로부터 값이 변경되는 것을 예방할 수 있다.

3. 스레드 안정성

  String이 불변이어서 멀티 쓰레딩 환경에서 값이 바뀔 위험이 없기 때문에 안전하고, 동기화와 관련된 위험요소에서 벗어날 수 있다.

 

The key benefits of keeping this class as immutable are caching, security, synchronization, and performance.


String, StringBuffer, StringBuilder 

  • 모두 문자열을 저장하고, 관리하는 클래스
  • 문자열 사이에 + 연산을 하면서 새로운 String 객체가 생성되는 낭비를 방지하고자 StringBuffer, StringBuilder 두가지의 클래스가 등장했다. 
  • 두 클래스 모두 AbstractStringBuilder라는 추상 클래스를 상속 받아 구현되어 있다. 

 

String은 불변성 / StringBuffer와 StringBuilder는 가변성

StringBuffer/StringBuilder는 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다.


StringBuffer와 StringBuilder의 차이점은 동기화 여부이다. StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여 멀티스레드 환경에서 안전하다.

멀티스레드 환경이라면 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되지는 않지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

Java에서 synchronized 키워드는 여러개의 스레드가 한 개의 자원에 접근하려고 할 때, 현재 데이터를 사용하고 있는 스레드를 제외하고, 나머지 스레드들이 데이터에 접근할 수 없도록 막는 역할을 수행

 

  • String : 문자열 연산이 적고, 멀티쓰레드 환경일 경우
  • StringBuffer : 문자열 연산이 많고, 멀티쓰레드 환경일 경우
  • StringBuilder : 문자열 연산이 많고, 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우

 

 


Java의 String 이야기 - String은 왜 불변(Immutable)일까?

Java에서 String은 왜 불변일까?

Why String Is Immutable in Java?

String의 Immutable이 의미하는 것

String, StringBuilder, StringBuffer의 차이

STRING의 더하기 연산으로 인한 문제점과 STRINGBUFFER, STRINGBUILDER의 특성과 차이점

Stiring vs StringBuffer vs StringBuilder