자바에서는 대표적으로 문자열을 다루는 자료형 클래스로 String
, StringBuffer
, StringBuilder
이 세 가지를 사용한다.
이 세 가지는 사용 목적에 따라 쓰임새가 달라지게 되는데 이에 대해 알아보자
문자열을 다루는 가장 기본적인 클래스
StringBuffer
와 동일한 기능 제공
StringBuffer
와 동일StringBuffer
보다 빠르다.String
StringBuffer
, StringBuilder
public class PerformanceTest {
public static void main(String[] args) {
int iterations = 100_000;
// String
long start = System.currentTimeMillis();
String str = "";
for (int i = 0; i < iterations; i++) {
str += i;
}
long end = System.currentTimeMillis();
System.out.println("String Time: " + (end - start) + " ms");
// StringBuffer
start = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < iterations; i++) {
stringBuffer.append(i);
}
end = System.currentTimeMillis();
System.out.println("StringBuffer Time: " + (end - start) + " ms");
// StringBuilder
start = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < iterations; i++) {
stringBuilder.append(i);
}
end = System.currentTimeMillis();
System.out.println("StringBuilder Time: " + (end - start) + " ms");
}
}
> Output
String Time: 1201 ms
StringBuffer Time: 2 ms
StringBuilder Time: 2 ms
위 성능 비교를 한 결과를 보면
String
이 확연하게 시간이 오래 걸리는 것을 볼 수 있다.
그리고 StringBuffer
, StringBuilder
는 거의 비슷하다.
특징 | String | StringBuffer | StringBuilder |
---|---|---|---|
불변성 (Immutable) | 불변성 | 가변성 | 가변성 |
동기화 지원 여부 | 비동기, 스레드 안전하지 않음 | 동기, 스레드 안전 | 비동기, 스레드 안전하지 않음 |
성능 | 느림 | 중간 | 빠름 |
사용 환경 | 문자열이 변경되지 않는 상황 | 멀티스레드 환경에서 문자열 변경이 필요한 경우 | 단일 스레드 환경에서 문자열 변경이 많은 경우 |
적합한 상황 | 상수 문자열, 로그 메시지 등 | 스레드 간 문자열 데이터 공유 | 반복적인 문자열 조작, 성능이 중요한 경우 |
보통 아래 이유 때문에 StringBuilder
를 더 많이 사용한다!