JAVA

[JAVA] String / StringBuilder / StringBuffer

집한구석 2021. 6. 20. 01:04
728x90

String 정리

https://www.geeksforgeeks.org/string-constant-pool-in-java/ 참조

  • 기본타입(Primitive Type)이 아닌 참조타입(Reference Type)
  • 불변(immutable)의 속성 (불변이라 멀티쓰레드 환경에서 쓰레드세이프함 / 값 변경 가능성이 없기 때문에 동기화 문제 X)
  • String 객체는 String constant pool(Heap에 할당되어 있음)에서 따로 관리가 됨 
  • String constant pool에서 String을 관리하면 Java는 Runtime 에서 Heap영역의 메모리를 절약함 (같은 값을 가지는 String에 대해 같은 메모리를 참조하기 때문)
  • String은 결론적으로 Heap영역에서 관리하며 불변객체이기 때문에 문자열을 추가, 수정, 삭제를 하면 새로운 문자열을 만들어야 하기 때문에 Heap영역에서 많은 가비지가 생성되어 성능적인 부분에 영향을 끼침, 이를 해결하기 위해서 StringBuilder, StringBuffer가 나옴

StringBuilder / StringBuffer 정리

  • 가변성을 가짐
  • .append() / .delete()를 통하여 동일객체 내에서 문자열 변경이 가능함
  • StringBuilder는 동기화를 지원하지 않아서, 멀티쓰레드 환경에서 쓰레드 세이프하지 않음
  • StringBuffer같은 경우 동기화 지원하기 때문에, 멀티쓰레드 환경에서 쓰레드 세이프함
  • 단일쓰레드에서는 StringBulider를 사용하기 좋고, 멀티쓰레드에서는 StringBuffer를 사용하는 것이 좋음

비교 

  String StringBuilder StringBuffer
저장 String constant pool Heap Heap
가변유무 불변 가변 가변
쓰레드세이프 O X O
동기화 O X O
성능 빠름 느림 빠름

'JAVA' 카테고리의 다른 글

[JAVA] e.printStackTrace() 사용하지 말아야하는 이유  (3) 2021.07.04
[JAVA] List Collection(ArrayList / LinkedList / Vector)  (0) 2021.06.26
[JAVA] HashMap 원리  (0) 2021.06.13
[JAVA] 일급컬렉션  (0) 2021.06.10
[JAVA] Map / getOrDefault  (0) 2021.06.10