티스토리 뷰
StringBuffer Class
◎ Define
- StringBuffer Class는 String Class와 상반 되는 개념을 가지고 있다. String Class가 불변 객체이지만, StringBuffer Class는
가변 객체이다. 보통 자바 프로그램 내에서 문자열을 다룰(추가, 변경) 때 사용하며, 객체의 크기가 동적이다. 객체 생성 시 크기를
지정하지 않아도 기본적으로 16개의 문자를 저장할 수 있는 공간을 가진다.
- String은 가볍다, 하지만 불변 객체이다. StringBuffer는 String에 비해 무겁다, 하지만 가변 객체이다. (Explanation ① 참조)
◎ StringBuffer Class Constructor
Constructor | Brief description |
StringBuffer() | 초기 문자열이 없고 16개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성 |
StringBuffer(String str) | str의 문자열을 가지고 16개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성 |
StringBuffer(int length) | 초기 문자열이 없고 length개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성 |
◎ StringBuffer Class Method
Method | Brief description |
void append(data) | 전달된 데이터를 현재 문자열 끝에 추가한다. |
int capacity() | 현재 문자열의 총 용량 반환 |
char charAt(int index) | 전달된 데이터 위치의 문자를 반환 |
delete(int start, int end) | 전달된 start부터 end전 까지의 문자를 제거 |
delete(int index) | 전달된 데이터 위치의 문자를 제거 |
int indexOf(String str) | 해당 문자열에서 전달된 문자열과 일치하는 곳의 위치를 반환 |
int indexOf (String str, int fromIndex) | 해당 문자열에서 전달된 fromIndex부터 전달된 문자열과 일치하는 곳의 위치를 반환 |
void insert(int offset, data) | 전달된 offset 위치에 전달된 data를 삽입 |
int lastIndexOf(String str) | 전달된 str의 마지막 index 위치를 반환 |
int lastIndexOf (String str, int fromIndex) | 해당 문자열에서 전달된 fromIndex부터 전달된 str의 마지막 index 위치를 반환 |
int length() | 해당 문자열의 문자 개수를 반환 |
StringBuffer replace (int start, int end, String str) | 전달된 start에서 end까지의 문자열을 전달된 str 문자열로 대체하여 반환 |
StringBuffer reverse() | 해당 문자열을 역순으로 된 문자열로 반환 |
void setCharAt(int index, char ch) | 해당 문자열에서 전달된 index 위치의 문자를 전달된 ch로 변환 |
void setLength(int newLength) | 해당 문자열의 Buffer 크기를 설정 |
String substring(int start) | 해당 문자열에서 전달받은 start 위치부터 마지막까지의 문자열을 반환 |
String substring(int start, int end) | 해당 문자열에서 전달받은 start 위치부터 end 위치까지의 문자열을 반환 |
String toString() | StringBuffer형인 문자열을 String형으로 변환 |
◎ Explanation
① StringBuffer Class와 String Class의 차이점에 대해서 알아보자.
참조)
1. 만약 문자열 추가나 변경 등의 작업이 많을 경우에는 StringBuffer를 사용하는 게 유리하고, 반대로 작업이 거의 없는 경우에 String을 사용하는 게 유리하다.
2. StringBuffer Class는 가변 객체이고, String Class는 불변 객체이다.
보통 초보 프로그래머의 입장에서는 해당 두 Class의 차이점에 대해 숙지를 하지 못 하고 있는 것이 대부분이다.
정확히 어떤 차이가 있는지 알아보자.
1. String을 불변 객체라고 말 하지만, 그렇다고 해서 String을 사용 했을 때 원하는 결과를 얻지 못 하는 것은 아니다.
밑에 예제를 보면서 이해 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class StringBufferClass { public static void main(String[] args) { String str = ""; str += "this"; str += " "; str += "is String"; System.out.println(str); // result : this is String StringBuffer sb = new StringBuffer(); sb.append("this"); sb.append(" "); sb.append("is String"); System.out.println(sb.toString()); // result : this is String } } |
StringBuffer, String 모두 출력 값이 같은 걸 볼 수 있다. 즉, 위에서 말 했던 것처럼 결과를 얻지 못 하는 건 아니다.
그럼 무엇이 문제가 되는 걸까?
객체가 생성 되고 메모리가 사용 되는 과정이 다르다.
(Line 4~7) String 자료형에 + 연산이 있을 때마다 있던 객체는 GC(Garbage Collection) 되고 새로운 String 객체가 생성된다. (변경이 불가능한 불변 객체이기 때문이다.)
(Line 11) StringBuffer 객체를 생성 한 후
(Line 12~14) append() method를 이용해 문자열을 추가/변경 한다. 객체는 (Line 11)에서 단 한 번만 생성이 된다. (변경이 가능한 가변 객체이기 때문이다.)
크게 와닿지 않을 수도 있겠지만, 만약 프로그램상 수도 없이 많은 문자열 값이 추가/변경 된다고 가정 해보자.
이런 경우에 String을 사용한다면 그 수도 없는 추가/변경 작업을 할 때마다 있던 객체는 계속해서 GC 되고 새로운 객체를 생성 할 것이다.
GC가 많이 이루어진다는 것 자체가 그만큼 프로그램이 무거워지고 느려지게 하는 요인이 된다.
따라서 개발자가 프로그래밍을 할 때 어떤 도구를 사용해야 할지 충분히 심사숙고 후 결정 하는 게
한층 더 Restful한 개발자가 되는 길이라고 할 수 있겠다.
'Java > Class' 카테고리의 다른 글
| [java.lang] Wrapper (0) | 2018.01.05 |
|---|---|
| [java.lang] Math (0) | 2018.01.05 |
| [java.lang] StringBuilder (0) | 2018.01.04 |
| [java.lang] String (0) | 2018.01.03 |
| [java.lang] Obejct (0) | 2018.01.03 |
