String처럼 문자열 배열(char[])을 내부적으로 가지고 있다.
그러나, String과 달리 내용을 변경할 수 있다.(mutable)
문자열 배열을 가지는 StringBuffer 클래스는 일반적인 배열과 마찬가지로 배열은 길이 변경이 불가능하며, 공간이 부족하면 새로운 배열을 생성한뒤 내용을 복사하고 참조를 변경해야 한다. 따라서 StringBuffer은 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.
StringBuffer의 생성자
생성자 / 설명 | 예제 / 결과 |
StringBuffer() | StringBuffer sb = new StringBuffer(); |
16문자를 담을 수 있는 버펄르 가진 StringBuffer인스턴스를 생성한다. | sb = "" |
StringBuffer(int length) | StringBuffer sb = new StringBuffer(10) |
지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer인스턴스를 생성한다. | sb = "" |
StringBuffer(String str) | StringBuffer sb = new StringBuffer("abc") |
지정된 문자열 값(str)을 갖는 StringBuffer인스턴스를 생성한다 | sb = "abc" |
public void StringBuffer(int length) {
value = new char[length];
shared = false;
}
크기를 지정하지 않으면 버퍼의 크기는 16이된다.
public void StringBuffer() {
this(16);
}
생성시 문자열을 매개변수로 받는다면 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
public void StringBuffer(String str) {
this(str.length() + 16);
append(str);
}
StringBuffer의 변경
배열의 길이는 불가능 하지만 내용의 변경이 가능하다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
aapend(), delete(), insert() 메서드는 StringBuffer의 참조를 반환한다
append() 메서드는 문자열 끝에 내용을 StringBuffer에 추가하고 StringBuffer의 참조를 반환한다.(반환 타입이 StringBuffer)
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
sb.append("ZZ");
// sb.append("123").append("ZZ");
append()메서드는 반환값이 자기자신이기 때문에 한줄로 좀더 간결한 코드로 작성할 수 있다.
StringBuffer의 비교
String은 equals()가 오버라이딩 되어있지 않아 주소를 비교한다.
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
// ==와 equals()모두 주소를 비교하기 때문에 같은 대용임에도 false를 반환한다.
System.out.println(sb1 == sb2); // false
System.out.println(sb1.equals(sb2)); // false
비교를 하기 위해선 StringBuffer을 String으로 변환한뒤 equals()로 비교해야 한다.
System.out.println(sb1.toString().equals(sb2.toString())); // true
StringBuffer의 메서드
메서드 / 설명 | 예제 / 결과 |
StringBuffer append(매개변수) | StringBuffer sb = new StringBuffer("abc") StringBuffer sb2 = sb.append(true); sb.append('d').append(10.0); StringBuffer sb3 = sb.append("ABC").append(123); |
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다. | sb = "abctrue10.0ABC123" sb2 = "abctrue10.0ABC123" sb3 = "abctrue10.0ABC123" |
int capacity() | StringBuffer sb = new StringBuffer(100); sb.append("abcd") int bufferSize = sb.capacity(); int stringSize = sb.length(); |
StringBuffer인스턴스의 버퍼크기(char[]의 길이)를 알려준다. length()는 버퍼에 담긴 문자열의 길이를 알려준다 |
bufferSize = 100 stringSize = 4 |
char charAt(int index) | StringBuffer sb = new StringBuffer("abc"); char c = sb.charAt(2); |
지정된 위치(index)에 있는 문자를 반환한다. | c = 'c' |
StringBuffer delete(int start, int end) | StringBuffer sb = new StringBuffer("0123456); StringBuffer sb2 = sb.delete(3, 6); |
시작위치(start)부터 끝 위치(end) 사이에 있는 문자를 제거한다. 단, 끝 위치의 문자는 제외 (start <= x < end) | sb = "0126" sb2 = "0126" |
메서드 / 설명 | 예제 / 결과 |
StringBuffer deleteCharAt( int index) | StringBuffer sb = new StringBuffer("0123456"); sb.deleteCharAt(3); |
지정된 위치(index)의 문자를 제거한다. | sb = "0123456" |
StringBuffer insert(int pos, 매개변수) | StringBuffer sb = new StringBuffer("0123456"); sb.insert(4, '.'); |
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다.(pos는 0부터 시작) | sb = "0123,456" |
int length() | StringBuffer sb = new StringBuffer("0123456"); int length = sb.length(); |
StringBuffer인스턴스에 저장되어 있는 문자열의 길이를 반환한다. | length = 7 |
StringBuffer replace(int start, int end, String str) | StringBuffer sb = new StringBuffer("0123456"); sb.replace(3, 6, "AB"); |
지정된 범위(start ~ end)의 문자들을 주어진 문자열로 바꾼다. end위치의 문자는 범위에 포함되지 않음(start <= x < end) | sb = "012AB6" // 345 => AB |
메서드 / 설명 | 예제 / 결과 |
StringBuffer reverse() | StringBuffer sb = new StringBuffer("0123456"); sb.reverse(); |
StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다. | sb = "6543210" |
void setCharAt(int index, char ch) | StringBuffer sb = new StringBuffer("0123456"); sb.setCharAt(5, 'o'); |
지정된 위치의 문자를 주어진 문자(ch)로 바꾼다. | sb = "01234o6" |
void setLength(int newLength) | StringBuffer sb = new StringBuffer("0123456"); sb.setLength(5); StringBuffer sb2 = new StringBuffer("0123456"); sb2.setLength(10); String str = sb2.toString().trim(); |
지정된 길이로 문자열의 길이를 변경한다. 길이를 늘리는 경우에 나머지 빈 공간을 널문자 '\u0000'로 채운다. | sb = "01234" sb2 = "0123456 " sb3 = "0123456" |
String substring(int start) String substring(int start, int end) |
StringBuffer sb = new StringBuffer("0123456"); String str = sb.substring(3); String str2 = sb.subString(3, 5); |
지정된 범위 내의 문자열을 String으로 뽑아서 반환한다. 시작위치(start)만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환한다. (start <= x < end) | str = "3456" str2 = "34" |
String toString() | StringBuffer sb = new StringBuffer("0123456"); String str = sb.toString(); |
StringBuffer인스턴스의 문자열을 String으로 변환 | str = "0123456" |
StringBuilder클래스
StringBuffer와 같은 클래스라고 볼 수 있지만 Stringbuffer은 동기화 되어 있지만 StringBuilder은 동기화가 되어있지 않아 멀티 쓰레드에 안전하다(thread-safe)
싱글 쓰레드는 한번에 1개의 작업을, 멀티 쓰레드는 한번에 n개의 작업을 할 수 있다. 동기화는 간단히 말하면 멀티 쓰레드 사용시 데이터를 보호 해준다고 할 수 있는데 멀티 쓰레드 프로그램이 아닐 경우, 동기화는 불필요한 성능 저하를 가져온다. 싱글 쓰레드 프로그램일 경우 StringBuilder를 사용하면 불필요한 성능 저하를 막아 성능 향상을 가져온다.
'Java' 카테고리의 다른 글
[JAVA] 날짜와 시간 그리고 Calendar 클래스 (0) | 2023.11.02 |
---|---|
[JAVA] 래퍼(Wrapper)클래스와 박싱 & 언박싱 (Boxing & UnBoxing) (0) | 2023.11.02 |
[JAVA] String 클래스 (0) | 2023.10.31 |
[JAVA] Object 클래스 (0) | 2023.10.28 |
[JAVA] 자바의 에러(error)와 예외(exception) (0) | 2023.10.25 |