public final class StringBuffer implements java.io.Serializable {
private char[] value;
...
}
append()
✔️ String 클래스의 인스턴스
- 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다. (immutable)
- 덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성한다.
- 따라서 문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다.
✔️ StringBuffer 클래스의 인스턴스
- 한번 생성되면 값을 변경할 수도 있고, 추가할 수도 있다. (mutable)
- 문자열을 바로 추가할 수 있고 공간의 낭비도 없으며 속도도 매우 빠르다.
- java.lang 패키지에 포함되어 제공
이를 위해 StringBuffer
클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다.
버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있지만, 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.
equals()
가 오버라이딩되어있지 않다.❗️ 주소비교
this == obj
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equlas(sb2)); // false
equals()
로 비교해야 한다.String s = sb.toString(); // sb를 String으로 변환
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
배열은 길이 변경이 불가하다. 공간이 부족하면 새로운 배열을 생성해야 한다.
- 새로운 배열생성
- 내용복사
- 참조변경
이런일들이 많이 일어나면 성능이 떨어질 것이다. 그래서 처음 만들 때, 문자열의 길이를 고려해서 적절한 크기를 생성하는 StringBuffer
를 생성해야 한다.
// 적절한 크기를 지정해줘서 공간이 부족한일이 없도록 해줘야 한다.
public String Buffer(int length) {
value = new char[length]; // 그 크기대로 지정
shared = false;
}
public String Buffer() {
this(16); // 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.
}
public StringBuffer() {
this(str.length() + 16); // 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
append(str); // 만약 3을 넣으면 길이가 19인 배열생성
}
기본적으로 16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
StringBuffer(int length)
- 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성
StringBuffer sb = new StringBuffer(10);
StringBuffer(String str)
- 지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스를 생성
StringBugger sb = new StringBuffer("Hi");
StringBuffer(기본형 / Object obj)
- 매개변수로 입력된 값을 문자열로 반환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
StringBuffer sb = new Stringbuffer("abc");
StringBuffer sb2 = sb.append(true);
sb.append('d').append(10.0f);
StringBuffer sb3 = sb.append("ABC").append(123);
sb = "abctrued10.0ABC123"
sb2 = "abctrued10.0ABC123"
sb3= "abctrued10.0ABC123"
✔️ append()
: 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다.
concat()
메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.StringBuffer sb = new StringBuffer("abc");
sb.append("123"); // sb의 내용 뒤에 "123"을 추가한다.
append()
는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환한다.StringBuffer sb2 = sb.append("ZZ"); // sb의 내용뒤에 "ZZ"를 추가
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ
append()
는 연달아서 쓸 수 있다.Stringbuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ");
length()
는 버퍼에 담긴 문자열의 길이를 알려준다.StringBuffer sb = new StringBuffer(100);
StringBuffer sb2 = new StringBuffer(); // 16
sb.append("abcd");
int bufferSize = sb.capacity(); // 100
int stringSize = sb.length(); // 4 ("abcd")
StringBuffer sb = new StringBuffer("abc");
char c = sb.charAt(2); // 'c'
StringBuffer sb = new StringBuffer("0123456");
StringBuffer sb2 = sb.delete(3, 6);
sb = "0126"
sb2 = "0126" // 4, 5 제거
StringBuffer sb = new StringBuffer("0123456");
sb.deleteCharAt(3); // "012456"
StringBuffer sb = new StringBuffer("0123456");
sb.insert(4, '.'); // "0123.456"
StringBuffer sb = new StringBuffer("0123456");
sb.replace(3, 6, "AB"); // "345"가 "AB"로 바뀜 -> "012AB6"
StringBuffer sb = new StringBuffer("0123456");
sb.reverse(); // "6543210"
StringBuffer sb = new StringBuffer("0123456");
sb.setCharAt(5, 'o'); // "01234o6"
StringBuffer sb = new StringBuffer("0123456");
sb.setLength(5);
StringBuffer sb2 = new StringBuffer("0123456");
sb2.setLength(10);
String str = sb2.toString().trim();
sb = "01234"
sb2 = "0123456 "
str = "0123456"
StringBuffer sb = new StringBuffer("0123456");
String str = sb.toString(); // "0123456"
References
: https://cafe.naver.com/javachobostudy