✨ 1일 1개발지식

StringBuilder vs StringBuffer 차이가 뭘까?

twoweekhee 2025. 10. 23. 15:20

 

안녕하세요!! 1일 1개발지식을 올려보려고 합니다!

나눌 수록 좋잖아요 ㅎㅎㅎ 아시는 내용도 있으실 수도 있고 너무 쉬운 내용도 있을 수 있지만
복습겸 생각해보는 시간을 같이 가져봐요!

구독하면 편하게 보실 수 있습니다!

 

 

StringBuilder vs StringBuffer의 차이 아시나요?

1. StringBuilder 와 StringBuffer 의 차이점은?

2. 1의 대한 답변을 생각하여 아래의 코드 결과는 어떻게 될 지 알려주세요.
   그리고 StringBuilder 를 StringBuffer 로 바꿨을 때 결과 값은??

public class ThreadTest {
    static StringBuilder builder = new StringBuilder();

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) builder.append("A");
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) builder.append("B");
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println(builder.length());
    }
}

 

 

🔍 StringBuilder와 StringBuffer의 차이점

둘 다 가변적인 문자열을 다루는 클래스지만 차이가 있습니다.

🏃 StringBuilder

  • 속도: 빠름 ⚡
  • 스레드 안전성: ❌ (Thread-Safe 하지 않음)
  • 특징: 단일 스레드 환경에서 최고의 성능

🛡️ StringBuffer

  • 속도: 상대적으로 느림 🐢
  • 스레드 안전성: ✅ (Thread-Safe!)
  • 특징: 내부 메서드에 synchronized 키워드가 붙어있어요

결과 분석하기

StringBuilder를 사용했을 때

예시 실행 결과: 1823 (또는 1956, 1789... 매번 다름!)

2000이 운이 좋게 나올 수도 있지만 보통 2000이 안나올거에요! 😱

실행할 때마다 결과가 달라지게 됩니다.

 

두 스레드가 동시에 StringBuilder에 접근하면서 "경쟁 상태(Race Condition)" 가 발생한 거예요.

예를 들어:

  1. Thread 1: "현재 위치 100번째야, 여기에 A 추가할게!"
  2. Thread 2: "어? 나도 100번째 보고 있는데, 여기에 B 추가!"
  3. 결과: 둘 다 100번째에 추가 → 하나는 덮어써짐

StringBuffer로 바꿨을 때

static StringBuffer buffer = new StringBuffer();  // StringBuilder → StringBuffer
실행 결과는 항상 2000이 나옵니다.
 

StringBuffer는 synchronized 키워드 덕분에 한 번에 하나의 스레드만 접근할 수 있습니다.

 

언제 뭘 써야 할까?

StringBuilder를 쓰면 좋은 경우

  • 단일 스레드 환경 
  • 메서드 내부에서만 사용하는 지역 변수
  • 성능이 중요한 대용량 문자열 처리

StringBuffer를 쓰면 좋은 경우

  • 멀티스레드 환경 
  • 여러 스레드가 공유하는 전역 변수
  • 안정성이 최우선인 경우