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보다 뛰어납니다.
'웹 개발' 카테고리의 다른 글
log4j로 printStackTrace 출력 (0) | 2020.12.12 |
---|---|
eclipse] maven build 시 test를 빼는 방법 (0) | 2020.12.06 |
spring boot를 사용해야 하는 이유 (0) | 2020.12.04 |
Spring boot application 시작 시, CPU 100% 를 사용할 경우 대처 방법 (0) | 2020.11.29 |
java에서 메모리 문제가 발생할 경우 사용해볼 수 있는 메모리 옵션 (0) | 2020.11.29 |