개발 공부/Java & Spring

8. StringBuffer 클래스와 StringBuilder 클래스

빵다희 2022. 12. 6. 00:14
StringBuffer 클래스
- StringBuffer 클래스는 String클래스와는 다르게 인스턴스를 생성할 때 지정된 문자열을 변경 할 수 있다.
- 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며 인스턴스를 생성할때 그 크기를 지정할 수 있다.
- StringBuffer 클래스는 인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.
StringBuffer의 생성자
-StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
- 인스턴스 생성시, 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.(length 16)
- 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때에는  내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.( 작업내용 : 새 길이의 배열을 생성한 후, 이전 배열의 값을 복사한다.) 그러므로 StringBuffer인스턴스를 생성할 때에는 인스턴스에 저장될 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.
public StringBuffer(){
 /* 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다. */	
    this(16); 
}

public StringBuffer(int length){
	value = new char[length];
    shared = false;
}

public StringBuffer(String str){
  /* 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다. */
	this(str.length() + 16);
    append(str);
}
StringBuffer 값의 변경 과정
/* stringbuffer 인스턴스 생성 */
StringBuffer sb = new StringBuffer("abc");

 

sb의 구조

/* sb에 문자열 추가 */
sb.append("123"); // sb의 내용 뒤에 "123"을 추가한다.

문자열 추가된 sb

/* append()는 return타입이 stringbuffer인데 자신의 주소를 반환한다. */
/* 그래서 sb에 새로운 문자열이 추가되고 sb자신의 주소를 반환하여 sb2에는 sb의 주소인 0x100이 저장된다.*/
StringBuffer sb2 = sb.append("zz"); // sb의 내용뒤에 "zz"를 추가한다.

/* 하나의 StringBuffer인스턴스에 대해 아래와 같이 연속적으로 append()를 호출하는 것이 가능하다 */

StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("zz");
StringBuffer의 비교
- StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
-toString()은 오버라이딩 되어있기때문에 StringBuffer인스턴스에 담긴 문자열을 비교 하려면
StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 그것에 equals메서드를 사용해야한다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");

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

sb == sb2  /* false */
sb.equals(sb2) /* false */
s.equals(s2) /* true */
StringBuffer클래스의 메서드
메서드 설명
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인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
int capacity() StringBuffer인스턴스의 버퍼크기를 알려준다. 
char charAt(int index) 지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer delete(int start, int end) 시작위치(start)부터 끝 위치(end) 사이에 있는 문자를 제거한다.
StringBuffer deleteCharAt(int index) 지정된 위치(index)의 문자를 제거한다.
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)
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다.
pos는 0부터 시작
int length() StringBuffer인스턴스에 저장되어 있는 문자열의 길이를 반환한다.
StringBuffer replace (int start, int end, String str) 지정된 범위(star~end)의 문자들을 주어진 문자열로 바꾼다.
end위치의 문자는 범위에 포함 되지 않음. (star <= x < end)
StringBuffer reverse() StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
void setCharAt(int index, char ch) 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다.
void setLength(int newLength) 지정된 길이로 문자열의 길이를 변경한다. 길이를 늘리는 경우에 나머지 빈 공간을 널문자 '\u0000'로 채운다.
String toString() StringBuffer인스턴스의 문자열을 String으로 변환
String substring (int start)
String substring (int start, int end)
지정된 범위 내에 문자열을 String으로 뽑아서 반환한다. 
시작위치(start)만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환한다.
StringBuilder란? 
- StringBuffer는 멀티쓰레드에 안전(thread safe)하도록 동기화되어있다. 동기화는 StringBuffer의 성능을 떨어트린다.
- 그래서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트린다.
- 그 결과 새로 추가된 것이 StringBuffer에서 쓰레드의 동기화만 뺀, StringBuilder이다. 
- StringBuilder는 동기화를 제외하면 StringBuffer와 완전히 똑같은 기능으로 작성되어 있다. 
728x90
반응형

'개발 공부 > Java & Spring' 카테고리의 다른 글

10. 래퍼 클래스(wrapper 클래스)  (0) 2022.12.07
9. Math클래스  (0) 2022.12.06
7. 예외처리(exception handling)  (0) 2022.11.12
6. 내부 클래스(inner class)  (1) 2022.11.06
5. 제어자(modifier)  (0) 2022.10.24