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 |
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 객체와 클래스(필드, 생성자(this와 this()), 메소드) (2) | 2023.01.12 |
---|---|
[JAVA(자바)] 객체지향 프로그래밍이란? (feat. 추상화, 캡슐화, 상속, 다형성) (0) | 2023.01.10 |
[JAVA(자바)] 열거 타입이란? (0) | 2023.01.05 |
[JAVA(자바)] 배열(Array) 타입이란? (feat. 길이, for each문, 다차원 배열) (0) | 2023.01.05 |
[JAVA(자바)] 문자열 대체(치환) (replace, replaceAll, replaceFirst)와 replace, replaceAll 차이점 (0) | 2023.01.05 |
댓글