본문 바로가기
Java의 정석/java.lang 패키지 & 유용한 클래스

StringBuffer 클래스 (문자열 저장 & 다루기)

by Hwanii_ 2023. 9. 1.
728x90
ch9 - 15 ~ 18

StringBuffer 클래스

 

ch9 - 15 StringBuffer 클래스 (문자열을 저장 & 다루기 위한 클래스)

- String 처럼 문자형 배열 (char[]) 을 내부적으로 가지고 있다.

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

- 그러나 String과 달리 내용을 변경 할 수 있다. (mutable)

StringBuffer sb = new StringBuffer("abc");

sb (0x100) ---> 'a' 'b' 'c' .. ( char[] )

sb.append("123");  //  sb의 내용 뒤에 "123" 을 추가. (내용 변경 가능)

sb(0x100) ---> 'a' 'b' 'c' '1' '2' '3' .. ( char[] )

 

ch9 - 16 StringBuffer의 생성자

- 배열은 길이 변경이 불가능 하다. 공간이 부족 하면 새로운 배열을 생성 해야 한다.
(immutable)

- StringBuffer는 처음 만들 때, 저장할 문자열의 길이를 고려 해서 적절한 크기로 생성 해야 한다.

public StringBuffer(int length) {   //  가능하면, 적절한 크기를 지정해주는게 좋다. (생성자)
    value = new char[length];
    shared = false;
}

public StringBuffer() { //  버퍼의 크기를 지정하지 않으면 버퍼의 크기는 기본값으로 16이 된다.
    this(16);
}

public StringBuffer(String str) {   //  지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성 한다.
    this(str.length() + 16);
    append(str);
}

만약에 "abc" 를 넣어주면 길이가 3이기 때문에, 3 + 16 = 19 길이 만큼의 char 배열이 생성 된다.

 

ch9 - 17 StringBuffer의 변경

- StringBuffer 는 String 과 달리 내용 변경이 가능 하다.

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

- append() 는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환 한다.

그 외에, delete(), insert(), ..  등의 메서드가 있고,
이 메서드 들의 반환타입은 StringBuffer 타입 이다.
즉, StringBuffer 자기 자신의 참조를 반환 한다.

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

하고,

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

하고 동일 하다.

왜냐하면,
sb.append("123") 이 결국 자기 자신의 참조를 반환 하기 때문에, 참조변수 sb 이기 때문 이다.

 

ch9 - 18 StringBuffer의 비교

- StringBuffer 클래스는 String 클래스와 다르게, equals() 메서드가 오버라이딩 되어 있지 않다.
즉, 주소 비교를 한다는 의미 이다.
(String 클래스는 오버라이딩이 이미 되어 있어서, 내용 (값) 을 비교 한다)

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");

위의 참조변수 sb와 sb2는 내용 (값) 이 "abc" 로 동일 하다.

하지만,
실제로 == 동등 비교 연산자를 사용 하거나,
또는,
equals() 메서드를 사용 하면,
모두 false 를 반환 하게 된다.

주소를 비교 하기 때문에 그런것이다.

- StringBuffer 클래스의 내용 (값) 을 비교 하려면 ???
StringBuffer 클래스를 String 으로 변환 하고, equals() 로 비교 하면 된다.

String s = sb.toString();   //  참조변수 sb를 String 으로 변환.
String s2 = sb2.toString(); //  참조변수 sb2를 String 으로 변환.

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

 

예시 01 )

 

class Ex9_11 {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("abc");
        StringBuffer sb2 = new StringBuffer("abc");

        System.out.println("sb == sb2 ? " + (sb == sb2));
        System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));

        // StringBuffer의 내용을 String으로 변환한다.
        String s = sb.toString();    // String s = new String(sb);와 같다.
        String s2 = sb2.toString();

        System.out.println("s.equals(s2) ? " + s.equals(s2));

    }

}

 

[ console ]

 

 

예시 02 )

 

class Ex9_12 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("01");
        StringBuffer sb2 = sb.append(23);
        sb.append('4').append(56);

        StringBuffer sb3 = sb.append(78);
        sb3.append(9.0);

        System.out.println("sb =" + sb);	//  0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)
        System.out.println("sb2=" + sb2);	// 0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)
        System.out.println("sb3=" + sb3);	// 0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)

 

[ console ]

 

반응형