본문 바로가기

그 외

[Java] String 을 더하는 연산 (Concatenation) VS StringBuilder

Java에서 String을 다룰 때, StringBuilder를 많이 사용합니다.


Java의 String은 immutable, 즉 수정 불가능한 객체입니다. 더하기 연산이나, split 연산 등을 수행하면 String 객체를 직접 고치는 것이 아니고, 새로운 객체를 생성하여 반환하게 됩니다.

그래서 패스워드 등에는 String을 이용하지 않고, char 배열을 이용하여 패스워드를 입력받은 다음 즉시 삭제해 버리라는 조언도 있습니다.

http://stanleykou.tistory.com/entry/JAVA-패스워드에-String이-아닌-char를-이용하는-이유


그렇기 때문에 속도가 느리고, StringBuffer나 StringBuilder를 이용해서 스트링을 처리하는 작업을 많이 합니다. StringBuffer는 synchronized가 되어 있어 Thread-safe, 즉 멀티쓰레드 환경에서 써도 무방합니다. StringBuilder는 그런 처리가 되어 있지 않아 멀티쓰레드 환경에 이용하기에는 적합하지 않지만, 속도가 좀 더 빠릅니다.


스트링을 더하는 연산을 할 때, 스트링을 직접 더하는 대신 StringBuffer나 StringBuilder를 이용하는 것이 좋겠죠?


아닙니다. 똑같습니다.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1

a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.

자바 컴파일러는 스트링을 더하는 메소드를 발견하면 StringBuffer나 유사한 기술로 대체하여, 직접 스트링을 더하는 작업을 하는 대신 더 빠르게 처리합니다.


→ StringBuilder나 StringBuffer가 더 빠른 것은 맞지만, 어차피 컴파일러가 최적화를 해주기 때문에 스트링 더하기 연산을 해도 속도에는 영향을 주지 않습니다.