본문 바로가기
Java

[Java] String, StringBuilder, StringBuffer의 차이

by 그리득 2024. 3. 14.
728x90

String, StringBuffer, StringBuilder 차이점과 장단점.

 

프로그래머스 문제를 풀다보면 문자열을 이용한 풀이를 생각보다 많이 접한다.

가끔은 StringBuilder를 쓰고 StringBuffer를 쓰는데 둘의 정확한 차이점을 제대로 알아보기 위해 글을 적어볼까 한다.

 

일단 큰 정의는 String, StringBuffer, StringBuilder.. 모두 문자열을 저장하고, 관리하는 클래스이다.

 

1) String

먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 String은 immutable(불변), StringBuffer는 mutable(변함)에 있다. String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라,새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다. (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성. 한번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수.)

String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않다.

하지만, Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe),  내부 데이터를 자유롭게 공유 가능하다.

 

2) StringBuffer와 StringBuilder

StringBuffer/StringBuilder는 String과 다르게 동작한다. 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,기존의 버퍼 크기를 늘리며 유연하게 동작한다. (StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일)

 

두 클래스의 큰 차이점은 동기화 여부이다.

- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.

- 반면, StringBuilder는 동기화를 보장하지 않음.그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다.

단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

 

단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 라고 보면 될 것 같다.

정리 하자면

String : 문자열 연산이 적고 멀티쓰레드 환경에 적합

StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경에 적합

StringBuilder : 문자열 연산이 많고 단일쓰레드, 동기화를 고려하지 않는 환경에 적합

'Java' 카테고리의 다른 글

[자바의 정석] 변수  (0) 2024.05.03