[JAVA] String vs StringBuffer vs StringBuilder 비교

String

  • Immutable(불변함)
  • 한 번 생성되면 할당된 메모리 공간이 변하지 않는다.
  • 문자열 연산(+, concat) 시, 새로운 String 객체 생성 후 연결된 문자열 저장 및 참조
  • Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성
  • 한 번 생성된 객체의 내부 내용을 변화시킬 수 없다.
  • 문자열 연산이 많은 경우, 성능이 좋지 않다.
  • 간단하고 동기화에 대해 신경쓰지 않아도 된다.(Thread-Safe), 내부 데이터를 자유롭게 공유 가능

StringBuffer, StringBuilder

  • Mutable(변함, 변하기쉬움)
  • 문자열 연산 등으로 기존 객체에 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작

StringBuffer vs StringBuilder 동기화 여부

  • StringBuffer는 각 메서드 별로 Synchronized Keyword 가 존재, 멀티스레드 환경에서도 동기화 지원 → 멀티 스레드 환경
  • StringBuilder는 동기화를 보장하지 않는다. → 단일 스레드 환경
  • StringBuffer를 단일스레드 환경에서도 사용 가능하지만, 동기화 관련 처리 때문에 StringBuilder에 비해 성능이 떨어진다.

* JDK 1.5 이전

  • 문자열 연산(+, concat) 시, 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈 존재

JDK 1.5 이후

  • 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경
    → String과 StringBuilder와 성능상으로 차이가 없어졌다.

단순 성능상으로 비교하자면,

StringBuilder > StringBuffer >>> String

댓글 남기기