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클래스를 만들어아 한다. → GC를 더 많이 해야한다. → 컴퓨터 메모리 사용량이 많아진다!
이 문제를 해결하는 방법은 단순하다. 바로 불변이 아닌 가변 String 이 존재하면 된다!
가변은 내부의 값을 바로 변경하면 되므로 새로운 String 객체를 생성할 필요 없다! 이런 상황을 해결하기 위해 자바는 StringBuilder를 제공한다.
String 클래스는 아래와 같이 문자 배열이 불변 객체인 반면에,
public final class String {
//문자열 보관
	private final char[] value;// 자바 9 이전
	private final byte[] value;// 자바 9 이후
	//여러 메서드
	public String concat(String str) {...}
	public int length() {...}
...
}
StringBuilder 클래스는 아래와 같이 문자 배열이 가변 객체인 멤버변수로 저장되어있다!
public final class StringBuilder {
	char[] value;// 자바 9 이전
	byte[] value;// 자바 9 이후
	//여러 메서드
	public StringBuilder append(String str) {...}
	public int length() {...}
...
}
아래와 같이 String 클래스를 새로 생성할 필요없이 유동적으로 사용 가능하다!
```java
public class StringBuilderMain1_1 {
	public static void main(String[] args) {
	
		StringBuilder sb = new StringBuilder();
		sb.append("A");
		sb.append("B");
		sb.append("C");
		sb.append("D");
		
		System.out.println("sb = " + sb);
		sb.insert(4, "Java");
		
		System.out.println("insert = " + sb);
		sb.delete(4, 8);
		
		System.out.println("delete = " + sb);
		sb.reverse();
		
		System.out.println("reverse = " + sb);
		//StringBuilder -> String
		String string = sb.toString();
		System.out.println("string = " + string);
	}
}
// 실행 결과
sb = ABCD
insert = ABCDJava
delete = ABCD
reverse = DCBA
string = DCBA
하지만~~~!!! 자바 컴파일러는 다음과 같이 문자열 리터럴을 더하는 부분을 자동으로 합쳐준다.