devlog

[JAVA] String, StringBuilder, StringBuffer의 차이 본문

Java

[JAVA] String, StringBuilder, StringBuffer의 차이

bellaah 2019. 8. 11. 16:20

String, StringBuffer, StringBuilder 차이점과 장단점

JavaString, StringBuffer, StringBuilder은 Java를 사용하면 종종 접하게 되는 문자열 클래스들이다.

이 세 가지는 모두 문자열을 저장하고, 관리하는 클래스인데 비슷한 이 클래스들을 여러 가지 만들어놓은 이유는 무엇일까?

 

1. String

String을 먼저 소개하자면 String은 immutable(불변) 객체이다. 그래서 String은 new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다. 변하지 않고 + 연산이나 concat을 이용해서 문자열에 변화를 주면 메모리의 내용이 변하는 것이 아니라 새로운 String객체를 new로 만들어서 새로운 메모리 공간에 변한 문자열이 생기고 그 객체를 참조하는 것이다.

이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야하는데 언제 제거될지 모른다.

또한 이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없는 단점이 있다. 

String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않다.

하지만, Immutable한 객체는 간단하게 사용 가능하고, 동기화에 대해 신경 쓰지 않아도 되기 때문에(Thread-safe),  내부 데이터를 자유롭게 공유 가능할 수 있다

반면에 StringBuffer, StringBuilder는 mutable(가변) 객체이다. 그것이 String과의 가장 큰 차이점이다.

 

2. StringBuffer와 StringBuilder

StringBuffer와 StringBuilder 클래스는mutable(가변)하기 때문에 String과 다르게 동작한다. 

문자열 연산에 있어서 new연산을 통해 클래스를 한번만 만들고 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다. 또한 StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

그럼 두 클래스의 차이점은 무엇일까?

  • 두 클래스의 차이점은 바로 동기화 여부이다. StringBuffer는 멀티스레드 환경에서도 동기화를 지원한다. 반면, StringBuilder는 동기화를 보장하지 않는다.
  • 그렇기 때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일 스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드 환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

 

연산을 많이하는 경우에는 String 클래스를 쓰는 대신, 스레드와 관련이 있으면 StringBuffer를 사용하고, 스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것이 더 좋다고 생각한다.

Comments