출처 : 출처
문자열
불변(immutable) 이 가장 큰 특징
String str = "hello"; // String str = new String("hello");
str = str + "world";
이 경우, String 클래스의 참조변수 str이 가리키는 곳에 저장된 "hello"에 "world" 문자열이 추가되는 형태가 아닌,
"hello world"라는 값을 가지고 있는 새로운 메모리 영역을 가리키게 변경되고, 처음 선언했던 "hello"로 값이 할당 되어있던 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게 됨.
즉, String 클래스는 불변하기 때문에, 새로운 String 인스턴스가 생성된 것.
따라서, String을 사용하고 싶다면, 변하지 않는 문자열을 선언할 때 사용하는 게 유리
=> 그렇지 않다면, Heap 메모리에 많은 임시 Garbage가 생성되어 메모리 부족으로 어플리케이션 성능에 치명적인 영향 끼침
따라서, 위 문제 해결을 위해, 가변성(Mutable)을 가지는 StringBuffer, StringBuilder 클래스 도입
위 두 클래스 모두 동일 객체 내에서 문자열 변경하는 것이 가능
가장 큰 차이점 : 동기화의 유무
StringBuffer => 동기화 키워드 지원 => 멀티 쓰레드 환경에서 안전함(thread-safe) => 값이 예상치 못하게 변경되는 것을 방지
그 외에는 StringBuilder가 성능이 뛰어나기에 StringBuilder 사용하면 된다.(단일쓰레드에서)