[기본 개념] 4 | (1.4) StringBuffer클래스, StringBuilder 클래스의 메서드

728x90

[기본 개념] 4 | (1.4) StringBuffer클래스, StringBuilder 클래스의 메서드

1 Object클래스

2 String클래스

3> StringBuffer클래스와 StringBuilder클래스

4 Math클래스

5 래퍼(wrapper)클래스

3. StringBuffer클래스와 StringBuilder클래스

 String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.

 

 이때, 수정 작업이 추가로 수행되지 않도록 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.

 

 StringBuffer클래스는 String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스변수로 선언해놓고 있다. StringBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이때 생성된 char형 배열을 인스턴스변수 value가 참조한다.

 

public final class StringBuffer implements java.io.Serializable {

        private char[ ] value ;

                . . .

}

 

StringBuffer의 생성자

 StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간으로 사용된다.

 

 이때 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 버퍼를 생성한다. 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다. 배열의 길이는 변경될 수 없으므로 새로운 길이의 배열을 생성한 후 이전 값을 복사해야 한다.

 

StringBuffer의 변경

StringBuffer는 내용을 변경할 수 있다. 아래와 같이 StringBuffer를 생성해보자

 

         StringBuffer sb = new StringBuffer("abc") ;

 

그리고 sb에 문자열 "123"을 추가하면, 

 

        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인스턴스를 가리키고 있으므로 같은 내용이 출력되고, 연속적으로 append( )를 호출하는 것이 가능하다.

 

StringBuffer의 비교

 StringBuffer클래스는 String클래스와는 달리 equals메서드를 오버라이딩하지 않아서 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.

 

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

 

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

 

        StringBuffer sb     = new StringBuffer("abc") ;

        StringBuffer sb2  = new StringBuffer("abc") ;

 

        String s     = sb.toString( ) ;

        String s2  = sb2.toString( ) ;

 

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

 

StringBuffer클래스의 생성자와 메서드

 String클래스와 유사한 메서드를 많이 가지고 있고 추가, 변경, 삭제와 같이 저장된 내용을 변경할 수 있는 메서드들이 추가로 제공된다.

 

메서드 / 설명 예제 / 결과
StringBuffer( ) StringBuffer sb = new StringBuffer( ) ;
16문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성한다. sb = ""
StringBuffer(int length) StringBuffer sb = new StringBuffer(10) ;
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성한다. sb = ""
StringBuffer(String str) StringBuffer sb = new StringBuffer("Hi") ;
지정된 문자열 값(str)을 갖는 StringBuffer인스턴스를 생성한다. sb = "Hi"
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 sb = new StringBuffer("abc") ;
StringBuffer sb2 = sb.append(true) ;
sb.append('d').append(10.0f) ;
StringBuffer sb3 = sb.append("ABC").append(123) ;
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다. sb = "abctrued10.0ABC123"
sb2 = "abctrued10.0ABC123"
sb3 = "abctrued10.0ABC123"
int capacity( ) StringBuffer sb = new StringBuffer(100) ;
sb.append("abcd") ;
int bufferSize = sb.capacity( ) ;
int stringSize = sb.length( ) ;
StringBuffer인스턴스의 버퍼의 크기를 알려준다.
length( )는 버퍼에 담긴 문자열의 길이를 알려준다.
bufferSize = 100
stringSize = 4
(sb에 담긴 문자열이 "abcd"이므로)
char charAt(int index) StringBuffer sb = new StringBuffer("abc") ;
char c = sb.charAt(2) ;
지정된 위치(index)에 있는 문자를 반환한다. c = 'c'
StringBuffer delete(int start, int end) StringBuffer sb = new StringBuffer("0123456") ;
StringBuffer sb2 = sb.delete(3, 6) ;
시작위치(start)부터 끝위치(end)사이에 있는 문자를 제거한다.
단, 끝위치의 문자는 제외한다.
sb = "0126"
sb2 = "0126"
StringBuffer deleteCharAt(int index) StringBuffer sb = new StringBuffer("0123456") ;
sb.deleteCharAt(3) ;
지정된 위치(index)의 문자를 제거한다. sb = "012456"
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)

StringBuffer sb = new StringBuuffer("0123456") ;
sb.insert(4, '.') ;
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. sb = "0123.456"
int length( ) StringBuffer sb = new StringBuffer("0123456") ;
int length = sb.length( ) ;
StringBuffer인스턴스에 저장되어 있는 문자열의 길이를 반환한다. length = 7
StringBuffer replace(int start, int end, String str) StringBuffer sb = new StringBuffer("0123456") ;
sb.replace(3, 6, "AB") ;
지정된 범위(start ~ end)의 문자들을 주어진 문자열로 바꾼다.
end위치의 문자는 범위에 포함되지 않음
sb = "012AB6"
("345"를 "AB"로 바꿨다.)
StringBuffer reverse( ) StringBuffer sb = new StringBuffer("0123456") ;
sb.reverse( ) ;
StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다. sb ="6543210"
void setCharAt(int index, char ch) StringBuffer sb = new StringBuffer("0123456") ;
sb.setCharAt(5, 'o') ;
저장된 위치의 문자를 주어진 문자(ch)로 바꾼다. sb = "01234o6"
void setLength(int newLength) StringBuffer sb = new StringBuffer("0123456")) ;
sb.setLength(5) ;
StringBuffer sb2 = new StringBuffer("0123456") ;
sb2.setLength(10) ;
String str = sb2.toString( ).trim( ) ;
지정된 길이로 문자열의 길이를 변경한다.
길이를 늘리는 경우에 나머지 빈 공간을 널문자'\u0000'로 채운다
sb = "01234"
sb2 = "0123456   "
str = "0123456"
String toString( ) StringBuffer sb = new StringBuffer("0123456") ;
String str = sb.toString( ) ;
StringBuffer인스턴스의 문자열을 String으로 반환한다. str = "0123456"
String substring(int start)
String substring(int start, int end)
StringBuffer sb = new StringBuffer("0123456") ;
String str = sb.substring(3) ;
String str2 = sb.substring(3, 5) ;
지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.
시작위치(start)만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환한다.
str = "3456"
str2 = "34"

 

StringBuilder란?

 StringBuffer는 멀티쓰레드에 안전(thread sate)하도록 동기화되어있는데 이는 성능을 떨어뜨린다고 이해하면 된다. 그래서 동기화만 뺀 것이 StringBuilder이다.

 

 기능은 StringBuffer와 StringBuilder가 완전히 똑같다. 그래서 소스코드에 StringBuffer대신 StringBuilder를 사용하기만 하면 된다.

 


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

<---->
    StringBuilder sb ;
    sb = new StringBuilder( ) ;
    sb = append("abc") ;

 

StringBuffer도 충분히 성능이 좋기 때문에 굳이 바꿀 필요는 없다.

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90