
String ?Java에서는 String을 굉장히 많이 사용하지만 문자열을 다루는 String은 기본형 변수들과 차이점이 존재한다.
바로 참조형 변수라는 점
따라서 String은 생성되면 메모리에 할당시키고, 불변한 객체가 된다.
String (1) str = "hello";
(2) str = str + " World";
사용자 입장에서는 당연히 str 변수에 계속해서 문자열이 연결된다고 생각할 것이다.
하지만 String은 불변한 객체이기 때문에,
str의 뒤에 " World"가 붙여진 것이 아닌 str가 새로운 String("hello World")을 생성하고 할당시킨 메모리 주소를 갖는다.

즉, (1)과 (2)의 메모리 주소가 다르다는 것!
따라서, 주기적으로 String을 변경하는 일이 발생하게 되면 힙 메모리(Heap)에 많은 쓰레기 메모리가 발생할 수 있다.
String answer = "";
for (int i=0; i<1000; i++) {
answer += i;
}
위의 같은 상황이면 1000번의 String 객체를 생성하고 메모리에 할당시켜야 하는 일이 발생할 것이다.

따라서 이를 해결하기 위해 등장한 것이 StringBuilder이다!
StringBuilder불변성을 가지는 String과 달리 StringBuilder는 가변성을 가진다.
즉, 새로운 String을 생성하지 않고 동일 객체내에서 문자열을 늘리고 줄인다는 말이다!
StringBuilder (1) sb = new StringBuilder("hello");
(2) sb.append(" World");
(1)과 (2) 모두 동일한 주소값 (동일한 객체)으로 작동되므로 불필요한 메모리 사용이 적어질 것이다.
StringBuilder는 내부적으로 char 배열 버퍼를 사용해,
기존 객체 내에서 append, delete와 같은 메서드를 통해 변경이 가능하다.

StringBuffer사실 가변적으로 문자열을 다룰 수 있는 객체는 하나 더 있다.
바로 StringBuffer이다.
StringBuilder와 동일한 API를 가지고 있지만 가장 큰 차이점은 동기화의 유무이다.
StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe)과
StringBuilder는 동기화를 지원하지 않지만 단일쓰레드에서의 성능은 뛰어나다.
참고로, String도 멀티쓰레드 환경에서 안전하다!
따라서 String, StringBuilder, StringBuffer를 상황에 따라 알맞게 사용하는 것이 중요하다.
StringStringBuilderStringBuffer