오늘은 Java에서 String / Stringbuilder / StringBuffer 를 알아보는 시간을 갖도록 하겠다.
Java에서는 문자열을 다루는 클래스로 String, Stringbuilder, StringBuffer가 있다.
연산이 많지 않은 상황에서 어떤 클래스를 사용하더라도 문제가 되지 않지만, 연산이 많아지고 멀티스레드 등 상황이 발생하면 클래스의 특징을 이해하고 잘 사용하도록 해야한다.
크게 보면 2가지로 나눌 수 있다.
바로 String 과 StringBuilder / StringBuffer 이다.
(1) String
다른 두 가지 클래스와 String의 차이점은 String은 불변(Immutable)속성이라는 점이다.
(StringBuilder와 StringBuffer는 가변(Mutable)속성이다.)
String str = "Hello";
str += " World";
첫 줄에 str에 "Hello"를 우선 할당하였다. 그 이후 " World"를 이어서 붙였는데 이는 "Hello"에 "World"가 붙어서 "Hello World"가 str에 할당된 값이 바뀐것으로 보이지만, 사실 그렇지 않다.
이는 불변(Immutable) 속성의 특징으로 String의 객체는 생성 이후 할당된 메모리의 공간이 변하지 않는다. +연산자 또는 concat 메서드를 통해서 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열을 붙이는 것이 아니라, 새로운 메모리 영역의 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다. 처음에 선언했던 "Hello"로 값이 할당된 메모리 영역은 Garbage로 남아있다가 Garbage Collection에 의해 메모리가 해지된다.
때문에 String 객체는 문자열의 연산이 많을 수록 성능이 좋지 않다. Heap 메모리에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다.
하지만, 불변객체(Immutable Object)는 간단히 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기 떄문에(Thread-safe). 내부 데이터를 자유롭게 공유 가능하다.
결과적으로, 변하지 않는 문자열을 자주 읽어들이는 경우 String 클래스를 사용하는 것이 좋다.
(2) StringBuilder & StringBuffer
1) 특징
- 앞서 서술한것과 같이 String은 불변속성을 가지고 있고 StringBuilder와 StringBuffer는 가변속성을 가지고 있다. 이는 String 클래스와는 다르게 문자열의 연산이 발생할 때, 매번 새로운 메모리 영역을 할당하는게 아니라 기존의 메모리 버퍼 크기를 늘리며 유연하게 동작한다. 따라서 문자열 연산에 있어서는 String 클래스 보다 빠르다. (StringBuilder와 StringBuffer 클래스가 제공하는 메서드는 동일하다.)
2) 차이점
- 동기화의 여부이다.
- StringBuilder는 동기화를 보장하지 않는다.
- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다.
- 멀티스레드에서는 StringBuffer가 단일스레드에서는 StringBuilder가 더 좋은 성능을 갖는다.
(String은 불변속성을 가져 멀티쓰레드 환경에서 안정성(thread-safe)을 가지고 있다.
(3) 정리
String : 문자열 연산이 적은 경우
StringBuilder : 문자열 연산이 많고 단일스레드인 경우
StringBuffer : 문자열 연산이 많고 멀티스레드인 경우
References
[Java] String, StringBuffer, StringBuilder 차이 및 장단점
Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다
ifuwanna.tistory.com
[자바] String, StringBuilder, StringBuffer의 차이
* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자..
12bme.tistory.com
'컴퓨터 이론 > Java' 카테고리의 다른 글
[Java] 불변 객체에 대해서 알아보자. (0) | 2021.10.13 |
---|