[Java] StringBuffer

JTI·2022년 12월 2일
0

☕️  Java

목록 보기
35/59
post-thumbnail

💡 java.lang.StringBuffer 클래스


  • String 처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
public final class StringBuffer implements java.io.Serializable {
	
    private char[] value;
    ...
}
  • String과 달리 내용을 변경할 수 있다. append()

📎 String VS StringBuffer

✔️ String 클래스의 인스턴스

  • 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다. (immutable)
  • 덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성한다.
  • 따라서 문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다.

✔️ StringBuffer 클래스의 인스턴스

  • 한번 생성되면 값을 변경할 수도 있고, 추가할 수도 있다. (mutable)
  • 문자열을 바로 추가할 수 있고 공간의 낭비도 없으며 속도도 매우 빠르다.
  • java.lang 패키지에 포함되어 제공

이를 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다.

버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있지만, 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.

📎 StringBuffer의 비교

  • StringBuffer는 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
  • 따라서 StringBuffer을 String으로 변환 후에 equals() 로 비교해야 한다.
String s = sb.toString(); // sb를 String으로 변환
String s2 = sb2.toString();

System.out.println(s.equals(s2)); // true

💡 StringBuffer의 생성자


배열은 길이 변경이 불가하다. 공간이 부족하면 새로운 배열을 생성해야 한다.

  1. 새로운 배열생성
  2. 내용복사
  3. 참조변경

이런일들이 많이 일어나면 성능이 떨어질 것이다. 그래서 처음 만들 때, 문자열의 길이를 고려해서 적절한 크기를 생성하는 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인 배열생성
}

✏️ StringBuffer()

기본적으로 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"

💡 StringBuffer의 메서드


✏️ append()

📎 StringBuffer의 변경

  • StringBuffer는 String과 달리 내용 변경이 가능하다.
  • 반환 타입이 StringBuffer이다.

✔️ append()
: 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다.

  • String 클래스의 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");

✏️ int capacity()

  • StringBuffer 인스턴스의 버퍼크기를 알려준다.
  • 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")

✏️ char charAt(int index)

  • 지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer sb = new StringBuffer("abc");

char c = sb.charAt(2); // 'c'

✏️ StringBuffer delete(int start, int end)

  • 시작위치 (start) 부터 끝 위치(end) 사이에 있는 문자를 제거한다.
  • 단, 끝 위치의 문자는 제외.
StringBuffer sb = new StringBuffer("0123456");

StringBuffer sb2 = sb.delete(3, 6); 

sb = "0126"
sb2 = "0126" // 4, 5 제거

✏️ StringBuffer deleteCharAt(int index)

  • 지정된 위치(index) 의 문자를 제거한다.
StringBuffer sb = new StringBuffer("0123456");

sb.deleteCharAt(3); // "012456"

✏️ StringBuffer insert(int pos, ...)

  • 두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos) 에 추가한다.
  • pos는 0부터 시작한다.
StringBuffer sb = new StringBuffer("0123456");

sb.insert(4, '.'); // "0123.456"

✏️ StringBuffer replace(int start, int end, String str)

  • 지정된 범위(start ~ end) 의 문자들을 주어진 문자열로 바꾼다.
  • end위치의 문자는 범위에 포함 되지 않음.
StringBuffer sb = new StringBuffer("0123456");

sb.replace(3, 6, "AB"); // "345"가 "AB"로 바뀜 -> "012AB6"

✏️ StringBuffer reverse()

  • StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
StringBuffer sb = new StringBuffer("0123456");

sb.reverse(); // "6543210"

✏️ void setCharAt(int index, char ch)

  • 지정된 위치의 문자를 주어진 문자(ch) 로 바꾼다.
StringBuffer sb = new StringBuffer("0123456");

sb.setCharAt(5, 'o'); // "01234o6"

✏️ void setLength(int newLength)

  • 지정된 길이로 문자열의 길이를 변경한다.
  • 길이를 늘리는 경우에 나머지 빈 공간을 널문자 '\u0000'로 채운다.
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"

✏️ String toString()

  • StringBuffer 인스턴스의 문자열을 String으로 반환
StringBuffer sb = new StringBuffer("0123456");

String str = sb.toString(); // "0123456"

References
: https://cafe.naver.com/javachobostudy

profile
Fill in my own colorful colors🎨

0개의 댓글