본문

StringBuffer Class

반응형

# StringBuffer Class


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

내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.

이 때, 편집할 문자열의 크기를 고려하여 버퍼의 크기를 고려하여 버퍼의 크기를 충분히 잡아주는 것이 좋다. 

편집 중인 문자열이 버퍼의 크기를 넘어서게 되면 버퍼의 크기를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어진다.

(StringBuffer인스턴스를 생성할 때, 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.)


아래의 코드는 StringBuffer클래스의 일부인데, 버퍼의 크기를 변경하는 내용의 코드이다. 

StringBuffer인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 크기보다 작을 때는
내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.

배열의 크기는 변경될 수 없으므로, 새로운 크기의 배열을 생성한 후에 이전 배열의 값을 복사한다.


1
2
3
4
5
6
7
...
// 새로운 크기(newCapacity)의 배열을 생성한다. newCapacity는 정수값이다.
char newValue[] = new char[newCapacity];
 
// 배열 value의 내용을 배열 newValue로 복사한다.
System.arraycopy(value, 0, newValue, 0, count);    // count는 문자열의 길이
value = newValue;                                         // 새로 생성된 배열의 주소를 참조변수 value에 저장.
cs


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



# StringBuffer 인스턴스 비교

String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만,
StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.

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


그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서

StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equlas메서드를 사용해서 비교해야한다.


Source01) stringBufferEx01 .java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package stringBufferEx;
 
public class stringBufferEx01 {
 
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        StringBuffer sb2 = new StringBuffer("abc");
 
        // false
        if (sb1 == sb2) {
            System.out.println("sb1 == sb2 ? true");
        } else {
            System.out.println("sb1 == sb2 ? false");
        }
 
        // false
        if (sb1.equals(sb2)) {
            System.out.println("sb1.equals(sb2) ? true");
        } else {
            System.out.println("sb1.equals(sb2) ? flase");
        }
 
        // StringBuffer의 내용을 String으로 변환한다.
        String s1 = sb1.toString(); // String s1 = new String(sb1);와 같다.
        String s2 = sb2.toString();
 
        // true
        if (s1.equals(s2)) {
            System.out.println("s1.equals(s2) ? true");
        } else {
            System.out.println("s1.equals(s2) ? false");
        }
    }
}
cs


Result)
1
2
3
sb1 == sb2 ? false
sb1 == sb2 ? flase
s1.equals(s2) ? true
cs



출처 및 참고자료 : JAVA의정석(남궁성 저)

반응형

공유

댓글