[작성일: 2023. 02. 06]
StringBuffer 클래스
- String처럼 문자열(char [])을 내부적으로 가지고 있음.
- 그러나 String과 달리 내용 변경 가능(mutable)
public final StringBuffer implements java.io.Serializable {
private char[] value;
...
}
String Buffer sb = new StringBuffer("abc");
sb.append("123"); // sb의 내용 뒤에 "!23"을 추가함.
StringBuffer 생성자
- 배열은 길이 변경 불가. 공간이 부족하면 새로운 배열을 생성해야 함.
- 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); // 길이가 19인 배열이 만들어짐.
}
StringBuffer 변경
- StringBuffer는 String과 달리 내용 변경이 가능함.
- append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환함.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
// sb의 내용 뒤에 "123"을 추가함.
sb.append("123").append("ZZ");
StringBuffer 비교
- StringBuffer는 equals()가 오버라이딩 되어있지 않음.(주소 비교를 한다는 뜻)
- StringBuffer를 String으로 변환 후에 equals()로 비교해야 함.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false
String s = sb.toString(); // sb를 String으로 변환
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
StringBuffer 생성자와 메서드
메서드 / 설명 | 예제 / 결과 |
StringBuffer() | StringBuffer sb = new StringBuffer(); sb = "" |
16문자를 담을 수 있는 퍼버를 가진 StringBuffer 인스턴스를 생성함. | |
StringBuffer(int length) | StringBuffer sb = new StringBuffer(10); sb = "" |
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성함. | |
StringBuffer(String str) | StringBuffer sb = new StringBuffer("Hi"); sb = "Hi" |
지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스를 생성함. | |
StringBuffer append(boolean b) StringBuffer append(char c) StringBuffer append(char[] str) StringBuffer append(double d) StringBuffer append(float f) StringBuffer append(int i) StringBuffer append(long l) StringBuffer append(Object obj) StringBuffer append(String str) |
StringBuffer sb = new StringBuffer("abc"); StringBuffer sb2 = sb.append(true); sb.append('d').append(10.0f); StringBuffer sb3 = sb.append("ABC").append(123); |
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙임. | |
int capacity() | StringBuffer sb = new StringBuffer(100); sb.append("abcd"); int bufferSize = sb.capacity(); int stringSize = sb.lenth(); bufferSize = 100 stringSize = 4 (담긴 문자열이 "abcd" 이므로) |
StringBuffer 인스턴스의 버퍼 크기를 알려줌. length()는 버퍼에 담긴 문자열의 길이를 알려줌. | |
char charAt(int index) | StringBuffer sb = new StringBuffer("abc"); char c = sb.charAt(2); c = 'c' |
지정된 위치(index)에 있는 문자를 반환함. | |
StringBuffer delete(int start, int end) | StringBuffer sb = new StringBuffer("0123456"); StringBuffer sb2 = sb.delete(3, 6); sb = "0126" sb2 = "0126" |
시작위치부터 끝 위치 사이에 있는 문자를 제거함. 끝 위치의 문자는 제외함. | |
StringBuffer deleteCharAt(int index) | StringBuffer sb = new StringBuffer("0123456"); sb.deleteCharAt(3); sb = "012456" |
지정된 위치의 문자를 제거함. |
메서드 / 설명 | 예제 / 결과 |
StringBuffer insert(int pos, boolean b) StringBuffer insert(int pos, char c) StringBuffer insert(int pos, char[] str) StringBuffer insert(int pos, double d) StringBuffer insert(int pos, float f) StringBuffer insert(int pos,int i) StringBuffer insert(int pos,long l) StringBuffer insert(int pos,Object obj) StringBuffer insert(int pos, String str) |
StringBuffer sb = new StringBuffer("123456"); sb.insert(4,"."); sb = "0123.456" |
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가함. pos는 0부터 시작함. | |
int length() | StringBuffer sb = new StringBuffer("123456"); int length = sb.length(); length = 7 |
StringBuffer 인스턴스에 저장되어 있는 문자열의 길이를 반환함. | |
StringBuffer replace(int start, int end, String str) | StringBuffer sb = new StringBuffer("123456"); sb.replace(3, 6, "AB"); sb = "012AB6" |
지정된 범위의 문자들을 주어진 문자열로 바꿈. end 위치의 문자는 범위에 포함되지 않음. | |
StringBuffer reverse() | StringBuffer sb = new StringBuffer("123456"); sb.reverse(); sb = "6543210" |
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열함. | |
void setCharAt(int index, char ch) | StringBuffer sb = new StringBuffer("123456"); sb.setCharAt(5, 'o'); sb = "01234o6" |
지정된 위치의 문자를 주어진 문자(ch)로 바꿈. | |
void setLength(int newLength) | StringBuffer sb = new StringBuffer("123456"); sb.setLength(5); StringBuffer sb2 = new StringBuffer("0123456"); sb2.setLength(10); String str = sb2.toString().trim(); sb = "01234" sb2 = "0123456 " str = "0123456" |
지정된 길이로 문자열의 길이를 변경함. 길이를 늘리는 경우에 나머지 빈 공간을 널문자 '\u0000'로 채움. | |
String toString() | StringBuffer sb = new StringBuffer("123456"); Stirng str = sb. toString(); str = "0123456" |
StringBuffer 인스턴스의 문자열을 String으로 반환 | |
String substring(int start) String substring(int start, int end) |
StringBuffer sb = new StringBuffer("123456"); String str = sb.substring(3); String str2 = sb.substring(3, 5); str = "3456" str2 = "34" |
지정된 범위 내의 문자열을 Stirng으로 뽑아서 반환함. 시작위치만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환함. |
예제
class Exex {
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);
System.out.println("sb2 = "+sb2);
System.out.println("sb3 = "+sb3);
System.out.println("sb = "+sb.deleteCharAt(10));
System.out.println("sb = "+sb.delete(3,6));
System.out.println("sb = "+sb.insert(3, "abc");
System.out.println("sb = "+sb.replace(6, sb.lenth(), "END"));
System.out.println("capacity = "+sb.capacity());
System.out.println("length = "+sb.length());
}
}
// 결과
sb = 0123456789.0
sb2 = 0123456789.0
sb3 = 0123456789.0
sb = 01234567890
sb = 01267890
sb = 012abc67890
sb = 012abcEND
capacity = 18
length = 9
StringBuilder
- StringBuilder는 동기화 되어있지 않아 멀티 스레드에 안전하지 못 함.
- StringBuffer는 동기화(데이터 보호) 되어 있어서 멀티 스레드에 안전함.(thread-safe)
- 멀티 스레드 프로그램이 아닌 경우, 동기화는 불필요한 성능을 저하 ➡️ 싱글 스레드 프로그램에서는 StringBuffer 대신 StringBuilder를 사용하면 성능 향상
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.