728x90
ch9 - 15 ~ 18
StringBuffer 클래스
ch9 - 15 StringBuffer 클래스 (문자열을 저장 & 다루기 위한 클래스)
- String 처럼 문자형 배열 (char[]) 을 내부적으로 가지고 있다.
public final class StringBuffer implements java.io.Serializable {
private char[] value;
..
}
- 그러나 String과 달리 내용을 변경 할 수 있다. (mutable)
StringBuffer sb = new StringBuffer("abc");
sb (0x100) ---> 'a' 'b' 'c' .. ( char[] )
sb.append("123"); // sb의 내용 뒤에 "123" 을 추가. (내용 변경 가능)
sb(0x100) ---> 'a' 'b' 'c' '1' '2' '3' .. ( char[] )
ch9 - 16 StringBuffer의 생성자
- 배열은 길이 변경이 불가능 하다. 공간이 부족 하면 새로운 배열을 생성 해야 한다.
(immutable)
- 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);
}
만약에 "abc" 를 넣어주면 길이가 3이기 때문에, 3 + 16 = 19 길이 만큼의 char 배열이 생성 된다.
ch9 - 17 StringBuffer의 변경
- StringBuffer 는 String 과 달리 내용 변경이 가능 하다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123"); // sb의 내용 뒤에 "123" 을 추가.
- append() 는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환 한다.
그 외에, delete(), insert(), .. 등의 메서드가 있고,
이 메서드 들의 반환타입은 StringBuffer 타입 이다.
즉, StringBuffer 자기 자신의 참조를 반환 한다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
sb.append("ZZ");
하고,
StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ");
하고 동일 하다.
왜냐하면,
sb.append("123") 이 결국 자기 자신의 참조를 반환 하기 때문에, 참조변수 sb 이기 때문 이다.
ch9 - 18 StringBuffer의 비교
- StringBuffer 클래스는 String 클래스와 다르게, equals() 메서드가 오버라이딩 되어 있지 않다.
즉, 주소 비교를 한다는 의미 이다.
(String 클래스는 오버라이딩이 이미 되어 있어서, 내용 (값) 을 비교 한다)
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
위의 참조변수 sb와 sb2는 내용 (값) 이 "abc" 로 동일 하다.
하지만,
실제로 == 동등 비교 연산자를 사용 하거나,
또는,
equals() 메서드를 사용 하면,
모두 false 를 반환 하게 된다.
주소를 비교 하기 때문에 그런것이다.
- StringBuffer 클래스의 내용 (값) 을 비교 하려면 ???
StringBuffer 클래스를 String 으로 변환 하고, equals() 로 비교 하면 된다.
String s = sb.toString(); // 참조변수 sb를 String 으로 변환.
String s2 = sb2.toString(); // 참조변수 sb2를 String 으로 변환.
System.out.println(s.equals(s2)); // true
예시 01 )
class Ex9_11 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println("sb == sb2 ? " + (sb == sb2));
System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));
// StringBuffer의 내용을 String으로 변환한다.
String s = sb.toString(); // String s = new String(sb);와 같다.
String s2 = sb2.toString();
System.out.println("s.equals(s2) ? " + s.equals(s2));
}
}
[ console ]
예시 02 )
class Ex9_12 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("01");
StringBuffer sb2 = sb.append(23);
sb.append('4').append(56);
StringBuffer sb3 = sb.append(78);
sb3.append(9.0);
System.out.println("sb =" + sb); // 0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)
System.out.println("sb2=" + sb2); // 0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)
System.out.println("sb3=" + sb3); // 0123456789.0 (sb2랑 sb3은 모두 참조변수 sb의 주소값을 가리킨다)
[ console ]
반응형
'Java의 정석 > java.lang 패키지 & 유용한 클래스' 카테고리의 다른 글
StringBuilder, Math 클래스 (0) | 2023.09.02 |
---|---|
StringBuffer 클래스의 메서드 (0) | 2023.09.02 |
StringJoiner, 문자열과 기본형 변환 (0) | 2023.09.01 |
String 클래스, 문자열 비교, 빈 문자열 (0) | 2023.08.31 |
hashCode() 메서드, toString() 메서드 (0) | 2023.08.30 |