자바에서 String은 imutable 객체라고 한다. 변할 수 없는 객체라는 의미이다. 그래서 다른 두 문자열을 합치는 데 여러 방법이 있다.
String 클래스에 있는 concat() 메소드는 문자열을 합쳐준다. 하지만 String은 불면하기 때문에 concat을 할때마다 새로운 문자열을 생성하기 때문에 메모리 낭비가 있고 사용하지 않는 메모리를 위해 gc가 호출되는 등 비효율적이다.
문자열을 변경하는 메소드를 제공한다. String 클래스와는 다르게 StringBuilder를 사용하면 문자열을 계속해서 수정, 삽입, 삭제가 가능하다.
StringBuilder와 기능상 거의 동일하다. 하지만 StringBuffer는 동기화를 보장하기 때문에 multithread 환경에서 사용한다.
과거 + 연산자는 concat() 메소드와 동일하게 매번 새로운 String 객체를 생성했지만 java 1.5부터 컴파일러에서 StringBuilder 객체로 변환해서 처리하기 때문에 StringBuilder와 동일하게 동작한다.
하지만 반복문에서 + 연산은 효율이 떨어지는 것을 확인할 수 있는데
String s = "";
for(int i = 0; i < 10; i++)
s += "*"
과 같은 경우 아래와 같이 컴파일되기 때문에
String s = "';
for(int i = 0; i < 10; i++) {
new StringBuilder(s).append("*");
s = sb.toString();
}
매번 새로운 StringBuilder 객체를 생성해 효율이 떨어진다. 그렇기때문에 반복되는 동작에서는 + 연산보다 StringBuilder를 사용하는 것이 좋다.
