문자열을 추가하는 연산에서 StringBuilder가 String보다 성능이 좋다. 왜 그런지 알아보자.
String은 immutable하기 때문이다. 불변하기 때문이다.
String a = "a";
a = "a" + "b";
이렇게 a 를 + 연산을 이용하여 문자열을 합치면 a 인스턴스를 "a" -> "ab"로 변경하는 것이 아니라 "ab"라는 새로운 문자열을 string pool에 새로 생성한 뒤 참조하게 해준다. 그 뒤 이전 "a" 문자열은 가비키 컬렉션 대상이 된다. 따라서 String 클래스를 사용하면 더욱 많은 시간과 메모리가 사용된다.
더보기
StringBuilder, StringBuffer가 문자열 연산에서 더 좋은 이유?
String 클래스는 연산이 수행될 때마다 두 문자열을 모두 읽어 들이고 새로운 메모리에 보가하기 때문에 느리다. StringBuffer, StringBuilder도 마찬가지로 문자열을 복사하긴 하지만 가변 크기 배열을 이용해서 필요한 경우에만 문자열을 복사한다.
StringBuffer는 동기화를 지원하여 Thread-Safe하다. StringBuilder는 Thread-safe하지 않다.
String class를 사용하는 이유?
String class는 immutable하기 때문에 여러 쓰레드가 사용하는 환경에서는 유용하다. 따라서 멀티 스레드 환경에서 수정없이 읽기로만 많이 사용 되는 문자열은 String 인스턴스로 생성하는 것이 적절하다.
하지만 코딩테스트에서는 단일 스레드 환경에서의 테스트이기 때문에 StringBuilder를 사용하는것이 유리하다.
많이 사용하는 StringBuidler 함수
- StringBuilder append(String str) : 문자열 합치기 연산
- String toString() : StringBuilder -> String
- StringBuilder reverse() : 문자열 역순
참조