본문 바로가기
공부

String, StringBuffer, StringBuilder

by Moonsc 2020. 6. 27.
728x90

자바에서 문자열을 다루는 대표적인 클래스 String, StringBuffer, StringBuilder에 대해 알아보자.

String vs StringBuffer, StringBuilder

3개의 클래스 중 String은 불변하는 속성을 가지고 있다. 즉 immutable class이고, StringBuffer와 StringBuilder는 가변 하는 클래스 mutable class이다.

우리는 간혹 하나의 변수에 다른 String 값을 넣고는 한다. 이때 JVM은 기존 String 변수의 값을 GC에 의해 제거하고, 새로운 값을 새로운 메모리 영역에 만들고 그것을 가리키게 된다.

String str = "A";

// A는 GC에 의해 제거된다.
// str에 B가 들어있는 메모리 영역을 가르키도록 변경!
str = "B";

 

위와 같이 String은 불변하는 속성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주면 좋은 성능을 기대할 수 있다. 그러나 문자열이 빈번하게 수정되는 경우 String을 사용하게 되면 힙 메모리에 많은 임시 가비지 값이 생성되어 성능에 부정적인 영향을 주게 된다.

이를 해결하기 위해서는 가변하는 속성을 가지는 StringBuffer와 StringBuilder 클래스를 사용하면 좋다.

StringBuffer와 StringBuilder는 .append(), delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 수정하는 것이 가능하다.

StringBuffer buffer = new StringBuffer("Hi");
buffer.append("Moon");


StringBuilder builder = new StringBuilder("Hi");
builder.delete(0,2);

 

StringBuffer와 StringBuilder의 차이

가장 큰 차이는 동기화의 유무로 StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 (multi-thread) 환경에서 thread-safe 하다는 장점을 가지고 있다. 이와 반대로 String은 불변성을 가지고 있기에 마찬가지로 멀티쓰레드 환경에 안전하다.

StringBuilder는 동기화를 지원하진 않지만 그만큼 단일쓰레드 환경에서의 성능은 StringBuffer보다 뛰어나다.

이러한 속성을 알고 프로그래밍을 할때 적재적소에 문자열 클래스를 활용하면 성능에 좋은 영향을 가져다줄 수 있겠다.

 

참고

JDK 1.5이상부터 String에서 += 연산으로 작성하더라도 StringBuilder로 컴파일하게 만들어 놨다지만 여전히 String클래스의 객체 생성하는 부분을 동일하므로 StringBuffer, StringBuilder 사용이 필요하다.

String클래스가 컴파일러 분석 단계에서 최적화될 가능성이 있기 때문에 간혹 성능이 잘 나오는 경우도 있음. 문자열 연산이 많지 않은 경우는 그냥 사용해도 무방하다.

 

 

 

댓글