Java에 다음과 같은 표현식이 있다고 가정해 보겠습니다:
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java의 기본 JDK 컴파일러는 어떻게 동작할까요? 그냥 5개의 연결을 만들까요, 아니면 스마트한 성능 트릭이 수행될까요?
다음과 같은 결과를 생성합니다:
String s = new StringBuilder("abc")
.append(methodReturningAString())
.append("ghi")
.append(anotherMethodReturningAString())
.append("omn")
.append("blablabla")
.toString();
정적 문자열(즉, 옴표
+ 블라블라
)을 미리 연결할 수 있을 만큼 똑똑합니다. 원한다면 StringBuilder
를 사용하는 것을 성능 트릭
이라고 부를 수 있습니다. 5개의 연결을 수행하여 4개의 불필요한 임시 문자열을 생성하는 것보다 성능 면에서 확실히 낫습니다. 또한 (제 생각에) Java 5에서 StringBuilder를 사용하면서 성능이 개선되었는데, 그 이전에는 StringBuffer가 사용되었습니다.
수정: 댓글에서 지적한 것처럼 정적 문자열은 연결의 시작 부분에 있는 경우에만 미리 연결됩니다. 그렇지 않으면 연산 순서가 깨집니다(이 경우에는 Sun이 정당화할 수 있다고 생각하지만). 따라서 이 점을 감안하면
String s = "abc" + "def" + foo() + "uvw" + "xyz";
이 주어지면 다음과 같이 컴파일됩니다:
String s = new StringBuilder("abcdef")
.append(foo())
.append("uvw")
.append("xyz")
.toString();