개발 지식 기록/JAVA

String vs StringBuffer vs StringBuilder

엉망진창좌충우돌 2023. 7. 25. 02:32

코딩테스트 연습 문제를 풀 때 아무 생각 없이 String으로 작성했는데 다른 사람들의 풀이를 보면 StringBuilder를 쓴 것을 자주 보곤 했다.

최근에 문자열에 계속 추가를 해야 하는 과제가 있었기에 이번 기회에 String과 StringBuffer, StringBuilder의 차이를 정리하려고 한다.


String

String클래스는 인스턴트를 생성할 때 지정된 문자열을 변경할 수 없다.(불변성) 기존 문자열에 +로 문자를 추가한 경우 보기에는 내용이 변경되는 것 같지만, 새로운 내용의 문자열이 형성되고 그 메모리 영역을 가리키도록 변경된다. 기존 메모리 영역은 Garbage로 남아있다가 GarbageCollection에 의해 사라진다. 따라서 변경이 빈번한 경우 성능이 떨어질 수밖에 없다.

 

StringBuffer

String과 달리 지정된 문자열의 변경이 가능하다. 내부에 문자열 편집을 위한 버퍼(Buffer)를 가지고 있으며 인스턴스를 생성할 때 그 크기 지정이 가능하다.(지정하지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.)(생성 시 문자열을 담으면 그 문자열의 크기 + 16만큼의 버퍼를 가진다.)

String과 StringBuffer 모두 char 배열을 기본으로 만들었지만,  String에 비해 StringBuffer는 위의 설명처럼 여유 버퍼가 있기 때문에 내용 추가가 가능하다. (StringBuffer도 버퍼의 크기보다 작업하려는 문자열의 길이가 긴 경우 새로운 배열을 만들고 이전 값들을 복사한 후 그 배열을 가리키도록 변경된다. 배열의 길이가 변경될 수 없기 때문)

StringBuffer의 메서드들은 객체 자신의 주소를 반환하는 메서드들이 많다. 새로운 객체가 생성되는 것이 아니기 때문에 내용의 수정과 추가 등 변경이 빈번한 경우 String보다 좋은 성능을 보여준다.

 

참고) StringBuffer는 equals 메서드가 오버라이드 되어있지 않다. String클래스에서 같은 내용이어도 ==로 비교하면 false로 나온 것처럼 equals를 써도 ==를 쓴 것과 같은 결과가 나온다. 따라서 비교를 위해서는 toString을 사용해 String으로 변경 후 equals로 비교해야 한다.

 

StringBuilder

StringBuffer와 기능은 똑같으나 큰 차이는 동기화에 대한 부분이다. StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있고, 이러한 동기화가 StringBuffer의 성능을 떨어뜨린다.

즉 StringBuilder는 StringBuffer에서 동기화 부분을 뺀 것이라고 할 수 있다. 멀티쓰레드가 아닌 경우 동기화가 필요하지 않기 때문에 StringBuilder를 사용하는 것이 더 좋은 성능을 보여준다.

 

 

정리하면

String은 문자열의 수정, 추가가 적은 경우

StringBuffer는 멀티쓰레드 환경에서 문자열의 수정, 추가 등이 빈번한 경우

StringBuilder는 단일쓰레드 환경에서 문자열의 수정, 추가 등이 빈번한 경우

사용한다고 할 수 있다.

 


참고 1. Java의 정석 3rd Edition (남궁 성 저, 도우 출판)

 

참고 2. https://ifuwanna.tistory.com/221

 

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

Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다.

ifuwanna.tistory.com

 

참고 3. https://12bme.tistory.com/42

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자열을 저

12bme.tistory.com

 

'개발 지식 기록 > JAVA' 카테고리의 다른 글

[메서드 정리] Math  (0) 2023.08.06
[메서드 정리] String  (0) 2023.08.06
[메서드 정리] Integer  (0) 2023.08.06
[자바의 정석] 개인적인 정리 글(1주차)  (0) 2023.07.30
Arrays.sort()와 Collections.sort()  (0) 2023.07.30