자바에서 String클래스는 불변객체이다. 불변객체란 한번 생성하면 내용이 변하지 않는다는 의미이다.
그래서 문자열끼리 + 연산을 하면 기존 문자열에 문자열이 연결되는 것이 아니라 새로운 문자열 객체가 생성된다.
반면 StringBuffer는 인스턴스를 생성할 때 버퍼의 크기를 정해주고 버퍼사이즈 내에서 문자열 변경이 가능하다.
하지만 버퍼를 벗어나는 정도로 문자열을 추가하면 내부적으로 배열의 길이를 늘여주는 작업을 하므로 그만큼의 오버헤드가 발생한다. 따라서 처음 생성 시에 버퍼의 크기를 넉넉하게 잡아주는 것이 바람직하다.
StringBuffer는 equals()가 오버라이딩 되어 있지 않아 값에 의한 비교를 하지 않는지만 toString()은 오버라이딩 되어 있어 toString() 호출 시 인스턴스의 문자열이 출력되게 된다.
public class Test {
final static int BUFFER_SIZE = 100;
public static void main(String[] args) {
final String HELLO_WORLD = "hello World!";
StringBuffer buffer = new StringBuffer(BUFFER_SIZE);
buffer.append("hello").append(" World!");
if (buffer.equals(HELLO_WORLD)) {
System.out.println("equals가 오버라이딩 되어 있습니다.");
}
if (buffer.toString().equals(HELLO_WORLD)) {
System.out.println("equals가 오버라이딩 되어 있지 않습니다.");
}
}
}
StringBuilder란 StringBuffer와 같은 메서드들을 가지고 있지만 StringBuffer에서 동기화만 빠진 클래스이다.
따라서 단일 쓰레드 시에는 StringBuffer 보다 나은 성능을 보여주지만 멀티 쓰레드 환경에서는 적갑 하지 않다.
StringBuffer의 메서드
메서드 | 설명 |
int capacity() | buffersize를 반환한다. |
char charAt(int index) | 지정된 index의 문자를 반환해준다. 만약 범위를 벗어난 index를 입력하면 StringIndexOutOfBoundsException를 발생시킨다. |
StringBuffer deleteCharAt() | index의 문자를 제거하고 자신을 반환한다. |
StringBuffer delete(int start, int end) | start index부터 end-1 index까지의 문자를 삭제한다. 빈 공백은 뒤의 문자들이 이동해 채운다. |
StringBuffer insert(int pos, String str) 오버로딩되어있음 | pos의 index에 두번째 매개변수를 String으로 변환해 삽입한다. 원래의 pos에 있던 문자열은 새로운 문자열의 길이만큼 뒤로 밀린다. |
int length() | 해당 인스턴스안에 있는 문자열의 길이를 리턴한다. |
StringBuffer replace(int start. int end, String str) | start index부터 end-1 index까지의 문자를 str로 변경한다. |
StringBuffer reverce() | 해당 인스턴스 안의 문자열을 역순으로 배치한다. |
void setCharAt(int index, char ch) | 지정된 index의 문자를 ch로 변경한다. |
void setLength(int newLangth) | newLangth로 내부 배열의 길이를 늘린다. 빈 공간은 '\u0000'로 채운다. |
String substring(int start, int end) | start index부터 end-1까지 반환한다. 만약 end를 생력하면 끝까지 반환한다. |
정리
문자열의 변경이 많이 이루어지지 않으면 String을 사용하고 변경이 많이 일어난다면 StringBuffer나 StringBuilder를 사용한다.
StringBuffer는 멀티 쓰레드의 경우 사용하고 StringBuilder는 단일 쓰레드일 때 혹은 동기화를 신경 쓰지 않아도 될 경우에 사용하면 된다.
Reference