String과 StringBuffer, 무엇이 다를까?
자바에서 문자열을 다룰 때 가장 많이 사용하는 클래스는 String입니다. 하지만 문자열을 자주 수정해야 하는 상황에서는 StringBuffer가 더 적합할 수 있습니다. 두 클래스의 핵심적인 차이와 각각의 특징을 자세히 알아보겠습니다.
String이란?
String은 불변(immutable) 클래스로, 한 번 생성된 객체는 이후 수정할 수 없습니다. 문자열을 변경하는 것처럼 보이는 연산을 수행하면 실제로는 기존 객체가 변경되는 것이 아니라 새로운 객체가 생성됩니다.
이러한 불변성 덕분에 String은 멀티스레드 환경에서 매우 유용합니다. 여러 스레드가 동시에 접근하더라도 객체의 상태를 변경할 수 없기 때문에, String 객체는 별도의 동기화 처리 없이도 스레드 세이프(thread-safe)하다고 할 수 있습니다.
StringBuffer란?
StringBuffer는 가변(mutable) 클래스로, 문자열 객체에 대해 뒤집기(reverse), 연결(concatenation) 등 다양한 연산을 수행할 수 있습니다. 가장 큰 장점은 새로운 객체를 생성하지 않고도 문자열을 수정할 수 있다는 점입니다.
또한 StringBuffer 역시 내부적으로 동기화 처리가 되어 있어 스레드 세이프합니다. 따라서 멀티스레드 환경에서 문자열을 빈번하게 수정해야 할 때 안전하게 사용할 수 있습니다.
+ 연산자의 내부 동작 방식
흥미로운 사실은, 문자열을 연결할 때 사용하는 + 연산자가 내부적으로 StringBuffer 또는 StringBuilder 클래스를 활용한다는 점입니다. 즉, 컴파일러가 문자열 연결 연산을 변환하여 처리하는 것입니다.
String vs StringBuffer 주요 차이점 비교
| 번호 | 구분 기준 | String | StringBuffer |
|---|---|---|---|
| 1 | 기본 특성 | 불변(immutable) 클래스로, 생성된 후에는 객체를 수정할 수 없음 | 가변(mutable) 클래스로, 문자열 객체에 대한 다양한 연산 가능 |
| 2 | 메서드 동기화 | 메서드가 동기화되지 않음(synchronized 없음) | 모든 메서드가 동기화(synchronized) 처리되어 있음 |
| 3 | 성능 | 빠름 | 여러 스레드가 동시에 접근할 수 없으므로 상대적으로 느림 |
| 4 | 메모리 영역 | 생성자나 메서드로 생성된 문자열은 힙(Heap) 메모리와 문자열 상수 풀(String Constant Pool)에 저장됨 | 힙(Heap) 공간에 저장됨 |
String 사용 예제
public class Main {
public static void main(String args[]) {
String s1 = "Hello Tutorials Point";
String upperCase = s1.toUpperCase();
System.out.println(upperCase);
}
}위 예제에서 toUpperCase()를 호출하면 원본 문자열 s1은 그대로 유지되고, 대문자로 변환된 새로운 String 객체가 반환됩니다. 이것이 바로 String의 불변성입니다.
StringBuffer 사용 예제
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("Hi");
buffer.append("Java 8");
System.out.println("StringBufferExample" + buffer);
}
}반면 위 예제에서 append() 메서드를 호출하면 기존 객체 자체가 수정됩니다. 새로운 객체를 생성하지 않고 문자열을 이어 붙일 수 있기 때문에, 반복적인 문자열 조작이 필요한 경우 성능 면에서 유리합니다.
정리
- String: 불변이며 스레드 세이프, 단순한 문자열 사용에 적합하고 속도가 빠름
- StringBuffer: 가변이며 스레드 세이프, 문자열을 반복적으로 수정할 때 적합하지만 동기화 오버헤드로 인해 약간 느림
- 단일 스레드 환경에서 문자열을 자주 수정한다면 동기화가 없는 StringBuilder를 고려하는 것도 좋은 선택입니다.