posted by changhozz 2012. 7. 20. 16:15

String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.

이때, 편집할 문자열의 크기를 고려하여 버퍼의 크기를 충분히 잡아주는 것이 좋다. 편집 중인 문자열이 버퍼의 크기를 넘어서게 되면 버퍼의 크기를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어진다.

StringBuffer클래스는 String클래스와 유사한 점이 많다.
StringBuffer클래스는 String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를
인스턴스변수로 선언해 놓고 있다. StringBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.

 

-----------------------StringBuffer클래스의 생성자------------------------

StringBuffer클래스의 인스턴스를 생성할 때, 적절한 크기의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
StringBuffer인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장될 문자열의 크기를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.
StringBuffer인스턴스를 생성할 때 , 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

public StringBuffer(int length){
value = new char[length];
}

public StringBuffer(){
this(16);
}                                //버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.

public StringBuffer(String str){
this(str.length() +16);
append(str);               //지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
}

StringBuffer인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 크기보다 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.
배열의 크기는 변경될 수 없으므로 새로운 크기의 배열을 생성한 후에 이전 배열의 값을 복사한다.

 

 

-----------------------------StringBuffer인스턴스의 비교------------------------------------

String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만,
StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서  StringBuffer클래스의  equals메서드를
사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
반면에 toString()은 오버라이딩되어 있어서 StringBuffer인스턴스에 toString()을 호출하면,
담고있는 문자열을 String으로 반환한다.
그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에
toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야한다.

'JAVA > JAVA 공부' 카테고리의 다른 글

String클래스의 특징  (0) 2012.07.20
java.lang 패키지  (0) 2012.07.20
참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21