Java에서 문자열을 다루는 대표적인 클래스로 String
, StringBuffer
, StringBuilder
가 있다.
연산이 많지 않은 상황에서는 어느 클래스를 사용하더라도 큰 이슈가 발생하지 않는다.하지만 연산이 많아지거나 멀티쓰레드 환경에서는 각 클래스의 특성을 파악하여 상황에 맞는 클래스를 적절하게 사용해주어야 한다.
String은 immutable 즉, 불변의 속성을 가지고 있다. 코드와 그림으로 이 속성에 대해서 설명하겠다.
String str = "Hello";
str += " World"; // [Hello World]
다음과 같은 코드에서 String 참조변수 str이 가리키는 곳에 저장된 "Hello"에 " World"가 더해져 "Hello World"가 되었다고 쉽게 착각할 수 있다.
하지만 실제로는 String 참조변수 str은 "Hello"에서 "Hello World"라는 새로운 문자열을 가리키게 되는 것이다. String 클래스는 불변하기 때문에 문자열이 수정되는 시점에서 메모리에 새로운 String 인스턴스가 할당되는 것이다. 이렇듯 문자열을 합해주는 +연산자를 많이 사용하다보면 String 객체 수가 증가하기 때문에 프로그램 성능이 느려질 수 있다.
반면에 StringBuffer와 StringBuilder는 가변성을 갖는다. 즉, 동일한 객체 내에서 문자열 변경이 가능하다는 뜻이다.
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // [Hello World]
StringBuffer와 StringBuilder의 가장 큰 차이점은 동기화의 유무이다. StringBuffer는 멀티쓰레드 환경에서 동기화가 된다. 즉, thread-safe하다. 반면에, StringBuilder는 동기화를 지원하지 않는다. 하지만 싱글쓰레드에서 연산처리가 빠르다는 장점이 있다.
(참고)