대표적인 Java의 문자열을 다루는 자료형 클래스는 String, StringBuffer, StringBuilder 이 세 가지로 구분된다. 하지만 정확한 쓰임에 따라 구분하는 건 어려울 것입니다. 이번 포스팅에서는 세 가지 클래스에 대해 알아보고 어떠한 목적에 맞게 사용해야 하는지 알아보도록 하겠습니다.
가장 자주 사용되는 String 클래스
Java에서 String은 변하지 않는다는 특징을 갖고 있습니다. 따라서 문자열이 변하지 않는다고 가정할 때 문자열 클래스 중에 가장 뛰어난 성능을 기대할 수 있습니다. 하지만 실제 계속해서 문자열이 변하는 코드를 작성하게 되는 경우에는 좋지 않은 성능을 보일 것입니다. 이러한 이유로 인해 StringBuilder, StringBuffer가 등장했습니다.
String 클래스
String str = "moonstar";
String 클래스와 다른 StringBuilder, StringBuffer의 가장 큰 차이점이 있습니다. 바로 String 클래스는 할당된 메모리의 공간이 변하지 않는다는 속성을 가지고 있다는 것입니다. 위의 리터럴 변수를 String 변수에 대입하게 되면 아래 그림과 같이 Heap 메모리 영역 안에 있는 String pool에 저장이 됩니다. 그 후에 같은 리터럴 값을 사용하게 된다면 그 값은 새로운 리터럴 값이 아닌 기존에 String pool 안에 있는 값을 호출하는 것입니다.
StringBuilder, StringBuffer 클래스
StringBuffer strbBuffer = new StringBuffer();
StringBuilder strBuilder = new StringBuilder();
strBuffer.append("tistory");
strBuilder.append("tistory");
String 클래스가 할당된 메모리의 공간이 변하지 않는다는 속성을 가졌다면, 아마 StringBuilder, StringBuffer는 변한다는 속성을 갖고 있다고 추측할 수 있습니다. StringBuilder, StringBuffer으로 선언을 하게 되면 String 클래스와 같이 값이 변하였을 때 새로운 메모리를 차지하는 것이 아닌 기존의 메모리 영역에서 그대로 값을 변경할 수 있다.
Builder와 Buffer는 차이가 없을까?
//StringBuffer - synchronized(X)
public synchronized StringBuffer append(String str) {
//StringBuilder - synchronized(X)
public synchronized StringBuilder append(String str) {
이 두 개의 클래스의 차이는 각각 정의된 메서드를 보면 알 수 있다. SringBuilder는 synchronized 키워드가 없는 반면에 StringBuffer는 synchronized로 정의되어 있다. 이것이 바로 이 두 개의 클래스의 차이다. StringBuffer는 synchronized를 지원하기 때문에 멀티 스레드 환경에서 안전하게 처리할 수 있지만 속도가 느리다는 장, 단점이 있다. 반면에 StringBuilder는 동기화를 지원하지 않기 때문에 멀티 스레드 환경에서 안전하진 않지만, 단일 스레드의 경우 StringBuffer 보다 빠른 속도로 처리할 수 있다.
문자열 클래스의 사용해야 하는 경우
- String : 문자열의 연산이 적고 멀티 스레드 환경인 경우 - 빠른 성능
- StringBuffer : 문자열의 연산이 많고, 멀티 스레드 환경인 경우 - 다소 느린 성능
- StringBuilder : 문자열의 연산이 많고, 단일 스레드 환경인 경우 - 빠른 성능
'Languages > Java' 카테고리의 다른 글
[Java]문자열(String)과 리스트(List)의 null, 빈 값인지 확인하는 방법 (15) | 2023.07.20 |
---|---|
[Java]안정적인 NULL 처리가 가능한 Optional 알아보기(NullPointerException) (4) | 2023.07.16 |
[Java]ArrayList와 LinkedList 적절하게 사용하기(Java의 동적 배열) (1) | 2023.07.06 |
[Java]do while, while문은 어떤 상황에서 사용할까? (2) | 2023.07.02 |
[Java]Stream 살펴보기_(2)Filter를 사용한 데이터 추출하기 (2) | 2023.06.24 |