Java에서 문자열을 다룰 때 String을 주로 사용하게 된다. 하지만 String은 새로운 값을 할당할 때마다 새로운 주소 값이 생성되어 할당된다. 이 때문에 String 값이 계속해서 변하게 되면 새로운 String의 주소 값들이 Stack에 쌓이게 되고 이는 Garbage Collector가 돌기 전까지 메모리에 쌓이게 되기 된다.
따라서 계속해서 문자열을 변경하는 경우에는 값을 메모리에 append 하는 방식인 StringBuffer와 StringBuilder를 사용하는 것이 좋다.
1. StringBuffer, StringBuilder
기본적으로 StringBuffer와 StringBuilder의 사용법은 동일하다. 둘의 가장 큰 차이점은 StringBuilder는 멀티 스레드 환경에서 안전하지 않고 (동기화를 지원하지 않음), StringBuffer는 동기화를 지원하기 때문에 thread-safe 하다. (동기화 지원)
The StringBuilder class should generally be used in preference to this one, as it supports all of the same operations but it is faster, as it performs no synchronization.
Java api에서도 StringBuilder는 동기화를 지원하지 않지만 가장 빠르다고 설명되어있다. 따라서 동기화를 지원해야 하는 상황이 아니면 StringBuilder를 사용하는 것이 가장 좋은 성능을 기대할 수 있다. Web이나 소켓 환경에서는 StringBuffer를 사용하는 것이 안전하다.
2. StringBuffer, StringBuilder의 메소드
Modifier and Type | Method and Description |
---|---|
StringBuffer || StringBuilder | append() 문자열 뒤에 문자열을 추가한다. |
StringBuffer || StringBuilder | appendCodePoint(int codePoint) 해당 아스키코드의 character를 추가한다. |
int | capacity() 현재 용량(버퍼 사이즈)를 반환한다. |
char | charAt(int index) index에 있는 character를 반환한다. |
int | codePointAt(int index) index에 있는 character의 코드 포인트를 반환한다. |
int | codePointBefore(int index) index 바로 앞에 있는 character의 코드 포인트를 반환한다. |
int | codePointCount(int beginIndex, int endIndex) |
StringBuffer || StringBuilder | delete(int start, int end) start부터 end 범위의 문자열을 삭제한다. |
StringBuffer || StringBuilder | deleteCharAt(int index) index에 있는 character를 삭제한다. |
void | ensureCapacity(int minimumCapacity) 최소 용량을 설정한다. |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) srcBegin부터 srcEnd까지의 문자를 dst의 dstBegin부터 시작해 복사한다. |
int | indexOf(String str) 처음으로 나타나는 str의 위치를 반환한다. |
int | indexOf(String str, int fromIndex) fromIndex부터 시작하여 str이 처음 나타나는 위치를 반환한다. |
StringBuffer || StringBuilder | insert(int offset, Any) offset에 문자열을 추가한다. |
int | lastIndexOf(String str) 마지막으로 나타나는 str의 위치를 반환한다. |
int | lastIndexOf(String str, int fromIndex) fromIndex부터 시작하여 str이 마지막으로 나타나는 위치를 반환한다. |
int | length() 길이를 반환한다. |
int | offsetByCodePoints(int index, int codePointOffset) |
StringBuffer || StringBuilder | replace(int start, int end, String str) start부터 end까지를 str으로 변경한다. |
StringBuffer || StringBuilder | reverse() 순서를 거꾸로 변환하여 반환환다. |
void | setCharAt(int index, char ch) index의 character를 ch로 바꾼다. |
void | setLength(int newLength) 길이를 지정한다. |
CharSequence | subSequence(int start, int end) start부터 end까지로 CharSequence를 생성한다. |
String | substring(int start) start부터 서브 스트링을 생성한다. |
String | substring(int start, int end) start부터 end까지의 서브 스트링을 생성한다. |
String | toString() String으로 변환하여 반환한다. |
void | trimToSize() 버퍼의 크기를 적당한 크기로 줄인다. |