Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 StringBuilder와 StringBuffer 완벽 비교: 언제 무엇을 사용해야 할까?

자바에서 문자열을 조작할 때 StringBuilderStringBuffer 중 어떤 것을 선택해야 할지 고민되는 경우가 많습니다. 두 클래스는 기능적으로 거의 동일하지만, 결정적인 차이가 하나 있습니다. 바로 스레드 안전성(Thread Safety)입니다.

StringBuffer와 StringBuilder의 핵심 차이

StringBuffer 객체는 여러 스레드가 동시에 같은 객체에 접근할 수 있는 멀티스레드 환경에서도 안전하게 사용할 수 있도록 설계되었습니다. 내부 메서드들이 synchronized로 선언되어 있어 한 번에 하나의 스레드만 해당 메서드를 실행할 수 있기 때문입니다.

반면 StringBuilder는 이러한 스레드 안전한 StringBuffer 클래스를 대체하기 위해 도입된 클래스로, synchronized 처리가 없기 때문에 훨씬 빠르게 작동합니다. 따라서 단일 스레드 환경에서 많은 문자열 연산을 수행하는 경우, StringBuilder를 사용하면 상당한 성능 향상을 얻을 수 있습니다.

정리하면 다음과 같습니다.

  • 멀티스레드 환경: StringBuffer 사용 (스레드 안전성 보장)
  • 단일 스레드 환경: StringBuilder 사용 (더 나은 성능)

성능 비교 예제 코드

아래 예제는 두 클래스의 실제 실행 속도를 측정하는 코드입니다. 각각 1000개의 문자를 반복해서 추가(append)하고, 걸리는 시간을 나노초 단위로 출력합니다.

public class CompareBuilderwithBufferTest {
    public static void main(String []args) {
        stringBufferTest();
        stringBuilderTest();
    }
    public static void stringBufferTest() {
        long startTime = System.nanoTime();
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < 1000; i++) {
            sb.append((char) 'a');
        }
        System.out.println("StringBuffer test: " + (System.nanoTime() - startTime));
    }
    public static void stringBuilderTest() {
        long startTime = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i=0; i < 1000; i++) {
            sb.append((char) 'a');
        }
        System.out.println("StringBuilder test: " + (System.nanoTime() - startTime));
    }
}

실행 결과

StringBuffer test: 192595
StringBuilder test: 85733

실행 결과를 보면 StringBuilder가 약 2배 이상 빠른 성능을 보여줍니다. 이는 synchronized 락(lock) 처리 오버헤드가 없기 때문입니다. 물론 실제 소요 시간은 하드웨어 사양이나 JVM 상태에 따라 달라질 수 있지만, StringBuilder가 더 빠르다는 결과 자체는 일관되게 나타납니다.

결론

대부분의 일반적인 애플리케이션 코드는 단일 스레드에서 실행되므로, 특별한 이유가 없다면 StringBuilder를 사용하는 것이 권장됩니다. 멀티스레드 환경에서 하나의 문자열 버퍼를 여러 스레드가 공유해야 하는 특수한 경우에만 StringBuffer를 선택하면 됩니다.