개발은 재밌어야 한다
article thumbnail
반응형

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

이 세가지 클래스 모두 문자열을 저장하고 관리하는 클래스이며 연산이 많지 않을때에는 이 중 어떠한 클래스를 사용해도 이슈가 발생할 가능성은 거의 없습니다.

각 클래스의 특징에 맞게 상황에 따라 적절하게 사용해주면 됩니다.

 

 

 


| String VS StringBuilder / StringBuffer

String은 immutable(불편)하고 StringBuilder,StringBuffer는 mutable(가변)하다는 차이로 나눌 수 있습니다.

 

HelloWorld 라는 문자열을 예시로 보겠습니다.

HelloWorld 라는 문자열을 만들기 위해 먼저 할당된 'Hello' 문자열을 생성했다고 가정하겠습니다.

해당 문자열을 String과 StringBuffer를 통해 str이라는 문자열 변수를 지정하여 메모리 영역에 할당하였습니다.

String과 StringBuilder 모두 str에 같은 Hello라는 문자열 생성하였으나 str을 변경 할 때에는 String은 변경이 불가능하여 새롭게 String 객체를 생성하여 힙 메모리 영역에 할당하고 StringBuffer는 World를 추가한 str 문자열을 수정한 문자열이 메모리 영역에 할당됩니다.

 

String 객체는 Immutable 변경할 수 없는 불변 객체입니다.

즉, 한번 만들어진 객체는 수정할 수 없다라는 뜻입니다. concat이나 + 오퍼레이션을 통해서 문자열을 합치거나 가공할 때 마다 매번 새로운 String 객체를 만들어 낸다고 생각하면 됩니다. 새로운 메모리 공간을 할당하고, 예전에 사용하지 않은 String은 GC(Garbage Collection)에 의해서 수거를 합니다.

 

만약에 엄청나게 많은 수의 문자열을 조작한다고 가정한다면, 사용하지도 않은 힙 메모리 영역들에 문자열들이 차지하게 되고 (나중에 GC을 통해 수거된다고 해도) 메모리 누수가 발생할 수 있습니다. 그래서 자바에서는 StringBuffer, StingBulider를 통해 변경할 수 있는 문자열을 조작할 수 있는 클래스를 제공하고 있습니다.

 

StringBuilder, StringBuffer 객체는 mutable 변경 할 수 있는 가변 객체입니다.

StringBuilder와 StringBuffer는 String과는 다르게 mutable한 객체입니다. append(), insert(), delete(), substring()등과 같은 메서드들을 통해서 메모리에서 새롭게 할당하는 것이 아닌, 가변적으로 메모리를 늘려나가는 방식입니다.


| StringBuilder  StringBuffer의 차이

StringBuffer와 StringBuilder 둘의 사용 방법은 동일합니다.

 

둘의 차이는 

StringBuffer에서는 모든 public 메서드에 sycronized 키워드가 붙어있습니다. 즉 Thread-safe하다는 말입니다.

다시말해 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용이 되어 있다라는 말입니다.

동시에 Thread-safe하다는 말은 자원을 선점할때 Lock를 걸기 때문에 그만큼의 성능 효율이 매우 안 좋다는 것을 의미합니다. 그래서 1.4때까지는 StringBuffer를 사용했지만, 그 이후 버전에는 StringBuilder를 사용하는 것입니다.

StringBuilder에서는 단일 스레드 환경에서만 사용하도록 설계되어 있지만 StringBuffer에 비해 당연히 성능이 좋습니다.

 


 

| 정리

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

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

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

 

단순한 성능만 놓고 본다면 연산이 많을 경우

StringBuilder > StringBuffer >>> String

정도로 보면 되겠습니다. 하지만 각 문자열 클래스들은 성능 이슈외에도 사용 편의성, 멀티 스레드 환경 등 고려해야할 요인들이 있으므로 이에 적합한 것을 사용하면 될 것입니다.

 

 

 

참고

https://umanking.github.io/2020/09/06/java-stringbuilder/

https://100100e.tistory.com/248

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!