Java

(JAVA) String, String builder, String Buffer

wizi 2022. 2. 10. 14:27

면접에서 질문받았던 내용이며 면접관님께서 가장 간단한 문제라고 말씀하셨다.

하지만 나는 이 간단한 문제를 대답하지 못했다.

JAVA를 공부한 지 얼마 안돼서 모를 수 있지만 언어의 중요성에 대해서 간과한 나 자신을 반성하며

이번 기회에 정리를 해보고자 한다.

 

mutable / immutable

String은 불변(immutable)

StringBuffer, StringBuilder는 가변(mutable)

 

immutable - 객체가 한번 생성되면 메모리 공간이 변하지 않음.

mutable - 객체가 한번 생성되더라도 다른 값이 할당되면 할당된 공간이 변함.

 

StringBuilder / StringBuffer

StringBuilder는 동기화를 지원하지 않음

StringBuffer는 동기화를 지원

 

동기화 - 멀티스레드 환경에서 안전하게 동작 가능.

StringBuffer의 경우 synchronized 키워드를 지원하여 사용하는 스레드를 제외한 나머지 스레드들이 데이터에 접근할 수 없도록 해준다.

 

사용?

string의 경우 문자열을 붙이거나 메서드를 통해 변경할 경우 새롭게 메모리를 할당하는데 이 때문에 변경 시 성능의 이슈가 있다.

그러면 무조건 StringBuilder / StringBuffer를 사용해야하나?

생각

StringBuffer/StringBuilder가 성능이 좋다고 하는 이유는 String의 경우 두 문자열을 더할 때

두 문자열 각각 읽어서 새로운 메모리에 복사하기 때문이다.

StringBuffer/StringBuilder에서도 마찬가지로 문자열 복사를 하긴 하는데 가변 배열이라

필요한 경우에만 문자열을 복사한다.

 

단지 String연산이 있을 때만 StringBuffer/StringBuilder가 더 유리해 보인다.

그런데 변하지 않는 문자열을 자주 사용할 경우 String타입이 성능면에서 유리하다고 한다.

 

StringBuffer/StringBuilder와 String을 읽을 때 차이가 있는가?

단지 불변하기 때문에 단순 읽기 연산이 StringBuffer/StringBuilder 빠르다는 말이 있다.
같은 길이의 문자열을 String과 StringBuilder로 각각 만들었을 때

JVM이 String을 어떻게 읽어 들이는지 살펴봐야 정확하게 알 수 있을 것 같다.

 

 

 

 

 

'Java' 카테고리의 다른 글

Java 접근 제어자  (0) 2022.03.16
Java String 정렬에 관하여  (0) 2022.03.09
JAVA String에 관하여  (0) 2021.07.12
프로그래머들에게 권장하는 JAVA 네이밍 규칙  (0) 2021.07.12
JVM(Java Virtual Machine)  (0) 2021.07.12