[java] String, StringBuilder, StringBuffer

Jifrozen·2022년 11월 11일
0

기초 다지기

목록 보기
21/29

String

String 불변성

String과 StringBuilder, StringBuffer의 가장 큰 차이점은 불변성이다.
불변성은 변하지 않는 성질이다.

String str="java";
str+="chip";
>>str
"javachip"

위 코드에서 String 객체 안에 어떤 일이 벌어지는지 확인해보자

실제로 기존의 "java"를 저장한 메모리 영역은 str과의 참조가 끊어지면서 GC 수거 대상이 된다. 즉 "java"를 저장한 메모리 영역이 "javachip"이 되는것이 아니라 새로운 영역에 "javachip"가 저장된것이다.
따라서 문자열이 자주 변경되는 경우 계속해서 기존 문자열의 메모리 영역이 버려져 메모리 공간을 차지해 메모리 부족 상황이 유발될 수 있다.

StringBuffer, StringBuilder

위 String의 불변성으로 생기는 문제때문에 StringBuffer와 StringBuilder가 등장하였다. String과 다르게 가변성을 가지기 때문에 append()를 이용하면 동일한 객체에 문자열을 변경하는게 가능하다. 따라서 문자열 수정이 빈번히 발생하는 경우 String이 아닌 StringBuffer, StringBuilder를 사용해야 한다.

StringBuilder / StringBuffer 차이점

Thread safe 유무이다. StringBuffer는 내부 메서드별로 synchronized 키워드가 선언되었기 때문에 멀티스레드 환경에서 안전하게 사용할 수 있다. 하지만 동기화 작업을 거쳐야 하므로 StringBuilder에 비해 속도 성능은 떨어진다.
StringBuilder는 동기화를 지원하지 않기 때문에 단일 스레드 환경에서 적합하며, 성능이 좋다.

String이 thread safe한 이유?
String은 final로 선언된 클래스로 값이 바뀔일이 없다. String의 값이 변경되면 동일한 문자열을 수정하는 것이 아닌 String pool에 새로운 문자열을 생성하는거기 때문에 Thread safe하다.

String을 사용하는 경우

StringBuilder나 StringBuffer를 생성하면 개발자가 명시하지 않을 경우 자동으로 16 크기로 설정된다. 만약 초기 크기를 넘어 작업을 한다면 String 객체보다 속도가 떨어질 수 있다.

<출처>
https://junior-datalist.tistory.com/232
https://ifuwanna.tistory.com/221

0개의 댓글