java.lang 패키지
자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다.
Class StringBuffer
내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있다.
StringBuffer 인스턴스를 생성할 때 그 크기를 지정할 수 있다.
편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아줘야 한다.
문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업을 추가해줘야 하기 때문에 작업효율이 떨어진다.
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Appendable, CharSequence {
...
}
생성자
인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되어 문자열을 저장하고 편집하기 위한 공간으로 사용된다.
abstract class AbstractStringBuilder implements CharSequence {
char[] value;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
...
}
public final class StringBuffer ... {
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
...
}
버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.
배열의 길이를 변경하고 싶은 때는 새로운 길이의 배열을 생성하여 이전 배열의 값을 복사해야 한다.
append()
반환 타입이 StringBuffer로, 자신의 주소를 반환한다.
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
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 sb1 = new StringBuffer("si vis");
sb1.append(" amari, ");
StringBuffer sb2 = sb1.append("ama");
- StringBuffer sb1 = new StringBuffer("si vis");
sb1 | 0x100 |
---|---|
0x100 | si vis |
- sb1.append(" amari, ");
sb1 | 0x100 |
---|---|
0x100 | si vis amari, |
- StringBuffer sb2 = sb1.append("ama");
sb1 | sb2 | 0x100 |
---|---|---|
0x100 | 0x100 | si vis amari, ama |
비교
equals 메서드를 오버라이딩하지 않아서 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
StringBuffer sb1 = new StringBuffer("love");
StringBuffer sb2 = new StringBuffer("love");
System.out.println((sb1 == sb2)); // false
System.out.println(sb1.equals(sb2)); // false
toString()은 오버라이딩 되어 있어서 담고 있는 문자열을 String으로 반환한다.
StringBuffer 인스턴스에 담긴 문자열을 비교하기 위해서는 toString()으로 String 인스턴스를 얻어야 한다.
String s1 = sb1.toString();
String s2 = sb2.toString();
System.out.println(s1.equals(s2)); // true
StringBuffer()
16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
StringBuffer sb = new StringBuffer();
StringBuffer(int capacity)
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
StringBuffer sb = new StringBuffer(5);
StringBuffer(String str)
지정된 문자열 값을 갖는 StringBuffer 인스턴스를 생성한다.
StringBuffer sb = new StringBuffer("love");
int capacity()
StringBuffer 인스턴스의 버퍼 크기를 알려준다.
StringBuffer sb = new StringBuffer(10);
int sbSize = sb.capacity(); // 10
char charAt(int index)
지정된 위치에 있는 문자를 반환한다.
StringBuffer sb = new StringBuffer("love");
char c = sb.charAt(3); // 'e'
StringBuffer delete(int start, int end)
시작 위치부터 끝 위치 사이에 있는 문자를 제거한다.
끝 위치의 문자는 제외된다.
StringBuffer sb = new StringBuffer("dico.me_StringBuffer");
sb.delete(10, 17); // "dico.me_Stfer"
insert()
StringBuffer insert(int offset, boolean b)
StringBuffer insert(int offset, char c)
StringBuffer insert(int offset, char[] str)
StringBuffer insert(int offset, double d)
StringBuffer insert(int offset, float f)
StringBuffer insert(int offset, int i)
StringBuffer insert(int offset, long l)
StringBuffer insert(int offset, Object obj)
StringBuffer insert(int offset, String str)
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(offset. 0~)에 추가한다.
StringBuffer sb = new StringBuffer("dico.me");
sb.insert(5, "java."); // "dico.java.me"
int length()
StringBuffer 인스턴스에 저장되어 있는 문자열의 길이를 반환한다.
StringBuffer sb = new StringBuffer("dico.me");
int length = sb.length(); // 7
StringBuffer replace(int start, int end, String str)
지정된 범위의 문자들을 주어진 문자열로 바꾼다.
범위 끝 위치의 문자는 포함되지 않는다. (start <= x < end)
StringBuffer sb = new StringBuffer("dico.me");
sb.replace(0, 3, "lif"); // "lifo.me"
StringBuffer reverse()
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
StringBuffer sb = new StringBuffer("dico.me");
sb.reverse(); // "em.ocid"
void setCharAt(int index, char ch)
지정된 위치의 문자를 주어진 문자로 바꾼다.
StringBuffer sb = new StringBuffer("dico.me");
sb.setCharAt(0, 'L'); // "Lico.me"
void setLength(int newLength)
지정된 길이로 문자열의 길이를 변경한다.
길이를 늘리는 경우, 나머지 빈 공간을 널문자 \u0000로 채운다.
StringBuffer sb = new StringBuffer("love");
sb.setLength(10); // "love "
sb.setLength(2); // "lo"
toString()
StringBuffer 인스턴스의 문자열을 String으로 반환한다.
StringBuffer sb = new StringBuffer("love");
String str = sb.toString();
String substring(int start)
String substring(int start, int end)
지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.
시작 위치만 지정하면 시작 위치부터 문자열 끝까지 뽑아서 반환한다.
StringBuffer sb = new StringBuffer("lovefields");
String str2 = sb.substring(2); // vefields
String str1 = sb.substring(2, 5); // vef
StringBuilder 클래스
StringBuffer에서 쓰레드의 동기화만 모아둔 클래스.
멀티 쓰레드에 안전(thread safe)하도록 동기화되어 있다.
멀티 쓰레드로 작성된 프로그램이 아닌 경우, 동기화는 StringBuffer의 성능을 떨어트린다.
StringBuffer와 완전히 똑같은 기능으로 작성되어 있다.
StringBuffer buffer = new StringBuffer();
buffer.append("love");
StringBuilder builder = new StringBuilder();
builder.append("love");
StringBuffer도 충분이 성능이 좋기 때문에 성능 향상이 반드시 필요한 경우에만 사용된다.
참고 서적: 자바의 정석 3판