StringBuffer vs StringBuilder 차이에 대해.

Choizz·2023년 3월 23일
0

Java

목록 보기
5/11

이번 포스팅은 StringBuffer를 알아보고 StringBuilder와의 차이에 대해 포스팅하려고 합니다.


StringBuffer와 StringBuilder의 차이

우선, StringBuffer는 StringBuilder와 마찬가지로 불변 객체가 아닙니다.
따라서, 문자열을 수정할 경우 String처럼 새로운 객체가 생성되지 않습니다.

차이점

  • 두 클래스의 차이점은 thread-safe한가 그렇지 않은가로 나눌 수 있습니다.

  • StringBuffer의 경우 thread-safe합니다. 메서드에 synchronized가 붙어 있는 것을 확인할 수 있습니다. 즉, 멀티 스레드인 상황에서 안전합니다.

  • 반면, StringBuilder의 경우는 thread-safe하지 않습니다. 멀티 스레드인 상황에서 안전하지 않지만, StringBuffer보다 상대적으로 빠릅니다.

thread-safe 차이

  • StringBuilder의 경우 thread-safe한가에 대해 알아보면,
    • 아래 코드에서 멀티 스레드 환경을 만든 후, 코드를 실행햐여 sb 변수의 길이를 잽니다.
    • 1000번 동안 1을 계속 추가하면, 결국, sb의 길이는 스레드 2개가 실행하고 있으므로 2000개가 나와야 합니다.
class Task implements Runnable {

    StringBuilder sb = new StringBuilder();

    public void run() {
        for (int i = 0; i < 1000; i++) {
            sb.append(1);
        }
    }
}

Task task = new Task();
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);

thread1.start();
thread2.start();

thread1.join();
thread2.join();

System.out.println(task.sb.length()); // 결과 : 1419

하지만 결과는 1419개가 나옵니다. 즉, 스레드 간 간섭이 발생했다고 볼 수 있습니다.

  • StringBuffer의 경우를 보면,
    • Task 클래스의 sb 변수를 StringBuffer로 바꾸었습니다.
class Task implements Runnable {

    StringBuffer sb = new StringBuffer();

    public void run() {
        for (int i = 0; i < 1000; i++) {
            sb.append(1);
        }
    }
}

Task task = new Task();
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);

thread1.start();
thread2.start();

thread1.join();
thread2.join();

System.out.println(task.sb.length()); // 결과 : 2000
  • StringBuffer를 사용했을 때는, thread-safe하여 예상했던 결과가 나옵니다.

속도 차이에 대하여

  • 멀티 스레드 상황
    • StringBuffer는 thread-safe하므로 멀티스레드 상황에서 StringBuilder보다 속도가 느릴 것 입니다. 왜냐하면, synchronized가 붙어있기 때문에 스레드가 메서드 수행이 끝날때 까지 대기하기 때문이죠.
    • 그러나, 안정성을 위해 StringBuffer를 사용하는 것이 좋을 것 같습니다.
  • 싱글 스레드 상황
    • 싱글 스레드 상황에서는 StringBuilder를 고려할 수 있으나, StringBuffer와의 차이는 그렇게 많이 나지는 않을 것입니다.
    • 어차피 스레드가 하나이기 때문입니다.

Reference

profile
집중

0개의 댓글