Programming/Kotlin

String vs StringBuilder vs StringBuffer

YK Choi 2021. 5. 14. 17:34

Java/Kotlin에서 문자열을 다루는 클래스로 String, StringBuilder, StringBuffer가 있다.

각각의 특징이 차이가 있으니 적재적소에 사용할 수 있도록 분석해보았다.

 

 

String

String 과 StringBuilder/StringBuffer와의 큰 차이는

String은 immutable 하고, StringBuilder/StringBuffer는 mutable하다는 것이다.

 

예를 들어 String str = "Good" 또는 var str : String = "Good" 이라고 했을때

str += " Morning"

을 하게 되면 str 은 "Good Morning"을 가리킨다.

 

그러나 내부적으로 봤을 때 "Good" 메모리 영역 뒤에 "Morning"이 단순히 합쳐진 것이 아니라 새로운 메모리 영역에 "Good Morning"이 만들어 진것이다.

그럼 남아있는 "Good"은 어디로 가는가? -> 사용되지 않으므로 Garbage에 남아있다가 GC대상이 된다.

 

부적절한 사용 예시 : 문자열의 추가/수정/삭제가 빈번한 경우

 

StringBuilder, StringBuffer

StringBuilder/StringBuffer는 mutable하다는 공통점이 있다. String과 다르게 참조를 바꾸는 식이 아니라 참고하고 있는 값을 바꾼다.

따라서 String과는 다르게 문자열의 추가/수정/삭제가 빈번할 경우 사용하면 좋다.

 

StringBuilder와 StringBuffer의 가장 큰 차이점은 동기화 유무이다.

 

  • StringBuilder는 단일 스레드나 동기화를 고려하지 않아도 되는 환경에서 적절하다. 생각해보면 알고리즘 풀이 중에  StringBuilder를 쓰는 경우는 종종봤어도 StringBuffer를 쓰는 경우는 거의 못보기도 했다. 
  • StringBuffer는 멀티 스레드 환경에서 안전하다.(Thread-safe) 하지만 동기화에 대한 오버헤드 때문에 성능은 떨어진다고 한다.

 

String, StringBuffer, StringBuilder 비교

 

추가로 String은 immutable하기 때문에 thread-safe하다.

 

위의 표에서 String의 Storage는 다른 클래스와 다르게 String pool이라고 해서 뭐지싶어 찾아봤는데 Java 7버전부터는 heap 영역으로 string pool를 옮겼다고 한다. 따라서 셋다 heap 영역이다.

'Programming > Kotlin' 카테고리의 다른 글

Kotlin/Java의 Primitive type, Reference type  (0) 2021.05.03