본문 바로가기
JAVA

[JAVA(자바)] String, StringBuffer, StringBuilder 차이

by 초이사 2023. 1. 6.

String, StringBuffer, StringBuilder 차이를 면접에서 질문한다고 해서 정리하고자 글을 작성한다.

 

셋 모두 문자열을 다루는 클래스들로 보통의 경우에는 큰 차이가 없다.

세 가지의 특성을 고려해야 되는 경우는 문자열 변경등의 연산이 많거나 동기화를 고려해야할 때이다.

 

 

 

String 와 StringBuffer, StringBuilder 차이

 

String

  • 불변성(Immutable)을 가진다. 
    • 문자열을 바꿔 저장하면 새로운 객체를 생성한다. (참조변수에 저장된 메모리 번지가 바뀐다.)
    • 사용하지 않는 메모리 공간(객체)은 Garbage Collector로 제거된다.
    • 멀티 스레드에서 동기화를 신경 쓸 필요가 없어 안전하다 = thread-safe

*동기화(Synchronize): 한 스레드가 작업하고 있을 때, 그 작업에 다른 스레드가 간섭하지 못하게 하는 것

 

StringBuffer, StringBuilder

  • 가변성(mutable)을 가진다. 
    • 문자열을 바꿔 저장하면 원래 있던 객체의 값을 변경한다. (참조변수에 저장된 메모리 번지는 바뀌지 않는다.)

 

 

String 클래스에서는 문자열 변경이 이루어질 때마다 새로운 객체를 생성, 처음에 생성된 객체는 가비지로 있다가 가비지 콜렉터에 의해 제거된다.

가비지가 언제 제거될 지 알 수 없는 상태에서 새로운 객체를 계속 생성하는 오버헤드가 발생할 수 있다. 

* 오버헤드(overhead): 어떤 처리를 하기 위해 들어가는 간접적인 처리시간 및 메모리를 의미한다.

 

-> 문자열 변경이 자주 있는 경우 String 사용은 부적합하다. 하지만 불변하기 때문에 조회가 많은 경우, 멀티스레드 환경에서는 유리하다.

 

문자열 변경 적음 문자열 변경 많음
String StringBuffer, StringBuilder

 

 

 

 

StringBuffer와 StringBuilder 차이

 

StringBuffer

  • 동기화를 지원한다. 멀티스레드 환경에서 안전하다 = thread-safe

StringBuilder

  • 동기화를 지원하지 않는다. 멀티스레드 환경에서 안전하지 않다. 
    • 동기화를 고려하지 않기 때문에 단일 스레드에서는 StringBuffer보다 성능이 좋다(속도가 빠르다)

 

 

-> 멀티스레드 환경에서 동기화를 고려해야 한다면 StringBuffer를 사용하고 동기화를 고려할 필요 없는 경우에는 StringBuilder의 성능이 더 좋기 때문에 StringBuilder를 사용하는 것이 좋다.

 

멀티스레드 - 동기화 필요 단일스레드이거나 멀티스레드 - 동기화 필요x
StringBuffer StringBuilder

 

댓글