StringBuffer와 StringBuilder는 모두 가변(mutable) 클래스로, 문자열 뒤집기(reverse), 문자열 연결(concat) 등 다양한 문자열 연산을 수행할 수 있습니다. String 클래스와 달리 새로운 객체를 생성하지 않고도 기존 문자열을 수정할 수 있다는 것이 큰 장점입니다.
두 클래스의 가장 큰 차이는 스레드 안전성(Thread Safety)입니다. StringBuffer는 스레드 세이프(thread-safe)한 반면, StringBuilder는 스레드 세이프하지 않습니다. 이러한 특성 때문에 StringBuilder가 StringBuffer보다 더 빠른 성능을 제공합니다. 참고로 문자열 연결에 사용하는 + 연산자도 내부적으로는 StringBuffer 또는 StringBuilder 클래스를 활용합니다.
아래 표에서 두 클래스의 주요 차이점을 한눈에 비교해 보세요.
| 번호 | 구분 | StringBuffer | StringBuilder |
|---|---|---|---|
| 1 | 도입 시점 | 자바(Java) 최초 릴리스부터 포함 | Java 5부터 도입 |
| 2 | 동기화(Synchronized) | 동기화 지원 | 동기화 미지원 |
| 3 | 성능 | 스레드 세이프하여 여러 스레드가 동시에 접근할 수 없으므로 상대적으로 느림 | 스레드 세이프하지 않아 StringBuffer보다 빠름 |
| 4 | 가변성(Mutable) | 가변. 객체를 새로 생성하지 않고 문자열 수정 가능 | 역시 가변 |
| 5 | 저장 위치 | 힙(Heap) | 힙(Heap) |
StringBuilder 사용 예제
public class StringBuilderExample{
public static void main(String[] args){
StringBuilder builder = new StringBuilder("Hi");
builder.append("Java 8");
System.out.println("StringBuilderExample" + builder);
}
}StringBuffer 사용 예제
public class StringBufferExample{
public static void main(String[] args){
StringBuffer buffer = new StringBuffer("Hi");
buffer.append("Java 8");
System.out.println("StringBufferExample" + buffer);
}
}그렇다면 어떤 것을 선택해야 할까?
선택 기준은 간단합니다. 단일 스레드 환경이라면 동기화 오버헤드가 없는 StringBuilder를 사용하는 것이 좋습니다. 반면 멀티스레드 환경에서 여러 스레드가 동시에 하나의 문자열 객체에 접근하고 수정할 가능성이 있다면 데이터 일관성을 보장하는 StringBuffer를 사용해야 합니다.
대부분의 일반적인 애플리케이션 코드에서는 문자열 객체가 여러 스레드에 공유되는 경우가 드물기 때문에, 성능상 이점이 있는 StringBuilder를 사용하는 것이 일반적인 권장 사항입니다.