Java

[ Java ] - String, StringBuffer, StringBuilder 비교

구티맨 2020. 9. 21. 15:57

자바에서 문자열을 다루는 클래스는 몇 개가 있습니다.

 

그중 String 은 자바 뿐만 아니라 다른 언어에서도 많이 사용을 하다 보니,

 

자연스레 그냥 String으로 구현을 하게 됩니다.

 

그런데, String으로 그냥 개발해도 관계가 없다면 다른 클래스들이 나오지 않았겠죠?

 

String, StringBuffer와 StringBuilder를 한번 알아보도록 하겠습니다.

 

 

StringBuffer vs StringBuilder

먼저, StringBuffer와 StringBuilder를 비교해보겠습니다.

 

간단하게 아래 표와 같이 정리를 할 수 있습니다.

StringBuffer StringBuilder
Thread-Safe Not Thread-Safe
Synchronized Not Synchronized
Since Java 1.0 Since Java 1.5
Slower Faster

 

Thread safe 할 필요가 없는 경우에는 상대적으로 빠른 StringBuilder를 사용하고,

 

Thread safe 해야 하는 경우에는 StringBuffer를 사용하면 됩니다. 

 

String vs StringBuffer

그렇다면, String이랑 StringBuffer와는 어떻게 다를까요?

 

String 은 immutable 하여, 문자열 조작 시 새로운 String 객체를 만들게 됩니다.

 

반면에 StringBuffer는 mutable 객체로, String 조작을 하더라도 객체를 새롭게 만들지 않고

 

생성된 객체에서 문자열을 조작하게 됩니다.

 

 

결론은 단순 문자열을 저장하기 위해서는 String을 사용하고,

 

문자열을 조작하는 경우에는 StringBuffer, StringBuilder를 사용하면 됩니다.

 

 

JDK 5.0부터는 컴파일러에서 String 조작에 대해, StringBuilder로 컴파일한 코드를 만든다고 합니다.

 

어느 정도는 컴파일러가 보완을 해주지만, 그래도 반복문을 작성한다면 String 객체 자체는 매번 다시 만들어주기 때문에

 

StringBuffer나 StringBuilder 보다 느리기는 매한가지입니다.

 

 

결론

하드웨어 성능이 어마어마한 요즘, 이런 게 뭐 크게 영향을 끼치냐고 할 수도 있지만

 

문자열을 사용하여 쿼리를 반복적으로 크게 작업을 하는 프로그램의 경우

 

연산 속도뿐만 아니라 메모리 사용량에서 꾀나 차이가 날 수 있다.

 

당장 성능 차가 거의 없다고 하더라도 이런 사소한 부분들이 쌓여 언젠가는 성능에 영향을 미치는 순간이 올 것이다.

 

더 좋은 방법을 알고 있는데, 굳이 느린 코드를 작성할 필요는 없지 않은가?