🌱 오늘의 주제 : StringBuffer클래스
🌱 StringBuffer클래스
- String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경 할 수 없지만, StringBuffer클래스는 변경이 가능하다.
- 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있다.
- 인스턴스 생성할 때 크기를 지정할 수 잇다.
- 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스변수로 선언해 놓고 있다.
public final class StringBuffer implements java.io.Serializable {
pivate char[] value;
}
🌱 StringBuffer의 생성자
- 인스턴스를 생성할 때, 버퍼의 크기를 지정해주지 않으면 16개의 문자로 저장 할 수 있는 크기의 버퍼로 생성한다.
public StringBuffer() {
this(16); // 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.
}
- 배열의 길이는 변경될 수 없으므로, 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사해야 한다.
// 새로운 길이(newCapacity)의 배열을 생성한다. newCapacity는 정수값이다.
char newValue[] = new char[newCapacity];
// 배열 value의 내용을 newValue로 복사한다.
System.arraycopy(value, 0, newValue, 0 , count);
value = newValue; // 새로 생성된 주소를 참조변수 value에 저장
🌱 StringBuffer의 변경
- 내용 변경 가능.
- append()는 반환타입이 StringBuffer인데 자신의 주소를 반환한다.
🌱StringBuffer의 비교
- equals메서드를 오버라이딩 하지 않는다.
- toString()은 오버라이딩 되어 있다.
- 문자열을 비교하기 위해서는, StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, equals메서드를 사용해서 비교해야 한다.
package Chapter9;
public class ex9_11 {
public static void main(String[] args) {
// StringBuffer의 비교
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));
}
}
---
sb == sb2 ?false
sb.equals(sb2) ? false
s.equals(s2)true
🌱 StringBuffer의 생성자와 메서드
package Chapter9;
public class ex9_12 {
public static void main(String[] args) {
// StringBuffer의 생성자와 메서드 예제
StringBuffer sb = new StringBuffer("01");
StringBuffer sb2 = sb.append(23);
sb.append('4').append(56); // append 메서드는 입력된 값을 문자열로 반환해서 덧붙임. - 메서드 체이닝.
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)); // 10 인덱스 삭제.
System.out.println("sb = " + sb.delete(3, 6)); // 3~5까지 삭제.
System.out.println("sb = " + sb.insert(3, "abc")); // 3인덱스에 abc 넣기.
System.out.println("sb = " + sb.replace(6, sb.length(), "END")); // sb.length() = 11. / 6,7,8,9,10을 end로 교체.
System.out.println("capacity = " + sb.capacity()); // 버퍼크기 알려줌 - 배열의 총 길이.
System.out.println("length = " + sb.length()); // 0~ 8 : 총 9개.
}
}
-----
sb = 0123456789.0
sb2 = 0123456789.0
sb3 = 0123456789.0
sb = 01234567890
sb = 01267890
sb = 012abc67890
sb = 012abcEND
capacity = 18
length = 9
🌱 StringBuilder
- StringBuffer의 동기화는 불필요하게 성능을 떨어 뜨린다. 그러므로, 동기화만 뺀 StringBuilder가 새로 추가 되었다.
- StringBuffer와 StringBuilder는 완전히 똑같은 기능으로 작성되어 있다. 즉, StringBuffer타입의 참조변수를 선언한 부분과 StringBuffer의 생성자만 바꾸면 된다.
StringBuffer sb; ---> StringBuilder sb;
sb = new StringBuffer(); -------> sb = new StringBuilder();
'Java' 카테고리의 다른 글
Java - 지네릭스(Generics) (0) | 2023.03.06 |
---|---|
Java - Math클래스 (0) | 2023.03.02 |
Java - String클래스 (0) | 2023.02.28 |
Java - Object클래스 (0) | 2023.02.27 |
Java - BufferedReader (0) | 2023.02.26 |