불변인 String 클래스도 단점이 있다.
String str = "A" + "B" + "C" + "D";
String str = String("A") + String("B") + String("C") + String("D");
String str = new String("AB") + String("C") + String("D");
String str = new String("ABC") + String("D");
String str = new String("ABCD");
불변인 String 클래스의 단점은 문자를 더하거나 변경할 경우 새로운 객체를 만들어야 한다는 것이다.
문자를 더 자주 변경해야할 경우 더 많은 String 객체를 만들어야 하고, GC해야 한다.
결과적으로 컴퓨터가 더 많은 메모리와 CPU의 문제가 생길 수 있다.
이를 해결하기 위해서는 불변이 아닌 가변 String이 존재하면 된다.
가변은 내부의 값을 바로 변경할 수 있기 때문에 새로운 객체를 생성할 필요가 없다.
따라서, 메모리와 성능적으로 불변보다 효율적이다.
단, 가변을 사용할 경우 사이드 이펙트에 주의해야한다.
package test;
public class Builder {
static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("A");
sb.append("B");
sb.append("C");
sb.append("D");
sb.append("E");
System.out.println("sb = " + sb);
sb.insert(4, "java");
System.out.println("sb = " + sb);
sb.delete(4, 8);
System.out.println("sb = " + sb);
sb.reverse();
System.out.println("sb = " + sb);
String string = sb.toString();
System.out.println("string = " + string);
}
}
String은 불변이다.
따라서 문자열에 변화를 줄 때마다 새로운 String 객체가 생성되고 기존 객체는 버려진다.
반면 StringBuilder는 가변적이다.
하나의 StringBuilder로 추가, 삭제, 변경 할 수 있으며 그때마다 새로운 객체를 생성하지 않는다.
이로인해 메모리를 줄이고 성능향상에 이바지 할 수 있다.
단, 사이드 이펙트를 주의해야한다.