Bibi's DevLog 🤓🍎

[Java] StringBuffer, StringBuilder 그리고 String / StringBuffer 개념과 사용 / Buffer의 개념 본문

🖥 BE 백엔드/Java 자바

[Java] StringBuffer, StringBuilder 그리고 String / StringBuffer 개념과 사용 / Buffer의 개념

비비 bibi 2021. 2. 22. 22:55

StringBuilder, StringBuffer 그리고 String

참고 :

자바의 신, 자바의 정석

자바API (로치의 추천👍), 구글링

String과 StringBuilder, StringBuffer의 차이점

  • String은 immutable한 객체, 즉 불변객체이다.
    한 번 만들어지면 더 이상 그 값을 바꿀 수 없다.

예를 들어 String문자열 AB를 더하면,

  • AB를 더해 AB가 된다 (❌)
  • AB라는 새로운 객체를 만들고 기존 객체 A는 버려진다 . (⭕)

그렇기 때문에, 만약 하나의 String에 계속 더하는 작업을 하는 코드를 짠다면 계속 버려지는 쓰레기를 만들게 된다.

  • 이러한 String의 단점을 보완하기 위해 나온 것이 StringBuffer와 StringBuilder이다.

String과 StringBuilder, StringBuffer의 공통점

  • 모두 문자열을 다룬다.

  • CharSequence인터페이스를 구현했다.

    따라서 이 셋 중 하나를 매개변수로 받을 때는 CharSequence타입으로 받는 것이 좋다.

StringBuilder와 StringBuffer의 특징

  • (String과 달리) mutable하다. 즉, 변경 가능한 객체이다.

    • 문자열을 더해도 새로운 객체를 생성하지 않고, 기존 값을 사용한다.
  • 두 클래스에서 제공하는 메소드는 동일하다.

  • StringBuilder : 속도가 더 빠르지만 Thread-safe하지 않다. 단일 스레드에서 사용한다.

  • StringBuffer : 속도는 느리지만 Thread-safe하다.
    그러나 StringBuffer의 성능도 충분히 좋기 때문에, 성능향상이 필요한 경우를 제외하고는 대부분의 경우에 StringBuffer를 사용하는 것이 좋다.

  • append() : StringBuilder, StringBuffer에서 +대신 사용하는 메서드.

    • 매개변수로 받은 값을 StringBuilder / StringBuffer에 붙인다.
    • 리턴값 : StringBuilder / StringBuffer 객체(자기 자신). 자신의 주소를 반환한다.
    • ;를 붙이기 전까지 계속 사용할 수 있다.
    StringBuilder sb = new StringBuilder();
    sb.append("Hello").append(" world");

StringBuffer

StringBuilder와 StringBuffer는 같은 메소드를 제공하며, 대부분의 경우에 StringBuffer클래스가 더 자주 사용되므로 해당 클래스를 기준으로 학습한다.

Buffer 버퍼

Buffer 버퍼 란?

: (= Queue). FIFO.
데이터를 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역.
프로세스 사이에 데이터를 이동시킬 때 사용한다.

*Buffering 버퍼링
: 버퍼를 활용하는 방식. 또는 버퍼를 채우는 동작.

StringBuffer는 내부적으로 문자열 편집을 위한 버퍼를 가지고 있다.

StringBuffer의 메소드 시그니처

public final class StringBuffer implements java.io.Serializable {
    private char[] value; 
    ...
}
  • String클래스와 같이, 문자열을 저장하기 위한 char[]가 인스턴스변수로 선언되어 있다.
    StringBuffer인스턴스가 생성될 때, char[]이 생성되며 이 변수를 value가 참조하게 된다.

    char[]이 StringBuffer의 버퍼에 해당하며, 이 공간에서 문자열을 자르고 편집한다.

StringBuffer의 변경

StringBuffer는 mutable 객체이므로 내용을 변경할 수 있다.

StringBuffer sb = new StringBuffer("abc");
sb.append("123");

append()가 자기 자신의 주소를 반환하기 때문에 계속 이어붙일 수 있다.

StringBuffer의 비교

StringBuffer에는 equals()가 오버라이딩 되어 있지 않기 때문에, equals()== 의 결과가 같다.
대신 toString()은 오버라이딩 되어 있다.

→ 따라서 StringBuffer 객체에 toString() 을 호출해 String 객체를 얻은 다음,
그 String 객체로 equals()를 사용해 비교해야 한다.

StringBuffer의 생성자

StringBuffer가 생성될 때 만들어지는 char[](버퍼)는 문자열의 길이를 고려해 충분한 길이로 설정하는 것이 좋다. (지정하지 않으면 버퍼의 크기는 16이 된다)

  • StringBuffer(int length) : 길이가 length인 StringBuffer 생성

  • StringBuffer() : 길이가 16인 StringBuffer 생성

  • StringBuffer(String str) : 문자열 str + 16 길이의 버퍼를 갖는 StringBuffer 생성

StringBuffer의 메소드

  • StringBuffer append(e)
    : 매개변수로 입력된 값(e)을 문자열로 변환해, StringBuffer 인스턴스에 저장된 문자열 뒤에 붙인다.
  • int capacity()
    : StringBuffer인스턴스의 버퍼 크기를 알려준다.
  • int length()
    : 버퍼에 담긴 문자열의 크기를 알려준다.
  • char charAt(int index)
    : index에 위치한 문자를 반환한다.
  • StringBuffer delete(int start, int end)
    : start 포함, end 이전 까지의 문자를 제거한다.
  • StringBuffer deleteCharAt(int index)
    : index위치의 문자를 제거한다.
  • StringBuffer insert(int index, e)
    : e를 문자열로 변환하여 index위치에 추가한다.
  • StringBuffer replace(int start, int end, String str)
    : start 포함, end 이전 까지의 문자를 str로 바꾼다.
  • StringBuffer reverse()
    : StringBuffer인스턴스에 저장된 문자열의 순서를 거꾸로 나열한다. (문자열 뒤집기)
  • void setCharAt(int index, char ch)
    : index위치의 문자를 ch로 바꾼다.
  • void setLength(int length)
    : 지정된 길이로 문자열의 길이를 변경한다. 길이를 늘릴 때는 널 문자(\u0000, 공백)로 채운다.
  • String toString()
    : StringBuffer의 문자열을 String으로 변환
  • String substring(int start)
    또는 String substring(int start, int end)
    : start 포함, end 이전 까지의 문자열을 뽑아서 반환한다.