본문 바로가기
Language/Java

[JAVA] String, StringBuffer, StringBuilder 차이

by jungwon3004 2022. 1. 11.
728x90
반응형

0. 개요

String, StringBuffer, StringBuilder 3가지 모두 공통적으로 '문자열'을 다루는 클래스이다

하지만 그 차이는 존재한다.

 

String: 불변 (Immutable)

StringBuffer & StringBuilder: 가변 (Mutable)

 

 

1. String

=> 한 번 할당된 메모리 공간이 변하지 않는다

=> +연산자 or concat()를 통해 값 변화 

: 기존 문자열에 붙여서 추가를 하는 것이 아니라, 새로운 String객체를 만든 후 새 String 객체에 연결된 문장을 저장하고 그 객체를 참조하도록 하는 것

즉, String object는 Heap 영역에 생성하고  한 번 생성된 객체의 내부 내용을 변화시킬 수 없다

그러면 기존의 객체는 Garbage Collector에 의해서 회수된다

 

아래 그림을 보면 아주 쉽게 이해가 된다.

 

 

2. StringBuffer, StringBuilder 공통점

=> String과 StringBuffer, StringBuilder의 동작 방식은 다르다

: 문자열 연산 등의 이유로 기존 객체의 공간이 부족해지면 buffer의 크기를 늘려버린다.

(StringBuffer와 StringBuilder의 methods는 동일하다)

 

 

※ StringBuffer가 String 보다 좋으면 왜 String을 쓸까?

: String은 immutable(불변)하기 때문에 안전하다

 여러 threads가 데이터를 공유해도 값이 바뀌지 않으니까 동기화를 신경쓸 필요가 없다

: 문자열의 연산, 수정이 적고 읽기용이라면 String이 적합

 

 

 

3. StringBuffer, StringBuilder 차이점

=> StringBuffer각 method 별로 Synchronized Keyword가 존재해서 multi-thread 환경에서 동기화 가능

=> StringBuilder는 동기화 안 됨

결국,

멀티스레드 환경에서는 StringBuffer

단일스레드 환경에서는 StringBuilder

=> 성능 차이 존재

StringBuffer < StringBuilder (동기화 관련 처리 때문)

 

 

※ StringBuffer와 StringBuilder의 append()

 : String에서는 +나 concat()을 쓰지만, StringBuffer와 StringBuilder에서는 append()를 사용한다

StringBuffer sb = new StringBuffer();

StringBuffer 를 생성할 때 capacity 지정하지 않으면 default 크기 16으로 설정되어 있다.

첫 줄 실행 후, capacity (value 크기) = 16

count = 0

sb.append("first Second"); //문자열 길이: 12

append()하는 문자열의 길이는 12이다.

sb의 capacity는 16인데, 문자열 길이는 12이기 때문에 무리없이 추가된다

count = 12

sb.append("+Third Fourth"); //추가하는 문자열 길이: 13

value에 남은 공간은 4이기 때문에 배열의 크기를 늘려야 한다.

value의 크기를 2배 늘리고 기존의 문자열을 복사한다 (즉, capacity = 32)

value 값 = "first Second+Third Fourth"

count = 26

 

 

 

 

4. 결론

: 각각을 언제 사용하면 좋을까?

▶ String

- 짧은 문자열

- 변경, 연산 등이 적은 경우

- multi-thread 환경

▶ StringBuffer

- Thread에 안전한 프로그램 필요한 경우 혹은 multi-thread 사용할지 안 할지 모르는 경우

- 문자열 연산이 많은 경우

▶ StringBuilder

- single-thread 환경 혹은 동기화를 고려하지 않아도 되는 상황

728x90
반응형