String / StringBuffer / StringBuilder의 차이점을 잘 정리한 분이 계셔서 출처를 밝히고 블로그에 정리하고 복습하기로 했다.
출처: https://ifuwanna.tistory.com/221
Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다. 그러나 연산 횟수가 많아지거나 멀티쓰레드, Race condition 등의 상황이 자주 발생한다면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.
String 클래스틑 불변(immutable)의 속성을 갖는다. 그래서 String의 객체 두 개를 conacat 하기 위해서 +연산을 활용할 때, 두 스트링이 연결되는 것이 아니라 새로 생성한 String 인스턴스의 메모리 영역을 가리키게 변경되고 처음 선언했던 메모리 영역은 Garbage로 남아 있다가 GC(garbage collection)에 의해 사라지게 되는 것이다.
즉, 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용하면 좋은 성능을 기대할 수 있지만, 문자열 수정이 빈번하게 발생하는 경우에는 힙(heap) 메모리에 많은 임시 가비지(Garbae)가 생성되어 힙메모리가 부족해져 어플리케이션 성능에 치명적인 영향을 끼치게 된다.
StringBuffer와 StringBuilder는 가변성을 가지기 때문에 .append(), .delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 따라서 문자열의 수정이 빈번하게 발생할 경우에는 StringBuffer나 StringBuilder를 사용해야 한다.
이 둘의 차이점은 동기화의 유무이다.
StringBuffer -> 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전함(thread-safe).
StringBuilder -> 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어나다.