본문 바로가기
programming/java

[java] StringBuilder, StringBuffer의 차이

by 힐무새 2017. 6. 1.

String객체에 문자열을 추가하고자 할 때는 3가지 방법이 있다.

  1. String 객체간의 단순한 append 연산
  2. StringBuilder 클래스 사용
  3. StringBuffer 클래스 사용


String append

이 경우는 단순히 + 연산자 오버라이딩된 메서드를 통해 append가 수행된다. 이러한 연산은 string 객체 2개를 메모리에 할당하게 되기 때문에 심각한 메모리 문제로 번질 수 있다고 하지만, jdk 1.5 버전 이후 부터는 내부적으로 StringBuilder를 통해 append된다하여 성능 면에서는 크게 상관이 없다고는 한다.


다만 String은 heap 공간에 생성되었을 시 한번 생성된 객체의 내용을 수정할 수 없는 immutable class이기 때문에 메모리 이슈를 해결하지는 못하는 것 같다. 단지 StringBuilder 클래스를 사용하여 속도 문제만 해결하는 듯 하다.


StringBuilder, StringBuffer


StringBuilder와 StringBuffer의 차이점은 동기화 지원 여부이다. StringBuilder의 append는 내부적으로 synchronize 되어있지 않아 다중 스레드 환경에서 데이터 불변성이 보장받지 못한다. 그에 반해 StringBuffer는 문자열의 조작을 수행하는 메서드가 모두 synchronize를 통해 동기화되어 다중 스레드 환경에서도 정상적으로 동작될 수 있다. 하지만 StringBuffer는 동기화를 따로 수행하는 만큼 속도는 StringBuilder에 비해 느리다.


따라서 단일 스레드하 연산량이 많은 경우 속도는

StringBuilder >StringBuffer >> String


정도로 보면 되겠다.


결론은 간단한 String의 append정도는 그냥 써도 되겠지만, 단일 스레드에서는 StringBuilder 자주 쓰자.



'programming > java' 카테고리의 다른 글

JIT(just-in-time) 컴파일  (0) 2017.12.01
[java] 정규 표현식  (0) 2017.06.01
[java]thread  (0) 2017.06.01
[java] Collection  (2) 2017.05.15
싱글톤(Singleton)  (6) 2017.05.11