티스토리 뷰
String클래스는 인스턴스를 생성 할 때 지정된 문자열을 변경할 수 없지만, StringBuffer클래는 변경이 가능하다.
내부적으로 문자열 편집을 위한 Buffer를 가지고 있기 때문이다.
StringBuffer 인스턴스를 생성할 때, 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다. 편집중인 문자열이 버퍼의 길이를 넘어서면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야되서, 작업효율이 떨어진다.
public StringBuffer(int length) {
value = new char[length];
shared = false;
}
public StringBuffer() {
this(16); //버퍼의 크기 지정하지 않으면 자동으로 16
}
public StringBuffer(String str) {
this(str.length()+16); //저장한 문자열의 길이보다 16이 더 크게 버퍼 생성
append(str);
}
위에서 볼 수 있듯, 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때는, 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다. 배열의 길이는 변경되지 못하므로, 새로운 길이의 배열을 생성한 후, 이전 배열의 값을 복사한다.
문자열 변경
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
이러헥하면, 참조변수 sb가 가리키고 있는 문자열 뒤에 문자열 123가 추가된다.
append()는 반환타입이 StringBuffer 인데, 자신의 주소를 반환하다.
StringBuffer s2 = sb.append("123");
따라서 위와같은 문장이 수행되면, 참조변수 s2와 sb는 같은 문자열을 가리키게 된다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("zz"); //반환이 주소값이므로 이러한 문장도 수행가능
문자열 비교
StringBuffer클래스는 String 클래스처럼 equals 메소드가 오버라이딩 되어있지 않으므로, stringBuffer 인스턴스들을 문자열로 비교하고자 한다면, 먼저 1) String으로 변환 해준 후 2) String 클래스의 equals메서드를 호출한다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc")
System.out.pritnln(sb.equals(sb2)); //false 서로 다른 인스턴스이므로
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); //true
'programming language > Java' 카테고리의 다른 글
[자바] 형식화 포맷 - ChoiceFormat 과 MessageFormat (0) | 2020.04.06 |
---|---|
[자바] 형식화 포맷 - Decimal Format과 Simple Date Format (0) | 2020.04.06 |
[자바] String 클래스 (0) | 2020.04.04 |
[자바] Object 클래스의 메서드 (0) | 2020.04.04 |
자바의 정석 2차원 배열 응용문제 (0) | 2020.03.09 |
댓글