StringBuilder, StringBuffer 의 차이 (멀티 쓰레드)

이번 포스팅에서는 StringBuilder와 StringBuffer의

차이에 대해 알아보자.

 

StringBuilder와 StringBuffer의 차이는 대표적인

면접 단골 질문이기 때문에 면접 준비를 해봤던 사람이라면

누구나 한번쯤 들어봤을거라 생각한다.

 

StringBuffer, StringBuilder 클래스는 String 클래스와는 다르게

값이 변한다. 예를 들어 String aaa = ""; 선언을 하고

aaa 에 반복문을 이용해 aaa += 1 과 같이 값을 계속 넣어준다면

aaa 는 1,2,3,4,5. . . 값을 계속 해서 가지게 된다.

aaa 가 4에서 5가 됐을때도 4라는 값을 계속 가지고 있기 때문에

메모리 낭비가 된다. 반복문을 이용해 적은양의 데이터를 String에 저장한다면

큰 문제는 없지만 몇만 건 이상의 값을 String에 저장을 하게된다면

메모리낭비와 과부화가 걸릴 수 있다. 이때 사용되는것이

StringBuffer나 StringBuilder 이다. String클래스와는 다르게 GC가 되어

메모리 낭비가 되지 않고 과부화 걱정도 덜어지게 된다.

 

보통은 StringBuilder를 더 많이 사용할 것이다.

왜냐하면 StringBuffer보다 StringBuilder의 속도가 훨씬 빠르기 때문이다.

하지만 멀티 쓰레드를 사용하게 된다면 말이 달라진다.

StringBuffer는 멀티 쓰레드에서 안전하고

StringBuilder는 멀티쓰레드 에서는 불안전하고 단일 쓰레드에서만 안전하기 때문이다.

 

아래의 소스를 사용해 간단하게 비교해 볼 수 있다.

A를 6번 붙이고 5개를 삭제하기 때문에

addChar() 메소드가 한 번 돌때마다 A는 한 개가 생성된다.

그리고 for문을 10000번 타기 때문에

A는 10000개가 생성되어야 하고

2개의 쓰레드가 사용되기 때문에 A는 총 20000개가 생성되어야 한다.

멀티쓰레드에서 안전한 StringBuffer는 20000개가 정상적으로

생성되어 저장되지만 그렇지 않은 StringBuilder는 20000개가

정상적으로 생성되어 저장되지 못한다.

 

 

 

 

 

 

 

 

 

그렇기 때문에 StringBuilder와 StringBuffer를 사용할 때는

상황에 맞게 사용해야 한다.

 

 

댓글

Designed by JB FACTORY