Christmas Pikachu String과 StringBuilder, StringBuffer의 차이점
개발일지/자바

String과 StringBuilder, StringBuffer의 차이점

ZI_CO 2022. 10. 4.

Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBufferStringBuilder 가 있다.

 

문자열을 변수에 담아서 두 변수를 합칠때 String을 두번 생성해야한다. 메모리낭비!!!!

하지만 StringBuilder, StringBuffer를 사용하게되면 힙메모리에 한번만 new 하게 된다.

그리고나서 글자를 추가를 원하면 .append메소드를 사용하면 따로 new안해도 글자를 뒤에 추가를 할수가있다.

(메모리 절약)

 

 
연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다. 그러나 연산횟수가 많아지거나 멀티쓰레드, Race condition 등의 상황이 자주 발생 한다면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해 줘야한다.!
 
String과 StringBuffer/StringBuilder 클래스의 가장 큰 차이점은 String 불변(immutable)의 속성을 갖는다는 점이다.

 

String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있다. 그러나 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다.

 

String 과는 반대로 StringBuffer/StringBuilder 는 가변성 가지기 때문에 .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능하다. 따라서 문자열의 추가,수정,삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용해야 한다.

 

 

String 타입의 변수로 넣어주려면 .toString(); 사용해주면된다. 

 

 

 

StringBulder안에 들어가보면 toString반환타입이 String인걸 알수가있다.

 

 

StringBuffer도 StringBulder와같이 주소값하나에 값을 변경할수있는걸 알수가있다 

 

 

그렇다면 동일한 API를 가지고 있는 StringBufferStringBuilder의 차이점은 무엇일까?

가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 이다.  참고로 String 불변성을 가지기때문에 마찬가지로  멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있다. 
 

반대로 StringBuilder는 동기화를 지원하지 않때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어나다.

 
 

정리

마지막으로 각 클래스별 특징을 정리해 보겠습니다. 컴파일러에서 분석 할때 최적화에 따라 다른 성능이 나올 수도 있지만 일반적인 경우에는 아래와 같은 경우에 맞게 사용하시면 될 것 같네요.

 
String                :  문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer     :  문자열 연산이 많고 멀티쓰레드 환경일 경우

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

 

'개발일지 > 자바' 카테고리의 다른 글

Lambda(람다식) 활용  (0) 2022.10.05
List 사용법  (0) 2022.10.04
identityHashCode, hasCode의 차이점  (0) 2022.10.04
콜백 메소드의 활용  (0) 2022.10.04
제네릭이란  (0) 2022.09.22

댓글