1. String
String과 다른 클래스 (StringBuffer, StringBuilder)의 차이점은 String은 immutable(불변), StringBuffer는 mutable(변함)에 있다.
String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있다.
문자열, 숫자, char 등은 concat할 때 StringBuffer, StringBuilder를 사용할 수 있다. 단, 복잡한 경우에 의미가 있고, 단순한 경우에는 +연산자를 사용해 직접 합치면 된다.
String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다.
즉, String 클래스 객체는 Heap 메모리 영역(Garbage Collection이 동작하는 영역)에 생성된다. 한 번 생성된 객체의 내부 내용을 변화시킬 수 없고 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수한다.
2. StringBuffer와 StringBuilder
StringBuffer와 StringBuilder는 String과 다르게 동작한다.
문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
두 클래스의 차이점은
바로 동기화 여부이다.
StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하며, 멀티스레드 환경에서도 동기화를 지원한다.
반면, StringBuilder는 동기화를 보장하지 않는다.
그렇기 때문에, 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,
단일 스레드 환경이라면 StringBuilder를 사용하는 것이 좋다.