StringBuffer 클래스
•
String 클래스와 달리, 인스턴스를 생성할 때 지정된 문자열을 추후 변경 가능
◦
내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며,
StringBuffer 인스턴스 생성 시, 그 크기 지정 가능
◦
버퍼의 길이를 늘리는 작업은 효율을 떨어트리므로, 처음부터 크기를 넉넉히 잡자!
•
String 클래스와 유사한 점
◦
문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴수 변수로 선언
▪
StringBuffer 인스턴스가 생성될 때, char형 배열이 생성되며,
이 떄 생성된 char형 배열을 인스턴스 변수 value가 참조
public final class StringBuffer implements java.io.Serializable {
private char[] value;
...
}
Java
StringBuffer의 생성자
•
StringBuffer클래스의 인스턴스 생성 시, 적절한 길이의 char형배열이 생성되고,
이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용됨.
◦
생성자 StringBuffer(int length)를 사용해서
StringBuffer 인스턴스에 저장된 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정
◦
따로 지정하지 않으면 디폴트 크기(16개의 문자 저장 가능)로 버퍼 생성
public StringBuffer(int length) {
value = new char[length];
shared = false;
}
public StringBuffer() {
this(16); // 버퍼 크기를 따로 지정하지 않으면 크기는 16으로
}
public StringBuffer(String str) {
this(str.length() + 16); // 지정한 문자열의 길이보다 16 더 크게 버퍼 생성
append(str);
}
Java
•
Buffer의 크기를 변경하고 싶을 때
◦
배열의 길이는 변경 불가하므로, 새로운 길이의 배열을 생성 후 이전 배열 값을 복사
// 새로운 길이(newCapacity)의 배열 생성. 정수값
char newValue[] = new char[newCapacity];
// 배열 value의 내용을 newValue로 복사
System.arraycopy(value, 0, newValue, 0, count); // count는 문자열의 길이
value = newValue; // 새로 생성된 배열의 주소를 참조변수 value에 저장
Java
StringBuffer의 변경
•
String과 달리 StringBuffer는 내용 변경 가능
StringBuffer sb = new StringBuffer("abc");
sb.append("123"); // sb 내용 뒤에 "123" 추가
// sb 주소를 sb2 저장
StringBuffer sb2 = sb.append("ZZ"); // sb 내용 뒤에 "ZZ" 추가
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ
Java
•
하나의 StringBuffer 인스턴스에 연속적인 append() 호출도 가능
StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ"); // append()의 반환타입이 void가 아니기 때문에 가능
Java
StringBuffer의 비교
•
StringBuffer의 equals()를 오버라이딩 하지 않아서, 등가비교연산자 ==와 같은 결과를 얻음.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb==sb2); // false
System.out.println(sb.equals(sb2)); // false
Java
•
toString()은 오버라이딩되어 있어서, 담고 있는 문자열을 String으로 반환
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
Java
StringBufferEx1.java
StringBuffer 클래스의 생성자와 메소드
•
StringBuffer() : 16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer(); // sb = ""
Java
•
StringBuffer(int length) : 지정된 개수의 문자를 담을 수 있는 버퍼를 가진
StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer(10); // sb = ""
Java
•
StringBuffer(String str) : 지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer("Hello"); // sb = "Hello"
Java
•
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str) :
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열 뒤에 덧붙임.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.append(true);
sb.append('d').append(10.0f);
StringBuffer sb3 = sb.append("ABC")
.append(123);
// sb = "abctrued10.0ABC123"
// sb2 = "abctrued10.0ABC123"
// sb3 = "abctrued10.0ABC123"
Java
•
int capacity() : StringBuffer 인스턴스의 버퍼 크기를 알려줌.
length()는 버퍼에 담긴 문자열의 길이를 알려줌.
StringBuffer sb = new StringBuffer(100);
sb.append("abcd");
int bufferSize = sb.capacity(); // bufferSize = 100
int stringSize = sb.length(); // stringSize = 4
Java
•
char charAt(int index) : 지정된 위치(index)에 있는 문자 반환
StringBuffer sb = new StringBuffer("abc");
char c = sb.charAt(2); // c='c'
Java
•
StringBuffer delete(int start, int end) : 시작 위치(start)부터 끝 위치(end) 사이의 문자 제거
(끝 위치의 문자는 제외)
StringBuffer sb = new StringBuffer("0123456");
StringBuffer sb2 = sb.delete(3, 6);
// sb = "0126"
// sb2 = "0126"
Java
•
StringBuffer delete(int index) : 지정된 위치(index)의 문자 제거
StringBuffer sb = new StringBuffer("0123456");
sb.deleteCharAt(3); // sb = "012456"
Java
•
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[] str)
StringBuffer insert(int pos, double d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str) :
두 번쨰 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가. pos는 0부터 시작
StringBuffer sb = new StringBuffer("0123456"):
sb.insert(4, '.');
Java
•
int length() : StringBuffer에 저장되어 있는 문자열의 길이 반환
StringBuffer sb = new StringBuffer("0123456");
int length = sb.length(); // length = 7
Java
•
StringBuffer replace(int start, int end, String str) :
지정된 범위(start~end)의 문자들을 주어진 문자열로 바꿈.
end 위치의 문자는 범위에 포함되지 않음 (start ≤ x < end)
StringBuffer sb = new StringBuffer("0123456");
sb.replace(3, 6, "AB"); // sb = "012AB6"
Java
•
StringBuffer reverse() : StringBuffer 인스턴스에 저장되어 있는 문자열 순서를 거꾸로 나열
StringBuffer sb = new StringBuffer("0123456");
sb.reverse(); // sb = "6543210"
Java
•
void setCharAt(int index, char ch) : 지정된 위치의 문자를 주어진 문자(ch)로 변경
StringBuffer sb = new StringBuffer("0123456");
sb.setCharAt(5, 'o'); // sb = "01234o6"
Java
•
void setLength(int newLength) : 지정된 길이로 문자열의 길이 변경
길이를 늘리는 경우 나머지 빈 공간은 널문자 \u0000로 채움
StringBuffer sb = new StringBuffer("0123456");
sb.setLength(5); // sb = "01234"
StringBuffer sb2 = new StringBuffer("0123456");
sb.setLength(10); // sb = "0123456 "
String str = sb2.toString().trim(); // sb = "0123456"
Java
•
String toString() : StringBuffer 인스턴스의 문자열을 String으로 반환
StringBuffer sb = new StringBuffer("0123456");
String str = sb.toString(); // str = "0123456"
Java
•
String substring(int start, int end) : 지정된 범위 내의 문자열을 String으로 뽑아서 반환
String substring(int start) : 시작 위치(start)만 지정하면 시작 위치부터 문자열 끝까지 반환
StringBuffer sb = new StringBuffer("0123456");
String str = sb.substring(3, 5); // str= = "34"
String str2 = sb.substring(3); // str = "3456"
Java
StringBufferEx2.java
StringBuilder 클래스
•
StringBuffer 클래스는 멀티쓰레드에 안전하도록 동기화되어 있는데,
멀티쓰레드로 작성된 프로그램이 아닌 경우 StringBuffer 동기화는 성능만 떨어트릴 뿐 불필요
→ 멀티쓰레드 동기화만 뺸 StringBuilder의 등장
•
StringBuffer를 StringBuilder로만 바꾸면 똑같이 사용 가능
StringBuilder sb;
sb = new StringBuilder();
sb.append("abc");
Java
•
StrintgBuffer도 충분히 좋기에, 성능 향상이 반드시 필요한 경우가 아니면 굳이 바꿀 필욘 X