티스토리 뷰
Overview
세 클래스는 전부 Java에서 String(문자열)을 저장하고 관리하는 클래스이다.
Java 프로그래밍을 할 때 문자열을 가장 많이 사용하는데, 자주 사용되는 클래스들의 쓰임새를 잘 알고 효율적으로 사용하는 것이 바람직해 보여 포스팅을 한다.
불변성(immutable) : 객체의 값이 할당된 Heap 영역의 값을 변경할 수 없다. 주소가 재할당 됩니다.
가변성(mutable) : 객체의 값이 할당된 Heap 영역의 값이 변경 가능합니다. 주소는 그대로 사용하고 값을 변경합니다.
String
String은 immutable(불변성) 합니다.
객체가 생성되면 할당된 메모리공간에 변화가 일어나지 않습니다.
@Test
public void testString(){
String originText = "leo";
String targetText = originText;
originText = originText + "string";
int beforeHashCode = originText.hashCode();
int afterHashCode = targetText.hashCode();
assertNotEquals(beforeHashCode, afterHashCode);
assertNotEquals(originText, targetText);
}
String
은 주소값을 참조하지않고, 새로운 주소를 할당합니다.
Thread-safe하고 사용에도 심플하지만 문자열에 잦은 연산이 일어날 때는 GC에 부하를 줄 가능성이 있습니다. StringBuffer
, StringBuilder
를 사용하는 것이 적합합니다.
StringBuffer, StringBuilder
StringBuffer, StringBuilder는 mutable(가변성) 합니다.
객체가 생성된 후 할당된 값을 변경할 수 있다.
@Test
public void testStringBuilder(){
String text = "leo";
StringBuilder originStringBuilder = new StringBuilder(text);
StringBuilder targetStringBuilder = originStringBuilder;
originStringBuilder.append("string");
int beforeHashCode = originStringBuilder.hashCode();
int afterHashCode = targetStringBuilder.hashCode();
assertEquals(beforeHashCode, afterHashCode);
assertEquals(originStringBuilder.toString(), targetStringBuilder.toString());
}
originStringBuilder
에 값을 할당 한 후 targetStringBuilder
가 해당 객체를 참조한다.originStringBuilder
에 값이 변경되면 targetStringBuilder
의 값도 변경됩니다.
StringBuffer
와 StringBuilder
에서 제공되는 함수는 동일합니다.
다만 동기화 여부 즉, Thread-safe에 차이점이 있습니다.
두 객체에서 가장 많이 쓰이는 append 메소드를 살펴보자. 아래의 이미지를 보면, StringBuffer
에는 synchronized
키워드가 있고, StringBuilder
에는 synchronized
가 없는 것을 볼수 있다.
StringBuffer
StringBuffer
는 동기화 여부를 관리하여 멀티스레드 환경에 적합합니다. 다만 동기화 여부에 신경쓰다보니 성능은 StringBuilder
> StringBuffer
입니다.
StringBuilder
StringBuilder
는 동기화 여부를 신경쓰지 않습니다. 멀티스레드 환경에 적합하지 않고, Thread-safe하지 않습니다.
'Programming > JAVA' 카테고리의 다른 글
Java Stream API 사용해보기 (407) | 2021.05.25 |
---|---|
Java NIO ByteBuffer 사용해보기 (0) | 2021.04.22 |
Immutable Object(불변 객체) (405) | 2021.04.06 |
네이버 책 검색 OPEN API 활용하기 (820) | 2016.06.23 |
[JAVA] TCP 1:1 채팅 (0) | 2016.04.18 |