Java에서 문자열을 다루는 대표적인 클래스로는 String, StringBuffer, StringBuilder가 있다.
개발을 하다보면 생각없이 String을 많이 쓰게 되는데 짧은 문자열이 아닌 복잡한 문자열을 써야 할때나 멀티스레드 환경에서 이슈들이 발생하므로 각 클래스의 특징을 이해 하고 사용해야 한다.
String
java.lang 패키지에 포함된 클래스로서 String 클래스는 문자열을 나타낸다. 또한 불변(Immutable) 특징을 가지고 있다.
concat 메서드 또는 + 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 붙여도 기존 문자열에 생성되는 것이 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조 하도록한다.
즉 String에 문자열을 붙일때마다 새로운 객체를 생성하여 문자열을 만든다. String 객체는 이러한 이유로 문자열 연산이 많은 경우 성능에 문제가 있다.
StringBuffer / StringBuilder
StringBuffer와 StringBuilder는 String과 다르게 문자열 연산등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
두 클래스의 차이는 동기화의 유무로써 스레드 환경에서 차이가 있다.
StringBuffer
- 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전하지 모를 경우 사용하면 좋다.
- 싱글톤으로 선언된 클래스에 선언된 문자열일 경우에는 이 클래스를 사용해야만한다.
StringBuilder
- 스레드에 안전한지의 여부와 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.
- 만약 메서드 내에 변수를 선언했다면, 해당 변수는 그 메서드 내에서만 살아 있으므로 StringBuilder를 사용하면 된다.