웹 개발

StringBuffer와 StringBuilder

노루아부지 2020. 12. 5. 00:36
반응형

StringBuffer/StringBuilder 사용

이것은 java code의 입니다. + 연산자는 사용하면 안됩니다. 그 이유는 String은 불변(immutable) 객체이기 때문입니다.

예를 들어, 아래와 같은 코드가 있다면 어떻게 될까요?

String str  = "hello";

str = str + " world";

 

위 코드는 변수 str에 문자열 객체 "hello"를 생성하고 대입한 다음, str의 변수의 값에 새로운 문자열 " world"를 대입하는 코드 입니다.

 

String 객체는 "불변" 객체이기 때문에 문자열을 + 연산자로 추가할 경우 메모리에서 새로운 문자열을 생성합니다. 즉, str객체가 가지고 있던 메모리에 " world"라는 문자열을 추가하는 것이 아니라 새로운 메모리를 할당 한 후 "hello world"라는 값을 설정 하고 str은 이 새로운 메모리 영역을 가리키게 됩니다. 또한 이 경우 기존의 문자열 객체는 더이상  참조되지 않기 때문에 가비지컬렉터(GC)의 대상이 되어버립니다.

문자열 추가/수정/삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 객체를 사용하면 힙(Heap) 메모리에 많은 가비지(Garbage)가 생성되어 힙 메모리 부족으로 application 성능에 치명적인 영향을 끼치게 될 수 있습니다.

 

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

 

이 다음은 StringBuilder를 사용하는 코드 입니다.

 

StringBuffer vs StringBuilder

 

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

가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드를 지원하여 Multi thread 환경에서 안전하다는 점(thread-safe) 입니다.

반대로 StringBuilder는 동기화를 지원하지 않기 때문에 Multi thread 환경에서 사용하는 것은 적합하지 않지만 성능은 StringBuffer보다 뛰어납니다.

728x90
반응형
loading