StringBuffer와 StringBuilder의 차이점

이현지·2021년 3월 14일
0

StringBuilder 와 StringBuffer 의 차이점

  • 우선 String, StringBuilder, StringBuffer 모두 문자열을 다루는 클래스이다.
    위 세개는 문자열을 붙이는 연산시 성능의 차이가 발생한다.
    String 클래스의 경우 문자열을 붙이는 연산시 + 를 사용한다.
    하지만 String의 + 연산의 경우 처음 객체가 생성되며, 메모리가 할당된 후
    연산의 결과 메모리가 또 할당된다.
    예를 들어
    String a = "여기는" + "현지의 개발블로그";

위와 같이 선언하면, 여기는현지의 개발블로그 두 문자열의 메모리가 각각 할당되고,
두 문자열을 붙인 여기는 현지의 개발블로그 문자열 또한 메모리가 따로 할당된다.
이는 String 클래스의 immutable(불변)의 특성때문이다.
한번 생성된 객체의 메모리가 불변이기 때문에, 메모리가 모두 각각 할당되는 것이다.
그리하여 StringBuilder와 StringBuffer에 비해 성능이 떨어진다.

  • StringBuilder와 StringBuffer 는 mutable(가변)의 성질을 가지고 있기 때문에, 처음 할당된 메모리가 변할 수 있다.
    그리하여 String에 비해 성능이 좋다.
    그러면 StringBuilder와 StringBuffer의 차이를 알아보자.
    둘의 차이는 스레드이다. 싱글스레드에 적합한지, 멀티스레드에 적합한지의 차이가 있다.

    싱글스레드와 멀티스레드란?
    예를 들어 두개의 작업을 한다고 가정할 때, 싱글스레드는 하나의 스레드로
    두 개의 작업을 처리한다. 하나의 작업을 마치고 다른 작업을 시작한다.
    멀티스레드는 두개의 스레드로 두 개의 작업을 번갈아가며 처리한다.
    이 때, 멀티스레드는 두 개의 작업을 번갈아가며 처리하므로 작업을 전환하는 시간이 필요하다.
    그래서 싱글스레드와 멀티스레드는 속도가 비슷하거나, 멀티스레드가 오히려 더 느리다.

  • StringBuffer는 동기화를 지원하여, 멀티스레드 환경에서 사용하기 용이하다.
    StringBuilder는 동기화를 지원하지 않아, 싱글스레드 환경에서 사용하기 용이하다.

  • JDK 1.5 버전 이후 부터는 String 객체를 사용하더라도, StringBuilder로 컴파일 된다고 한다.
    하지만 String의 immutable 특징은 가지고 있으므로, 여전히 StirngBuffer나 StrinbBuilder를 쓰는 것이 좋다.

  • StringBuffer와 StringBuilder 객체를 생성하여 문자열을 붙이는 경우 append 메소드를 사용한다.
    예를 들어

    StringBuilder sb = new StringBuilder("여기는");
    String s = "개발블로그";
    sb.append(s);

위와 같이 객체를 선언하고 append 메소드를 활용하여 문자열을 붙일 수 있다.

  • 결론적으로 문자열 붙이는 연산이 적다면, String 클래스를 사용해도 무방하다.
    연산이 많고, 싱글 스레드라면 StringBuilder
    연산이 많고, 멀티 스레드라면 StringBuffer를 사용하는 것이 성능에 좋다.

참고자료

profile
Backend Developer👩‍💻

0개의 댓글