ksouth9

java.lang 패키지(4) - StringBuffer클래스 본문

Java

java.lang 패키지(4) - StringBuffer클래스

ksouth9 2022. 3. 29. 22:56

StringBuffer클래스


String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 문자열을 추가하거나 변경이 가능하다.

  • 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.
  • String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스변수로 선언해 놓고 있다.
  • StringBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.

※Buffer란, 임시 저장 공간을 의미한다.

public final class StringBuffer implements java.io.Serializable {
    private char[] value;
    ...
}

StringBuffer 생성자

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);
}

StringBuffer인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다. 배열의 길이는 변경될 수 없으므로 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사해야 한다.

...
// 새로운 길이(newCapacity)의 배열을 생성한다. newCapacity는 정수값이다.
char newValue[] = new char[newCapacity];

// 배열 value의 내용을 배열 newValue로 복사한다.
System.arraycopy(value, 0, newValue, 0, count);	// count는 문자열의 길이
value = newValue;	// 새로 생성된 배열의 주소를 참조변수 value에 저장.

이렇게 함으로써 StringBuffer클래스의 인스턴스변수 value는 길이가 증가된 새로운 배열을 참조하게 된다.

 

StringBuffer의 변경

StringBuffer sb = new StringBuffer("abc");
sb.append("123");	// sb의 내용 뒤에 "123"을 추가한다.

append()는 반환타입이 StringBuffer인데 자신의 주소를 반환한다. 그래서 아래와 같은 문장이 수행되면, sb에 새로운 문자열이 추가되고 sb자신의 주소를 반환하여 sb2에는 sb의 주소가 저장된다.

StringBuffer sb2 = sb.append("ZZ");	// sb의 내용뒤에 "ZZ"를 추가한다.
System.out.println(sb);		// abc123ZZ
System.out.println(sb2);	// abc123ZZ

sb와 sb2가 모두 같은 StringBuffer인스턴스를 가리키고 있으므로 같은 내용이 출력된다. 그래서 하나의 StringBuffer인스턴스에 대해 아래와 같이 연속적으로 append()를 호출하는 것이 가능하다.

StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ");
/	sb	/

StringBuffer의 비교

String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만, StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 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

반면에 toString()은 equals()메서드가 오버라이딩되어 있어서 StringBuffer인스턴스에 toString()을 호출하면, 담고있는 문자열을 String으로 반환한다.

그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야한다.

String s = sb.toString();
String s2 = sb2.toString();

System.out.printlt(s.equals(s2));	// true

 

'Java' 카테고리의 다른 글

Math클래스  (0) 2022.03.30
StringBuffer클래스의 생성자와 메서드  (0) 2022.03.30
String클래스의 생성자와 메서드  (0) 2022.03.28
java.lang 패키지(3) - String클래스  (0) 2022.03.28
java.lang 패키지(2)  (0) 2022.03.27