1. String
- immutable(불변)-> 간단하게 사용 가능, 동기화에 신경쓰지 않아도 되므로(Thread-safe) 내부 데이터를 자유롭게 공유 가능
- 대표적인 문자열 관리 클래스
- +연산자를 통해 문자열을 합칠 수 있음
- String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않음. 따라서 +연산자를 통해 문자열을 합치는 경우, 기존 문자열에 합치는 것이 아니라 새 문자를 포함하는 새로운 문자열 객체를 만들고, 이를 참조
- 처음 문자열의 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라짐
- 짧은 문자열을 더할 경우 사용
- 변하지 않는 문자열을 자주 읽어들이는 경우 좋은 성능을 기대할 수 있음
- 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 일어나는 경우에는 적합하지 않음 (힙 메모리에 많은 임시 가비지가 생성되어 힙메모리 부족 발생 가능)
- 불변성을 가지기 때문에 멀티쓰레드 환경에서의 안정성(thread-safe)을 가짐
2. StringBuilder
- 문자열 연산으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작(StringBuffer도 동일)
- 동기화를 보장하지 않으므로 단일 쓰레드 환경에서 사용
- 쓰레드에 안전하지 여부가 관계 없는 프로그램을 개발할 때 사용하면 좋음
3. StringBuffer
- mutable(가변)
- 각 메서드별로 Synchronized Keyword가 존재하여 멀티쓰레드 환경에서도 동기화를 지원
4. 결론
- 성능(연산이 많은 경우): StringBuilder»StringBuffer»»String
- String: 문자열 연산이 적고 멀티쓰레드 환경일 경우
- StringBuilder: 문자열 연산이 많고 단일쓰레드 환경이거나 동기화를 고려하지 않아도 되는 경우
- StringBuffer: 문자열 연산이 많고 멀티쓰레드 환경일 경우
5. 참고
- [자바] String, StringBuilder, StringBuffer의 차이 https://the-dev.tistory.com/2
- [Java] String, StringBuffer, StringBuilder 차이 및 장단점 https://ifuwanna.tistory.com/221