Strin
, StringBuffer
, StringBuilder
는 모두 문자열을 다루는 대표적인 클래스이다. 이들은 연산회수가 많아지거나 멀티쓰레드, Race condition등의 상황이 자주 발생한다면 각 클래스의 특징을 이애하고 적절한 클래스를 사용할 수 있어야 한다.
String은 불변(immutable)의 속성을 갖는다.
String str = "hello"; // String str = new String("hello");
str = str + " world"; // [ hello world ]
다음의 예제에서 str이 가르키는 곳에 저장된 "hello"에 "world" 문자열을 더해 "hello world"로 변경한것이 아니라, 기존 "hello"를 값이 들어간 영역을 가리키던 str이 "hello world"라는 값을 갖는 새로운 메모리 영역을 가리키도록 변경된다. 즉, String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성되는 것이다.
String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있다. 하지만 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 Heap에 많은 Garbage가 생성되어 메모리 부족 어플리케이션 성능에 치명적인 영향을 끼치게 된다.
String
과 달리 StringBuffer
, StringBuilder
는 append()
, delete()
등의 API를 이용해 동일 객체 내에서 문자열을 변경하는 것이 가능하다.
이 둘의 가장큰 차이점은 동기화의 유무이다. StringBuffer
는 동기화 키워드를 지원하여 멀티쓰레드 환경에서도 안전하다. 참고로 String도 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다.
반대로 StringBuilder
는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer
보다 뛰어나다.