String클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고,변경할 수는 없었습니다.
하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있습니다.
이를 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적은 공간을 가집니다.
버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정 할 수도 있습니다.
하지만 인스턴스 생성시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유있는 크기로 생성됩니다.
덧셈(+)연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성합니다.
따라서 문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 됩니다.
하지만 StringBuuffer인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라집니다.
(이러한 StringBuffer클래스는 java.lang패키지에 포함되어 제공합니다.)
String 클래스와 같이 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 클래스를 불변 클래스(immutable class)라고 합니다.
append()메서드는 인수로 전달된 값을 문자로 변환한 후, 해당 문자열의 마지막에 추가합니다.
이 메서드는 String클래스의 concat()메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠릅니다.
public class AppendTest {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Java");
System.out.println("원본 문자열 : " + str); //원본 문자열 : Java
System.out.println(str.append("수업")); //Java수업
System.out.println("append() 메소드 호출 후 원본 문자열 : " + str); //append() 메소드 호출 후 원본 문자열 : Java수업
}
}
capacity()메서드는 StringBuffer인스턴스의 현재 버퍼 크기를 반환합니다.
public class CapacityTest {
public static void main(String[] args) {
StringBuffer str01 = new StringBuffer(); //
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity()); //기본으로 생성 되는 여유 버퍼 크기 : 16
System.out.println(str02.capacity()); //기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이인 4를 더한 총 20개의 문자를 저장할 수 있는 버퍼가 생성되
}
}
delete() 메서드는 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다.
또한, deleteChatAt()메서드를 사용하면 특정 위치의 문자 한개만을 제거할 수도 있습니다.
public class DeleteTest {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("원본 문자열 : " + str);
System.out.println(str.delete(4, 8)); // 인수 Java Oracle 에서의 인덱스 4부터 8까지 삭제 한다. 따라서 Javacle 출력.
System.out.println(str.deleteCharAt(1)); //index 1 위치에 있는 문자한개를 제거 'a'를 삭제하면. Jvacle 출력
System.out.println("deleteCharAt() 메소드 호출 후 원본 문자열 : " + str); //deleteCharAt() 메소드 호출 후 원본 문자열 : Jvacle
//이처럼 delete() 메소드는 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞의 문자까지를 삭제하는 메소드입니다.
}
}
insert()메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가합니다.
이때 전달된 인덱스가 해당 문자열의 길이와 같으면, append() 메서드와 같은 결과를 반환합니다.
public class InsertTest {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Java 만세!!");
System.out.println("원본 문자열 : " + str); //원본 문자열 : Java 만세!!
System.out.println(str.insert(4, "Script")); //JavaScript 만세!!
System.out.println("insert() 메소드 호출 후 원본 문자열 : " + str); //insert() 메소드 호출 후 원본 문자열 : JavaScript 만세!!
}
}
//위 예제에서 insert()메서드를 사용하여 해당 문자열에서 인덱스가 4인 위치부터 두번째 매개변수로 전달된 문자열을 추가하고 있습니다.