Language/Java

StringBuffer클래스

JUNGKEUNG 2021. 10. 3. 22:39
반응형

StringBuffer란?


  • String처럼 문자열 배열(char[])을 내부적으로 가지고 있다
  • 그러나 String과 달리 내용을 변경할 수 있다.(mutable)
public final class StringBuffer implements java.io.Serializable {
	private char[] value;
		...
}
  • 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
  • 편집 중인 문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어진다.

참고 자료 : 자바의 정석

 

 

 

StringBuffer의 생성자


  • 배열의 길이 변경불가. 공간이 부족하면 새로운 배열 생성해야한다
  • StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야한다.
public StringBuffer(int length) {
	value = new char[length];
	shared = false;
}

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

 

 

 

StringBuffer의 변경


  • StringBuffer는 String과 달리 내용 변경이 가능하다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");  //sb의 내용 뒤에 "123"을 추가한다.
  • append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환

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

 

 

 

StringBuffer의 비교


  • StringBuffer는 equals()가 오버라이딩되어있지 않다.(주소비교)
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 =new StringBuffer("abc");

System.out.println(sb==sb2);        //false
System.out.println(sb.equals(sb2)); //fasle
  • StringBuffer을 String으로 변환 후에 equals()로 배교해야 한다.
String s = sb.toString();   //sb를 String으로 변환
String s2 = sb2.toString();

System.out.println(s.equals(s2)); //true
public class StringBufferEx1 {
    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 ));
    }
}

 

StringBuilder


  • StringBuffer는 동기화되어 있다. 멀티 쓰레드에 안전(thread-safe)
  • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하이럴 땐 StringBuffer대신 StringBuilder를 사용하면성능 향상된다.

 

 

참고자료


자바의 정석

'Language > Java' 카테고리의 다른 글

직렬화 역직렬화  (0) 2021.11.01
List, Set, Map  (0) 2021.10.10
java.lang패키지와 유용한 클래스  (0) 2021.10.03
예외 처리  (0) 2021.09.27
인터페이스  (0) 2021.09.26