원문 : http://blog.naver.com/windziel?Redirect=Log&logNo=60048694876
자바에서 스트링을 연결하여 사용할때
String str = "aaa" + "bbb" + "ccc";
의 형태로 사용하면 안된다고 알고 있었다.
String은 불변(Immutable) 객체이기 때문에 '+'를 이용하여 문자열을 연결하게 되면 각 ""안의 String를 생성하고 이후 블록이 끝난후 GC의 대상이 되기 때문이다.
그래서 String을 연결할 때는 StringBuffer, StringBuilder 객체를 생성하고 append 메소드를 사용하여 연결한 후 StringBuffer, StringBuilder의 toString() 메소드로 스트링을 생성한 후 사용하여야 한다고 알고 있었다. 참고로 StringBuilder는 JDK 1.5에 추가된 것으로 동기화되지않은(not safe for use by multiple threads)이다. 그러다 어디선가 String을 '+'를 이용하여 연결하여도 컴파일러가 자동으로 StringBuilder를 생성해 연결하여 준다고 보았고, for 등의 루프에서 '+'를 이용하여 연결할 경우 '+'연산을 그대로 사용한다고 보았다.
그래서!!! 테스트 고고씽~~~
간단히 String을 이런저런 방법으로 생성하는 예제를 만들고 디컴파일을 하여 비교해 보았다.
<원본 Source>
str1은 이전에 생성해 놓은 a,b,c,d,e를 '+'로 연결하여 생성하고 str2는 만번의 루프를 돌면서 a를 '+'로 계속 연결하게 한다. sb는 append메소드 안에서 e,d,c,b,a를 '+'로 연결하여 생성한다.
그럼 디컴파일된 결과는??? (디컴파일에는 jad가 수고를...)
<디컴파일된 Source>
디컴파일된 소스를 보면 컴파일러가 알아서! 자동으로! StringBuilder 객체를 생성하여 다 append 해준다. JDK 1.5, 1.6 둘다 같은 결과이다. 여태 열심히 StringBuilder를 생성하고 .append....append 한 것은 다 삽질???!!!
참고로 jdk 1.4.2에서의 디컴파일 결과이다.
그냥 다 '+'를 이용하여 연결하고 있다. 결론은 1.5이상을 사용하면 그냥 String 객체에 '+'를 사용하여도 무방할 것 같다.