Post

면접준비 - Java String vs StringBuilder vs StringBuffer

오타, 지적 환영입니다.

String

  • String은 Immutable하다. 바꿀 수 없다. 그런데 +와 같은 연산을 수행하는것은 새로운 String객체를 생성하고 이를 반환한다는 의미이다. 그래서 메모리 공간의 낭비가 발생하고 성능이 떨어진다. 그 의미는 결과를 리턴할 String 객체를 새로 생성해서 원본 값들을 모두 담고 거기에 피연산자들을 추가(append) 연산을 한다는 것이다. 굉장히 비효율적. 그렇기에 시간복잡도는 "test" + "code" 사실상 O(test의 길이 + code의 길이)만큼 수행된다는 것이다.
  • JDK1.5 이후에는 컴파일 타임에 StringBuilder로 변경한다고 한다.
  • 그래도 불변객체이기에 멀티 쓰레드 환경에서 동기화 작업에는 신경을 쓰지 않아도 됨.
  • 그렇기에 업데이트를 자주 하지 않고 조회성에서는 쓰기 좋다.

String Pool

String은 String Pool에서 관리한다. 동등성, 동일성 포스팅에서 ==는 가리키는 주소값이 같을때 동일하다고 하였다.

1
2
3
4
5
String a = "Cat"; //String literal
String b = "Cat"; //String literal
String c = new String("Cat");
System.out.println(a == b);  // true
System.out.println(a == c);  // false

a와 b는 같은 주소를 가리킨다. 이를 메모리 구조로 나타내면

로 나타낼 수 있다. 즉 이러한 방식을 통해 String literal로 정의된 String객체는 똑같은 메모리 값 주소를 가리키므로 그만큼 메모리 재사용성이 늘어나는 것이다. new연산을 통해 생성된 객체는 Heap영역 내 별도의 메모리를 할당하여 주소를 가리키게 된다.

StringBuilder, StringBuffer

공통점

  • Mutable하다.
  • 그렇기에 연산시 새로운 객체를 생성하지 않고, 기존 객체에 연산을 수행하므로 String보다는 연산속도가 빠르다.
  • 따라서 업데이트성이 많은 문자열에 쓰기 유리하다.

차이점

  • StringBuilder : Thread-Safe하지 않다. 멀티 스레드 지원이 없다.
  • StringBuffer : Thread-Safe하다. 멀티 스레드 지원한다.

StringBuilder는 싱글 스레드환경일 때 사용하고 StringBuffer는 멀티 스레드환경에서 고려해야할 경우 사용하는게 좋다. 무조건적으로 StringBuffer를 사용하는건 아니다. StringBuilder가 성능은 더 좋다. StringBuffer는 내부적으로 synchronized이 적용되어 block을 걸기 때문이다.

Reference

This post is licensed under CC BY 4.0 by the author.