Java

[Java] String, StringBuffer, StringBuilder

딸기케잌🍓 2021. 4. 22. 00:28

자바에는 문자열을 저장하고 관리하는 클래스 중에 String, StringBuffer, StringBuilder가 있습니다.

이 클래스들의 차이점을 알아보겠습니다.

 

String (immutable)       vs      StringBuffer (mutable), StringBuilder (mutable)

String 객체는 한 번 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않아요(immutable)

반대로 StringBuffer와 StringBuilder는 가변성을 가집니다.

 

String str = "I love"
str += "you"

str 변수가 가르키는 "I love" 문자열에 "you" 문자열이 더해진 것이라고 생각 할 수 있지만 str 변수는 "I love you"라는 새로운 메모리 영역을 가리키게 변경된 것입니다.

처음 선언했던 "I love" 문자열은 Garbage Collector의 대상이 됩니다.

String 클래스는 불변하므로 문자열이 수정되면 새로운 String 인스턴스가 생성됩니다.

따라서 변하지 않는 문자열을 자주 접근하는 경우 String 클래스가 적합합니다.

하지만 문자열 추가, 수정, 삭제 등의 연산이 빈번한 경우라면 힙 메모리에 많은 임시 Garbage가 생성되어 성능에 좋지 않습니다.

 

StringBuffer와 StringBuilder는 가변성(mutable)을 가집니다.

StringBuffer와 StringBuilder는 동일한 객체 내에서 문자열을 변경하는 것이 가능합니다.

즉, 클래스를 한 번 만들면 메모리의 값을 변경시키면서 문자열을 수정합니다.

따라서 문자열 열산이 빈번한 경우에 사용하면 좋은 성능을 기대할 수 있습니다.

또한 제공하는 메서드도 같고 사용하는 방법이 동일합니다.

 

StringBuffer vs StringBuilder

StringBuffer는 멀티쓰레드 환경에서 각 메소드 별로 synchronized 키워드가 존재하고, 동기화가 가능하며 thread-safe 합니다.

(String 클래스도 불변성을 가지므로 thread-safe 합니다.)

 

반대로 StringBuilder는 동기화를 지원하지 않고 thread-safe 하지않습니다.

단일 쓰레드에서의 성능은 StringBuffer보다 뛰어납니다.

 

'thread-safe하다' 란?
멀티스레드 프로그래밍에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함

 

 

정리

문자열 연산이 많고 동기화가 필요한 경우 => StringBuffer

문자열 연산이 많고 단일 쓰레드 환경일 경우 => StringBuilder

문자열 연산이 적고 동기화가 필요한 경우 => String

  String StringBuffer StringBuilder
Storage String pool heap heap
Modifiable No Yes Yes
Thread-safe Yes Yes No
Synchronized Yes Yes No
Performance Fast Slow Fast

'Java' 카테고리의 다른 글

[Java] 컴파일러 vs 인터프리터 vs JIT compiler  (0) 2021.05.31
[Java] JVM 구조와 원리  (0) 2021.05.23
[Java] Static 변수, static 메소드  (0) 2021.05.23
[Java] JavaAgent  (0) 2021.01.17
[Java] Garbage Collector  (0) 2020.05.11