plzy의 개발 블로그

String , StringBuilder, StringBuffer 의 차이점은 무엇일까? 본문

알고리즘/알고리즘

String , StringBuilder, StringBuffer 의 차이점은 무엇일까?

plzyhappy 2022. 3. 31. 01:18

나는 코딩테스트 문제를 푸는중 어떤 문제는 StringBuilder, StringBuffer 각각 쓰이는것을 확인 할 수 있었다.

기존 String과 다르게 무슨 차이가 있는지 궁금해 공부해 봤다.

 

가장 큰 차이점은 String은 불변 속성을 가진다는 점이다.

var str = "Hello" 
str+="World"

이 코드를 보고 기존 String의 참조변수 str이 가리키는 공간에 저장된 "Hello"에 "World"를 더해

"Hello World" 로 변경된 것으로 착각할 수 있다.

하지만 기존에 "Hello" 값이 들어가 있던 String 참조변수 str이 "Hello World" 라는 값을 가지고 있는 새로운 메모리 영역 을 가리키게 변경되고,

기존의 String "Hello" 는 Grabage로 남아있다가 Garbage Collection에 의해 사라진다.
String 클래스는 불변이기 때문에 수정하는 시점에서 새로운 인스턴스가 만들어지는 것이다.

이와 같이 연산이 많이 일어나는 곳에 사용되면 Garbage Collection이 많이 일어나 성능에 악영향을 끼친다.

 

이를 해결하기 위해 StringBuilder, StringBuffer가 나왔다.

String과의 차이로 가변으로 수정, 추가 할 수 있다.
연산이 많이 일어날 경우 StringBuilder/StringBuffer를 사용하는 것을 추천한다.

 

그렇다면 그 둘의 차이점은 무엇인가?
가장 큰 것은 동기화의 유무이다.
StringBuffer는 동기화 키워드를 지원해서 멀티쓰레드 환경에서 안전하다는 것이다.

String 도 마찬가지

 

반대로
StringBuilder는 동기화 키워드를 지원하지 않기 때문에 멀티쓰레드 환경에서는 적합하지 않지만,
단일 쓰레드 환경에서의 성능은 StringBuilder보다 뛰어나다.

 

 

간단 요약

  • String은 불변 클래스로 연산횟수가 많은 곳에서 사용하기 불적합하다.
  • StringBuffer는 가변 클래스로 연산횟수가 많은 곳에서 사용하기 적합하며 멀티쓰레드 환경에 적합하다.
  • StringBuilder는 가변 클래스로 연산횟수가 많은 곳에서 사용하기 적합하며 단일쓰레드 환경에 적합하다.

 

 

Reference