반응형

Java에서는 문자열을 다룰 때 String, StringBuffer, StringBuilder가 있습니다.

이 차이를 제대로 모르고 쓴다면 연산이 많이 질 경우 문제가 발생 하게 됩니다.

그 차이에 대해 알아 보도록 하겠습니다.

String과 StringBuffer, StringBuilder의 차이


String은 불변, Buffer와 Bulder는 가변 객체 입니다.

불변이란 객체를 변화 시킬 수 없는 것이고, 가변은 객체가 변할 수 있는 것 입니다.

예를 들어 보겠습니다.

아래의 코드는 문자열을 더했지만 String 클래스가 연산한 값을 새로운 String 객체로 생성한 것 입니다.

결과는 "ab"이지만 새로 "b" 문자열을 합칠 때 새로운 객체를 생성하고 이전의 str 객체는 GC에 의해서 제거 되게 됩니다.

String str = "a";
str += "b";

a를 저장 생성 했을 때 참조 주소

b를 추가 했을 때 참조 주소

즉, 위와 같이 연산이 빈번하게 일어나게 되면 String을 사용하는 것은 옳지 않습니다.
Buffer 또는 Builder를 사용해야 합니다.

StringBuffer와 StringBuilder의 차이


StringBuffer

  • 동기화가 가능하기 때문에 멀티 쓰레드에 안전합니다.
  • 멀티 쓰레드란 여러 군데에서 동시에 요청이 들어 온다고 생각 하시면 됩니다.
  • 동기화란 멀티 쓰레드에서 동시화 요청이 오면 모든 쓰레드가 동기화 되어 있기 때문에 한 쓰레드의 요청이 끝날 때 까지 기다려야 합니다.
    그렇기 때문에 하나의 StringBuffer 객체를 여러 쓰레드가 변경할 수 없기 때문에 멀티 쓰레드에 안전하게 됩니다.
    이를 thread-safe라고 합니다.

StringBuilder

  • StringBuffer와 다른 점은 동기화가 불가능 하다는 것 입니다.
  • 동기화를 고려하지 않아도 되기 때문에 단일 쓰레드에서 사용하게 된다면 Buffer보다 성능이 뛰어 납니다.

정리

  • 단일 쓰레드에서는 StringBuilder 멀티 쓰레드에서는 StringBuffer를 사용하는게 좋다고 생각 합니다.
반응형
복사했습니다!