StringBuilder vs StringBuffer

1870 단어 JavaJava

StringBuffer를 사용하는 이유

String은 Immutable하다.

Java의 String은 특별하다. Java에서 String은 Constant Pool을 사용하고 있기 때문에, += 연산을 활용하여 String을 조작 시, 기존 String이 변경되는 것이 아니라 새로운 String이 Constant Pool에 생성된다. 때문에, +=을 활용한 조작을 반복적으로 하면 메모리를 비효율적으로 사용하게 된다.

예를 들어,

String greeting="Hello"
for(int i=0; i<10; i++){
	greeting+="a";
}

이런 식의 코드가 있다고 생각해보자.

이런 식으로 기존의 Hello라는 문자열이 변경되는 것이 아니라 새로운 문자열이 생성되며 메모리를 차지하게 된다. Constant Pool 내에서 사용되지 않는 문자열들은 Garbace Collector의 제거 대상이 된다.

이와 같은 문제의 해결방안이 바로 Buffer를 이용하는 것이다.

mutable한 StringBuilder, StringBuffer

StringBuffer sb=new StringBuffer();
sb.append("Hello");
for(int i=0; i<10; i++){
   sb.append("a");
}
System.out.println(sb);

StringBuffer와 StringBuilder의 차이

동기화의 지원유무이다.
StringBuffer : 동기화를 지원하여 멀티쓰레드 환경에서도 안전하게 동작
StringBuilder : 동기화를 지원하지 않는 대신, 단일 쓰레드 환경에서 StringBuffer보다 성능이 우수함.

동기화를 지원한다는 것은

동기화를 지원한다는 뜻은, 하나의 쓰레드가 StringBuffer 클래스 내의 append 메소드를 사용하려고 했을 때, 다른 쓰레드는 block 처리되어 그 쓰레드가 메소드를 탈출할 때까지 기다리고 있는 것을 말한다. critical section에서 한개의 쓰레드만 해당 부분을 사용하는 것을 의미.

참고

StringBuffer, StringBuilder가 String보다 좋은 이유와 원리
StringBuffer와 StringBuilder는 무슨 차이가 있는가

좋은 웹페이지 즐겨찾기