자바 성능 튜닝 이야기를 보고 한 번 포스팅한 내용인데 다시 요약해보면서 리마인드!
String 클래스
- String 클래스는 문자열을 불변(immutable)하게 다룹니다.
- immutable 객체는 생성 후에 내부 상태를 변경할 수 없습니다. 문자열의 내용이 변경될 때마다 새로운 String 객체를 생성해야 한다는 것을 의미하며 이러한 객체는 변경할 수 없으므로 여러 스레드에서 동시에 접근하더라도 안전하게 사용할 수 있습니다.
- 한 번 생성된 String 객체는 변경될 수 없으며, 문자열의 변경이 필요할 경우 새로운 String 객체를 생성합니다.
- 이로 인해 String 클래스를 이용한 문자열 연산이 빈번하게 일어나는 경우, 성능이 저하될 수 있습니다. (GC 대상이 늘어남에 따라..메모리 사용을 최소화 하는 것은 당연한 일!)
StringBuffer 클래스
- StringBuffer 클래스는 문자열을 가변(mutable)하게 다룹니다.
- 문자열의 변경이 필요할 경우, 기존 StringBuffer 객체를 변경하여 새로운 문자열을 만들지 않고도 문자열을 수정할 수 있습니다.
- 여러 개의 문자열을 결합하거나, 문자열의 일부를 삭제하거나, 변경하는 등의 작업에 용이합니다.
- 멀티스레드 환경에서 안전하게 동작합니다.
- 클래스에 static으로 선언한 문자열을 변경하거나, singleton으로 선언된 클래스에 선언된 문자열일 경우!
StringBuilder 클래스
- StringBuilder 클래스는 StringBuffer 클래스와 마찬가지로 문자열을 가변하게 다룹니다.
- 문자열의 변경이 필요할 경우, 기존 StringBuilder 객체를 변경하여 새로운 문자열을 만들지 않고도 문자열을 수정할 수 있습니다.
- StringBuffer 클래스와의 차이점은 멀티스레드 환경에서 안전하지 않다는 점입니다. StringBuilder 클래스는 단일 스레드 환경에서 사용하기에 적합합니다.
- 예를 들면 메서드 내에서 사용하는 문자열인 경우!
요약하자면, String 클래스는 문자열을 변경할 수 없고, StringBuffer 클래스와 StringBuilder 클래스는 문자열을 가변하게 다룰 수 있지만, StringBuffer 클래스는 멀티스레드 환경에서 안전하며 StringBuilder 클래스는 단일 스레드 환경에서 사용하기에 적합합니다.