문자열 이어붙일 때 StringBuilder 쓰라는 얘기는 많이 들었어요. 근데 저는 "왜" 빠른지가 이해가 안 돼서요. += 하는 거나 StringBuilder append 하는 거나 결국 뒤에 글자 붙이는 건 똑같은 일 아닌가 싶은데요.
찾아보니까 자바에서 String은 불변(immutable)이라는 말이 나오던데, 이게 핵심인 것 같긴 한데 정확히 무슨 뜻인지 잘 모르겠습니다. 제가 이해한 걸로는, String은 한 번 만들면 내용을 못 바꾼다는 거죠? 그럼 이렇게 하면요.
String s = "hello";
s = s + " world";
이럴 때 s가 바뀐 것처럼 보이지만 사실은 "hello world"라는 새 String 객체가 통째로 만들어지고, s는 그 새 객체를 가리키게 되는 거고, 원래 "hello"는 버려지는 거 맞나요? 그럼 += 를 할 때마다 매번 기존 문자열 전체를 새 객체로 복사하면서 새로 만든다는 뜻인가요?
반면에 StringBuilder는 내부적으로 가변 버퍼(mutable) 같은 걸 들고 있어서, append 할 때 새 객체를 안 만들고 그 버퍼 뒤에 그냥 이어붙이기만 한다는 걸로 이해했는데 맞는지 봐주세요.
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(" world");
String result = sb.toString();
그리고 하나 더 궁금한 게, 그럼 아래처럼 딱 두세 개 상수 문자열 합치는 것도 무조건 StringBuilder 써야 하나요?
String msg = "이름: " + name + " / 나이: " + age;
이런 짧은 것도 String 불변 때문에 느린 건지, 아니면 이 정도는 컴파일러가 알아서 처리해주는지 궁금합니다. 불변이라는 개념이랑 엮어서 원리를 좀 풀어서 설명해주시면 정말 감사하겠습니다.