Java에서 문자열을 자주 수정해야 하는 상황이라면 StringBuffer가 String보다 훨씬 효율적인 선택입니다. 그 이유를 하나씩 살펴보겠습니다.
StringBuffer란 무엇인가?
- StringBuffer는 스레드에 안전(thread-safe)하면서 변경 가능(mutable)한 문자 시퀀스입니다.
- String 클래스는 불변(immutable)인 반면, StringBuffer 클래스는 가변적입니다. 즉, StringBuffer 객체의 내용을 언제든지 변경할 수 있습니다.
- StringBuffer의 문자열을 수정할 때는 새로운 String 객체를 생성하는 것이 아니라 원본 문자열 자체를 직접 조작합니다.
- 이러한 이유로 StringBuffer 클래스는 String 클래스와는 다른 메서드 집합을 제공하며, 모든 메서드는 문자열을 담고 있는 버퍼를 직접 대상으로 동작합니다.
- StringBuffer는 new 연산자를 사용하고 생성자에 문자열 값을 전달하는 방식으로 간단하게 정의할 수 있습니다.
예제 코드
class StringBufferDemo{
public static void main(String arg[]){
StringBuffer sb = new StringBuffer();
sb.append("Java Tutorials Point");
System.out.println(sb);
}
}
위 프로그램에서는 먼저 StringBuffer 클래스의 인스턴스를 생성한 뒤, append() 메서드를 사용하여 "Java Tutorials Point" 문자열을 StringBuffer에 추가했습니다.
실행 결과
Java Tutorials Point
String과 StringBuffer의 차이점
String 객체는 한 번 생성되면 내용을 변경할 수 없습니다. 따라서 문자열을 반복적으로 연결하거나 수정할 때마다 새로운 객체가 계속 생성되어 메모리 낭비와 성능 저하로 이어질 수 있습니다. 반면 StringBuffer는 내부 버퍼를 직접 수정하기 때문에 잦은 문자열 조작 작업에서 훨씬 뛰어난 성능을 발휘합니다.
또한 StringBuffer의 메서드들은 동기화(synchronized)되어 있어 여러 스레드가 동시에 접근해도 데이터 손상 없이 안전하게 동작합니다. 다만 단일 스레드 환경이라면 동기화 오버헤드가 없는 StringBuilder를 사용하는 것이 더 나은 성능을 제공할 수 있습니다.