안녕하세요.
이번 글에서는 String, StringBuffer, StringBuilder 의 차이와 특징에 대해 알아보겠습니다.
String 과 StringBuffer, StringBuilder 의 차이점
String str = "Hello";
// 1111 이라는 heap memory에 적재된다고 가정한다.
str = str + "World";
// str 은 immutable인 특징에 따라 새로운 메모리로 할당받습니다. (새로운 객체 생성)
// str = "Hello World" 은 2222 라는 heap memory에 적재된다고 가정하고
// 1111 heap memory의 "Hello"는 가비지 컬랙터에 의해서 이후 삭제된다.
String 과 반대로 StringBuffer/StringBuilder 는 가변성을 가지기 때문에 동일 객체 내에서 문자열을 변경하는 것이 가능합니다.
그러므로 문자열의 추가, 수정, 삭제가 자주 발생하는 경우에는 String 클래스가 아닌 StringBuffer/StringBuilder 를 사용해야 합니다.
StringBuffer sb = new StringBuffer("Hello");
// 3333 이라는 heap memory에 적재된다고 가정한다.
sb.append("World");
// StringBuffer 는 가변성을 가지기 때문에 동일하게 3333 이라는 heap memory를 가진다.
// 즉, 새로운 객체가 생성되지 않고 동일 객체 내 문자열 변경이 가능하다.
// -> 메모리 낭비를 줄일 수 있다.
StringBuffer vs StringBuilder
그렇다면 StringBuffer 와 StringBuilder 와의 차이점은 무엇일까요?
가장 큰 차이점은 동기화의 유무로 StringBuffer는 동기화 키워드를 지원하므로 멀티쓰레드 환경에서 안전하는 점 (thread-safe) 입니다.
** String은 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서 안전합니다.
반대로 StringBuilder 는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않습니다.
하지만 동기화를 고려하지 않았기에 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.
최종 정리
각 클래스 별로 사용하는 상황에 대해 정리하겠습니다.