Java에서 문자열을 다룰 수 있는 방법은 두 가지가 있습니다.
첫 번째로 문자열 상수에 대해 불변성(immutable)을 가진 String
클래스가 있고, 두 번째로 같은 메모리로 문자열을 다루는 StringBuffer
, StringBuilder
클래스가 있습니다.
String
String
객체는 한번 생성되면 할당된 메모리 공간이 변하지 않습니다. 그래서 String
객체 문자열에 다른 문자열을 붙여도 기존 문자열에 붙이는 것 이 아니라, 새로운 String
객체를 만든 후 새 String
객체에 연결된 문자열을 저장하고 그 객체를 참조합니다. 때문에 String
을 조작하는 연산은 시간과 자원을 많이 사용합니다.
StringBuffer & StringBuilder
이 둘은 문자열을 한 번 만들고 연산이 필요할 때마다 크기를 변경해가며 문자열을 변경합니다. 이는 내부적으로 문자가 저장되는 가변 길이의 동적 배열을 통해 문자들이 들어가는 구조를 있기 때문입니다. 따라서 문자열을 조작이 많을 경우 String
보다 더 빠릅니다.
이 둘의 차이점
StringBuilder의 경우 동기화를 보장하지 않지만, StringBuffer는 동기화를 보장하고 있습니다.
// StringBuilder
public StringBuilder append(String str) {
super.append(str);
return this;
}
// StringBuffer (synchronized가 붙음)
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
때문에 멀티쓰레드환경에서는 StringBuffer를, 단일쓰레드환경에서는 StringBuilder를 사용하는 것이 안전하고 효율적입니다.
정리
String
: 문자열 연산이 적고 멀티쓰레드 환경인 경우StringBuffer
: 문자열 연산이 많고 멀티쓰레드 환경인 경우StringBuilder
: 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우
'👨🏻💻 Development > ☕️ Java' 카테고리의 다른 글
JUnit의 @BeforeClass 와 static block {} (0) | 2021.10.20 |
---|---|
2021년 09월 16일 TIL - Mocking Static Method (0) | 2021.09.17 |
2021년 09월 07일 TIL - 의존 역전 원칙 (Java) (0) | 2021.09.08 |
Java의 Object 클래스 (0) | 2021.08.07 |