String 클래스
의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.
하지만, StringBuffer 클래스
의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다. 이를 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 갖는다.
하지만, StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로
, 공간의 낭비도 없고 속도도 매우 빨라진다.
String 클래스와 같이 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 클래스를 불변 클래스(immutable class)라고 한다.
반대로, StringBuffer 클래스
와 같이 자유롭게 인스턴스의 값을 변경
할 수 있는 클래스를 가변 클래스(mutable class)
라고 한다.
String 클래스와 같은 불변 클래스는, StringBuffer 클래스의 append()나 insert() 메소드와 같이 값을 변경하는 set 메소드를 포함하지 않는다.
Q. 불편할 것 같은 불변 클래스를 사용하는 이유?
: 하나의 객체에 접근하면서 각각의 객체가 서로 영향을 주어서는 안되는 경우에 불변 인스턴스를 사용하면 값이 변하지 않는다는 점이 보장된다!
append() 메소드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다.
이 메소드는 String 클래스의 concat() 메소드와 동일한 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.
[예제]
StringBuffer str = new StringBuffer("Java");
System.out.println("원본 문자열 : " + str );
System.out.println(str.append("수업"));
System.out.println("append() 메소드 호출 후 원본 문자열 : " + str);
[결과]
capacity() 메소드는 StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.
🥩 참고
버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기
이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다.
하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다.
[예제]
StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());
[결과]
str02와 같이 길이가 4인 문자열로 StringBuffer 인스턴스(객체)를 생성하면,
기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이인 4를 더한 총 20개의 문자를 저장할 수 있는 버퍼가 생성된다.
delete() 메소드는 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다.
🥩 참고
deleteCharAt() 메소드를 사용하면 특정 위치의 문자 한 개만을 제거할 수 있다.
[예제]
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("원본 문자열 : " + str );
① System.out.println(str.delete(4,8));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 원본 문자열 : " + str);
[결과]
위 예제의 ①번 라인에서는 delete() 메소드를 이용하여 해당 문자열("Java Oracle")에서 index가 4인 위치의 문자(" ")부터 7인 위치("a")의 문자까지를 삭제하고 있다.
insert()메소드는 한 문자열 중간에 다른 문자열을 삽입할 수 있다.
[예제]
StringBuffer str = new StringBuffer("Java 만세!");
System.out.println("원본 문자열 : " + str);
① System.out.println(str.insert(4,"Script"));
System.out.println("insert() 메소드 호출 후 원본 문자열 : " + str);
[결과]
위 예제의 ①번 라인에서 insert() 메소드를 사용하여
해당 문자열("Java 만세!")에서 index가 4인 위치(" ")부터 두번째 매개변수로 전달된 문자열("Script")을 추가했다.