자바에서 문자열을 다루다 보면 String과 StringBuffer 중 어떤 것을 사용해야 할지 고민하게 됩니다. 두 클래스는 겉보기에는 비슷하지만, 불변성(immutability)과 성능 면에서 큰 차이가 있습니다. 이번 글에서는 두 클래스의 핵심 차이점을 예제 코드와 비교표를 통해 쉽게 정리해 보겠습니다.
1. String 클래스란?
- 불변(immutable) 클래스입니다. 즉, 한 번 생성된 문자열 객체는 내용을 변경할 수 없습니다.
- 문자열을 수정하는 것처럼 보이는 연산을 수행하면 실제로는 매번 새로운 인스턴스가 생성됩니다.
- 그래서 문자열을 반복해서 연결하면 속도가 느리고, 그때마다 새 객체가 만들어져 메모리를 더 많이 소비합니다.
- Object 클래스의
equals()메서드를 오버라이드했기 때문에, 두 문자열의 내용을 기준으로 비교할 수 있습니다.
String 사용 예제
public class StringDemo {
public static void main(String args[]) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
System.out.println("String Length is : " + len);
}
}2. StringBuffer 클래스란?
- 가변(mutable) 클래스입니다. 객체를 생성한 후에도 내용을 자유롭게 수정할 수 있습니다.
- 새로운 객체를 만들지 않고 기존 버퍼에서 직접 값을 변경하기 때문에 처리 속도가 빠릅니다.
- 문자열을 연결할 때 추가 객체가 생성되지 않으므로 메모리를 효율적으로 사용합니다.
- Object 클래스의
equals()메서드를 오버라이드하지 않았습니다. 따라서 equals()로 비교하면 내용이 아닌 참조(주소) 값이 같은지 확인됩니다. - 내부 메서드가 동기화(synchronized) 처리되어 있어 멀티 스레드 환경에서도 안전(thread-safe)합니다.
StringBuffer 사용 예제
public class Demo {
public static void main(String args[]) {
StringBuffer sBuffer = new StringBuffer("test");
sBuffer.append(" String Buffer");
System.out.println(sBuffer);
}
}3. String vs StringBuffer 핵심 차이 비교표
| 구분 | String | StringBuffer |
|---|---|---|
| 변경 가능 여부 | 불변 (immutable) | 가변 (mutable) |
| 문자열 연결 시 성능 | 느림 | 빠름 |
| 메모리 사용량 | 새 객체 생성으로 많이 사용 | 적게 사용 |
| equals() 오버라이딩 | 있음 (내용 비교) | 없음 (참조 비교) |
| 스레드 안전성 | 안전함 (불변이므로) | 안전함 (동기화 지원) |
4. 마무리 정리 및 활용 팁
문자열이 거의 변하지 않는 경우라면 String을 사용하고, 반복적인 문자열 연결이나 수정 작업이 많은 경우에는 StringBuffer를 사용하는 것이 좋습니다.
추가로, 단일 스레드 환경이라면 동기화 오버헤드가 없는 StringBuilder가 StringBuffer보다 더 나은 성능을 제공합니다. 프로그램의 실행 환경과 용도에 맞게 적절한 클래스를 선택하시기 바랍니다.