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은 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 |
---|