학부시절에는 문자열관련된 클래스를 사용할 경우에는 항상 String클래스를 사용하였다. 가장 기본적이고 보통 자바를 처음 배울 때 배우기 때문에
하지만, 일을 하면서 느낀 것은 효율성의 문제를 우선시 해야한다는 것을 깨닫게 됐다.
-> 그렇기 때문에, 연산횟수가 많아지거나 멀티쓰레드 등의 상황이 자주 발생한다면, 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해줘야 한다.
String의 특징 : String은 불변(immutable)의 속성을 가짐
String str = "안녕"; //String str = new String("안녕");
str = str + "하세요"; // [안녕하세요]
-> 보통 '안녕'이라는 String 클래스의 참조변수 str이 가리키는 곳에 저장된 '안녕'에 '하세요'라는 문자열을 더해 '안녕하세요'로 변경한 것으로 오해할 수 있다.
하지만 기존 '안녕'값이 들어가있던 String 클래스의 참조변수 str이 '안녕하세요'라는 값을 가지고 있는 새로운 메모리 영역을 참조하게됨
그렇게되면 처음 선언했던 '안녕'으로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 이후에 사라지게 됨

위의 그림과 같이 String은 불변성을 갖기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용하면 좋은 성능을 기대할 수 있음
하지만 문자열의 추가, 수정, 삭제 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됨
StringBuffer와 StringBuilder는 가변성을 갖기 때문에 .append() .delete()등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
따라서 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer / StringBuilder를 사용해야함
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");

StringBuffer 와 StringBuilder의 차이?
그렇기 때문에 각 상황에 맞게 클래스를 선택하여 적용해야하는 것이 필요