본문 바로가기
Java , Spring/Java

[Java] String, StringBuffer, StringBuilder 차이 및 장단점

by 방배킹 2024. 1. 10.

Java에서 문자열을 다루는 대표적인 클래스에는 String, StringBuffer, StringBuilder가 있다.

각 클래스의 차이점 및 장단점을 정리해보자.

String vs StringBuffer / StringBuilder

String과 StringBuffer/StringBuilder 클래스의 가장 큰 차이점은 String은 불변(immutable)이라는것이다.

String  불변에 대해서는 아래 글에서 다루었다.

https://bangbaeking.tistory.com/88

 

[Java] String 특징, String Pool

Java에서 일반적인 데이터 타입의 비교는 == 연산자를 사용한다. 하지만 String에서는 ==이 아닌 equals 연산자를 사용한다. public class Test { public static void main(String[] args) { String str1 = "Hello"; String str2 = "

bangbaeking.tistory.com

 

String은 불변이기 때문에 아래와 같은 코드의 경우 Hello 가 HelloJava로 수정되는것이 아니라

HelloJava라는 새로운 String 객체를 생성하고 리턴되어 str1이 HelloJava를 가르키게 된다.

String str1 = "Hello";
str1 += "Java";

 

그리고 기존에 있던 Hello Garbage로 남아있다가 GC에 의해 사라지게 된다.

 

즉, String 클래스는 불변이기 때문에 수정이 발생하면 새로운 String 인스턴스가 생성되고 Garbage가 생성된다.

따라서 문자열의 추가,수정,삭제등의 연산이 자주 발생하는 경우 String 클래스는 성능에 문제가 생긴다.

 

이럴 경우 불변이 아닌 가변성을 가지는 StringBuffer, StringBuilder 클래스를 사용하면 좋다.

 

StringBuffer vs StringBuilder

그러면 가변성을 가지는 StringBuffer 와 StringBuilder의 차이점은 무엇일까?

StringBuffer 와 StringBuilder의 가장 큰 차이점은 동기화 유무이다.

 

StringBuffer는 동기화 키워드를 지원하여 멀티 쓰레드 환경에서 안전하지만

StringBuilder는 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 사용하는것이 적합하지 않다.

동기화를 고려하지 않는 만큼 단일쓰레드에서는 StringBuilder가 StringBuffer보다 뛰어나다.

 

String은 불변이기 때문에 멀티 쓰레드 환경에서 안정성을 가지고있다.

 

정리

String             :  문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer    :  문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder  :  문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우  

 

Reference

 

 

 

 

댓글