String 객체는 immutable(불변) 객체이다.
String 객체를 선언 후 + 연산자로 문자열을 추가하면, 새로운 String 객체를 힙영역에 할당하고
기존에 선언된 String객체는 GC에 의해 제거된다.
하지만 자바 1.5 이상부터는 String 인스턴스에 문자열을 + 할 경우 컴파일러가 StringBuilder로 변환해준다.
StringBuilder 또한 새로 생성되는 인스턴스이기 때문에 성능을 고려해야 한다.
//컴파일 전 소스파일
String str1 = "0" + "1" + "2";
//컴파일 전 소스파일
String str2 = "";
str2 += 0;
str2 += 1;
str2 += 2;
//컴파일 이 후, 디컴파일 한 소스파일
String str2 = "";
str2 = (new StringBuilder()).append(s1).append("0").toString();
str2 = (new StringBuilder()).append(s1).append("1").toString();
str2 = (new StringBuilder()).append(s1).append("2").toString();
//컴파일 전 소스파일
String str3 = "";
for (int i = 0; i < 3; i++) {
str3 += i;
}
//컴파일 이 후, 디컴파일 한 소스파일
String str3 = "";
for(int i = 0; i < 3; i++) {
str3 = (new StringBuilder()).append(s2).append(i).toString();
}
두 클래스의 차이점은 스레드에서 safe한지 안한지에 따라 나뉜다.
StringBuffer는 스레드 safe하게 설계되었고
StringBuilder는 스레드 safe하지 않다. 두 클래스 모두 힙 메모리에 생성된다.
따라서 성능은 StringBuilder가 제일 우수하다.
싱글 스레드 환경이라면 StringBuilder 사용을 지향하자.
간단하다. 메서드 전체에 synchronized 키워드를 붙여 Lock을 걸었다.
Lock을 건만큼 당연히 성능에 이슈가 있을 수 있으니 고려해서 사용해야 한다.