
자바에서 문자열을 다루는 가장 기본적인 방법은 String 클래스를 사용하는 것입니다. 하지만 문자열이 자주 변경되는 상황에서는 StringBuilder나 StringBuffer를 활용하는 것이 더 효율적입니다. 이번 글에서는 이 세 가지 클래스의 특징과 차이점을 정리해 보겠습니다.
1. 자바에서 문자열을 다루는 방식
자바는 문자열을 단순한 데이터가 아닌 **객체(Object)**로 취급합니다.
- 문자열 리터럴 "hello"는 내부적으로 String 객체로 관리됩니다.
- 자바에서 문자열을 다루는 대표적인 클래스는 String, StringBuilder, StringBuffer 세 가지입니다.
각각의 클래스는 메모리 사용 방식과 쓰레드 안전성(Thread Safety)에서 차이가 있습니다.
2. String 클래스의 특징과 한계
String 클래스는 불변(Immutable) 객체입니다.
String str = "Hello";
str = str + " World"; // 새로운 String 객체가 생성됨
- 특징: 한 번 생성된 문자열은 변경 불가능
- 장점: 불변 객체이므로 메모리 안정성이 높고, 멀티스레드 환경에서도 안전하게 사용할 수 있음
- 단점: 문자열을 자주 수정하는 경우 성능 저하 발생
즉, 변경이 거의 없는 문자열 데이터에 적합합니다.
3. StringBuilder의 특징과 활용
StringBuilder는 가변(Mutable) 문자열 클래스입니다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 같은 객체 내부에서 문자열 변경
- 특징: 문자열 수정 시 새로운 객체를 생성하지 않음
- 장점: 문자열을 자주 연결하거나 수정할 때 성능이 매우 뛰어남
- 단점: 멀티스레드 환경에서 안전하지 않음
따라서 단일 스레드 환경에서 문자열 처리를 최적화할 때 적합합니다.
4. StringBuffer의 특징과 차이점
StringBuffer는 StringBuilder와 거의 동일한 기능을 제공하지만, **쓰레드 안전(Thread-Safe)**합니다.
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(" World");
- 특징: 내부 메서드가 동기화(Synchronized)되어 있음
- 장점: 멀티스레드 환경에서 안전하게 문자열 처리 가능
- 단점: 동기화 처리로 인해 성능이 StringBuilder보다 다소 느림
즉, 멀티스레드 환경에서는 StringBuffer를, 단일 스레드 환경에서는 StringBuilder를 선택하는 것이 바람직합니다.
5. String, StringBuilder, StringBuffer 비교 정리
| 클래스 | 불변 여부 | 쓰레드 안전성 | 성능 | 사용 적합 환경 |
| String | 불변 | 안전 | 느림 | 문자열 변경이 적은 경우 |
| StringBuilder | 가변 | 안전하지 않음 | 빠름 | 단일 스레드 환경에서 문자열 자주 수정 |
| StringBuffer | 가변 | 안전 | 보통 | 멀티스레드 환경에서 문자열 수정 |
✅ 마무리
자바에서 문자열을 다룰 때 **변경 빈도와 실행 환경(단일/멀티스레드)**에 따라 적절한 클래스를 선택하는 것이 중요합니다.
- 변경이 거의 없으면 String
- 단일 스레드에서 성능이 중요하면 StringBuilder
- 멀티스레드 환경이라면 StringBuffer
이렇게 선택하면 메모리 효율성과 실행 성능을 모두 잡을 수 있습니다.