Search

StringBuffer & StringBuilder 클래스

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의 비교

StringBufferequals()오버라이딩 하지 않아서, 등가비교연산자 ==와 같은 결과를 얻음.
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의 등장
StringBufferStringBuilder로만 바꾸면 똑같이 사용 가능
StringBuilder sb; sb = new StringBuilder(); sb.append("abc");
Java
StrintgBuffer도 충분히 좋기에, 성능 향상이 반드시 필요한 경우가 아니면 굳이 바꿀 필욘 X

참고 자료