String 클래스는 "불변"으로 지정한 문자열을 수정할 수 없지만 StirngBuffer 클래스는 "가변"으로 지정한 문자열을 언제든 수정할 수 있다.
내부적으로 문자열을 편집하기 위한 "버퍼(buffer)"를 가지고 있으며,
StringBuffer 객체를 생성할 때 해당 버퍼 크기를 지정할 수 있다.
버퍼의 크기는 이후 편집할 문자열의 길이를 고려하여 넉넉하게 잡아주는 것이 좋다.
만약 문자열을 편집할 때 버퍼 길이를 넘어가게 되면
다시 버퍼의 길이를 늘여주는 추가 작업이 필요하여 작업 효율이 떨어질 수 있다.
StringBuffer 클래스 또한 String클래스와 같이 문자열을 저장하기 위한
char타입 배열의 참조변수를 객체 변수로 선언하여 사용한다.
(여기서 char타입 배열은 버퍼를 의미한다.)
java 9부터는 String 클래스에서 메모리 효율을 개선하기 위해 char[] 대신 btye[]를 사용하여 문자열을 저장한다. 하지만 StringBuffer는 String 클래스와 달리 "가변"으로 문자열을 관리해야 하며, 멀티스레드 환경에서도 일관성을 유지할 수 있어야 하기 때문에 여전히 char[]을 그대로 사용하도록 설계되어 있다.
StringBuffer 생성자 형태 [예시 코드]
public StringBuffer (int length) { // 버퍼크기 선언
value = new char[length];
shared = false;
}
public StringBuffer() { //버퍼크기 지정하지 않으면 기본으로 16
this(16);
}
public StringBuffer (String str) { //지정한 문자열의 길이보다 +16해서 생성됨
this(str.length() + 16); //보통 문자열크기의 두배로 지정해준다.
append(str);
}