면접에서 질문받았던 내용이며 면접관님께서 가장 간단한 문제라고 말씀하셨다.
하지만 나는 이 간단한 문제를 대답하지 못했다.
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 |