본문 바로가기
Engineering WIKI/Java

[Java] String, StringBuffer, StringBuilder 개념 뿌수기!

by wonos 2019. 8. 23.

String

  • 가변 여부 : 불변 (Immutable)
  • Thread-safe : True
  • 연산 속도 : 느림
  • 저장 위치 : String Constant Pool (리터럴 생성)
  • 사용 : 문자열 추가 연산이 적고, Thread-safe 환경
  • 정리 : String은 Immutable 하기 때문에, 멀티 쓰레드 환경에서 사용해도 문제가 없다. 하지만 문자열을 수정 하는 경우 새로운 String 인스턴스가 생기므로 문자열 연산을 많이 하는 경우 객체 수가 늘어나 성능이 떨어진다.
String str = "hello"; 
str = str + " world";

// 두번째 줄 연산에 의해 기존 str이 가지고 있던 "hello" 메모리는 GC 대상이 되고,
// 새로운 메모리에 "hello world"가 올라간다.
// GC에 의해 수거 되더라도, 연산이 많아질 경우 메모리 Leak 발생 !

 

StringBuffer

  • 가변 여부 : 가변 (Mutable)
  • Thread-safe : True
  • 연산 속도 : 중간
  • 저장 위치 : Heap
  • 사용 : 문자열 추가 연산이 많고, Thread-safe 환경, 멀티쓰레드 환경 !
  • 특징 : 가변성을 가지며, 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작. .append(), .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능하다. • 동기화 키워드(synchronized keyword)를 지원하여 멀티쓰레드 환경에서 안전하다. 초기 buffer의 크기 설정, 버퍼 크기 줄이고 늘리며 객체 생성 속도가 느리다.
StringBuffer sb= new StringBuffer("hello"); 
sb.append(" world");

// String과 달리 같은 메모리 사용!

StringBuilder

  • 가변 여부 : 가변 (Mutable)
  • Thread-safe : False
  • 연산 속도 : 빠름
  • 저장 위치 : Heap
  • 사용 : 문자열 추가 연산이 많고, Thread-safe 고려 x, 빠른 연산 필요
  • 특징 : 가변성을 가지며, Thread-safe 하지 않아서 성능이 좋다. 하지만 멀티쓰레드 환경에서 동기화를 고려하지 않아도 될 때 사용!

Thread-safe란 ?

  • 자원을 선점할때 Lock를 걸기 때문에 그만큼의 성능 효율이 매우 안 좋다는 것을 의미
  • 그래서 v1.4때까지는 StringBuffer를 사용했지만, 그 이후 버전에는 성능이 좋은 StringBuilder를 사용!