Bibi's DevLog 🤓🍎
[Java] StringBuffer, StringBuilder 그리고 String / StringBuffer 개념과 사용 / Buffer의 개념 본문
[Java] StringBuffer, StringBuilder 그리고 String / StringBuffer 개념과 사용 / Buffer의 개념
비비 bibi 2021. 2. 22. 22:55StringBuilder, StringBuffer 그리고 String
참고 :
자바의 신, 자바의 정석
String과 StringBuilder, StringBuffer의 차이점
- String은 immutable한 객체, 즉 불변객체이다.
한 번 만들어지면 더 이상 그 값을 바꿀 수 없다.
예를 들어 String문자열
A
에B
를 더하면,
A
에B
를 더해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 이전 까지의 문자열을 뽑아서 반환한다.
'🖥 BE 백엔드 > Java 자바' 카테고리의 다른 글
[Java] 스트림, 스트림의 연산, Optional (0) | 2021.02.23 |
---|---|
[Java] 람다식, 함수형 인터페이스 (0) | 2021.02.23 |
[Java] try-with-resources 개념과 사용법 (0) | 2021.02.22 |
[Java] Value Object (VO) 값 객체 (0) | 2021.02.18 |
[Java] enum (열거형) (0) | 2021.02.18 |