JAVA에서는 문자열을 다룰수 있는 String이라는 클래스가 있다.
그럼에도 불구하고 JAVA는 문자열을 다루는 StringBuilder와 StringBuffer 클래스가 존재한다.
가장 큰 이유로는 StringBuilder와 StringBuffer 클래스는 String 클래스와는 다르게 가변적으로 값을 변경할 수 있다는 것이다.
String 클래스도 아래와 같은 방법으로 문자열을 변경할 수 있다.
String str1 = "ABC";
System.out.println("변경전 : " + str1);
str1 = str1 + "D";
System.out.println("변경후 : " + str1);
변경전 : ABC
변경후 : ABCD
하지만 String 클래스는 값을 변경할 때마다 메모리에 새로운 공간에 값을 저장하고 새로운 메모리 공간을 가리키는 방식으로 값이 변경되며 이전의 값이 있던 메모리공간은 garbage collection에 의해서 사라지게 되기 때문에 효율적이지 못하다.
반면에 StringBuilder와 StringBuffer 클래스는 .append(), .delete() 등의 API를 통하여 동일 객체내에서 문자열을 변경할 수 있다.
StringBuilder stringBuilder = new StringBuilder("Builder");
System.out.println("StringBuilder 변경전 : " + stringBuilder);
stringBuilder.delete(2, 5); #Buer
stringBuilder.append("ABCD"); #BuerABCD
stringBuilder.replace(0, 2, "X"); #XerABCD
System.out.println("StringBuilder 변경후 : " + stringBuilder);
StringBuffer stringBuffer = new StringBuffer("Buffer");
System.out.println("StringBuffer 변경전 : " + stringBuffer);
stringBuffer.delete(2, 5); #Bur
stringBuffer.append("ABCD"); #BurABCD
stringBuffer.replace(0, 2, "X"); #XrABCD
System.out.println("StringBuffer 변경후 : " + stringBuffer);
StringBuilder 변경전 : Builder
StringBuilder 변경후 : XerABCD
StringBuffer 변경전 : Buffer
StringBuffer 변경후 : XrABCD
StringBuilder와 StringBuffer 클래스는 char형 배열로 문자열을 표현한다. 따라서 append(), delete(), replace() method는 클래스 안의 배열의 크기를 늘리거나 줄이고 인덱스를 사용해 문자열을 변경하는 방식으로 문자열을 변경한다.
만약 String 객체로 리턴이 필요하면 toString이라는 내부 method를 사용하여 리턴해주면 해결된다.
StringBuilder stringBuilder = new StringBuilder("Builder");
System.out.println("StringBuilder : " + stringBuilder.toString().getClass());
StringBuffer stringBuffer = new StringBuffer("Buffer");
System.out.println("StringBuffer : " + stringBuffer.toString().getClass());
StringBuilder : class java.lang.String
StringBuffer : class java.lang.String
StringBuilder와 StringBuffer의 차이점
- StringBuffer - Thread Safe 함 : 멀티 쓰레드 상황에서 안전하다, 동기화를 지원한다, synchronized가 append(), delete(), replace() StringBuffer 클래스 내부 method에 설정되어 있다.
- StringBuilder - Thread Safe 하지 않음 : 멀티 쓰레드 상황에서 안전하지 않다, 단일 쓰레드 상황에서 StringBuffer 보다 성능이 좋다, 동기화를 지원하지 않는다
- 멀티 쓰레드를 사용하는 상황에서 StringBuilder를 사용하면 여러 쓰레드에서 같은 변수, 값에 동시 접근을 하여 문제를 발생 시킬 수 있어 멀티 쓰레드 상황에서는 StringBuffer을 사용하는 것이 안전하다.
- 멀티 쓰레드 상황에서도 StringBuilder를 지역변수로 선언하여 쓰레드 별로 다른 객체를 사용한다면 사용을 하여도 무방하다.
- 작업이 확실하게 단일 쓰레드 환경에서 이루어 지거나 오류가 발생해도 상관이 없다면 StringBuilder를 사용하는 것이 StringBuffer를 사용하는 것보다 속도적 이점을 가지게 된다.
동기화란?
- 2개 이상의 쓰레드가 동일한 객체를 작업중일 때 한 쓰레드가 값을 변경하면 다른 쓰레드들이 엉뚱한 값으로 작업을 시도할 수 있기 때문에 쓰레드가 한 자원을 사용하려고 할 때 다른 쓰레드의 접근을 막는 것을 동기화라고 한다.
- 데이터의 무결성을 보장해 주기 위해서 사용하는 방식이다.
728x90
'주제 정리' 카테고리의 다른 글
[아키텍처]마이크로 서비스 (0) | 2021.08.19 |
---|---|
[JAVA] HashSet (0) | 2021.08.13 |
[JAVA] HashTable, HashMap (0) | 2021.08.12 |
Object 객체 탐구 (0) | 2021.08.07 |
디자인 패턴 23가지 (0) | 2021.08.07 |