본문 바로가기

Java

StringBuilder 클래스

java.lang.StringBuilder 클래스

객체 내부에 있는 버퍼에 문자열 내용을 담아두고 거기서 조작을 하기 때문에
String 클래스 처럼 많은 객체를 생성하지 않고도 문자열을 처리 할 수 있다. 즉, 성능의 관점에서 봤을 때 매우 효율적인 문자열 처리 클래스이다. 이전에 사용되었던 StringBuffer와 비교하여 문자열 처리가 빠르다. 

StringBuilder buffer = new StringBuilder("Hello World!");
문자열을 파라미터로 받아 인스턴스 생성
[ 문자열의 길이 ] + [ 16 크기의 버퍼 ] 를 생성하고 그 안에 문자열을 저장한다.

StringBuilder buffer = new StringBuilder(8);
정수를 파라미터로 받아 인스턴스 생성
파라미터 크기(정수크기) 만큼의 비어있는 버퍼를 생성한다.

StringBuilder buffer = new StringBuilder();
디폴트 크기 16의 버퍼를 갖는 인스턴스를 생성

StringBuilder 메소드

append()
StringBuilder로 생성된 버퍼에 값을 추가할 때 사용한다.

StringBuilder buffer = new StringBuilder("dre");
buffer.append("am");
System.out.print(buffer);
// Output
// dream

toString()
StringBuilder로 생성된 버퍼내에 있는 값을 String객체로 반환한다.

import java.util.*;

public class ToString {
public String toString() {
StringBuilder buffer = new StringBuilder("Hello World!");
return buffer.toString(); // 버퍼에 있는 문자열을 String객체로 리턴
}                              
public static void main(String[] args) {
ToString ts = new ToString();
System.out.println(ts);
}
}
// Output
// Hello World!

insert(int offset, String str)
버퍼의 offset 위치에 문자열(str)을 삽입.

delete(int start, int end)
버퍼의 start 부터 end-1 까지의 문자열을 삭제.

int bufSize = buffer.capacity(); // 버퍼 크기를 리턴
int length() // 버퍼의 문자열 길이를 리턴

StringBuilder의 내부적 표현

String 객체의 '+' 연산자를 사용할 때 컴파일러가 자동으로 StringBuilder를 사용한다.

String apple = "apple";
String s = "red" + apple + 486;
System.out.print(s);
// Output
// redapple486

위의 과정을 내부적으로 들여다보면(javap를 사용) 컴파일러는 String s를 만들 때 String객체로 append()를 사용하지 않고 StringBuilder 객체를 생성하여 append()를 호출한다. 우리는 편의상 String을 사용하지만 내부적으로는 컴파일러가 좀 더 효율적인 방식을 취하기 때문이다.

이제 String이 아닌 StringBuiler를 이용하여 작성한 코드문을 보자.

// UsingStringBuilder.java
import java.util.*;

public class UsingStringBuilder {
public static Random rand = new Random(47);
public String toString() {
StringBuilder buffer = new StringBuilder("[ ");//StringBuilder객체생
for(int i = 0; i < 25; i++) {
buffer.append(rand.nextInt(100)); // 100 이하의 정수를 버퍼
buffer.append(", ");                    // 에 붙인다
}
buffer.delete(buffer.length()-2, buffer.length()); // 닫는 대괄호를 추
buffer.append("] ");  // 가하기 전에 끝에 2개(콤마,스
return buffer.toString();                  // 페이스)를 제거하기 위해 사용
}
public static void main(String[] args) {
UsingStringBuilder usb = new UsingStringBuilder();
System.out.println(usb);
}
}

// Output
// [ 58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 
// 89, 9, 78, 98, 61, 20, 58, 16, 40, 11, 22, 4]

 
굳이 StringBuilder 클래스를 이용하여 코딩을 하지 않더라도 그 내부적인 쓰임새를 알고 있으면 좋을 것 같다.