StringBuilder
2024. 9. 30. 14:41ㆍBackEnd/Java
728x90
반응형
정의
문자열을 효율적으로 다루는 클래스입니다.Java에서 문자열을 다룰 때, String 타입을 사용합니다.
사용이 간편하지만 불변 객체(immutable object)라 연결, 수정 시, 매번 새로운 String 객체가 생겨 성능 저하가 발생합니다.
StringBuilder는 char[] 기반이기 때문에 가변 객체(mutable object)입니다.
그러므로 문자열 조작(추가, 삭제, 삽입) 시 성능이 빠르고 효율적입니다.
내부구현
내부 구현을 보면 클래스 사용 이유가 명확해집니다.// Java 11 기준입니다.
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable {
public StringBuilder() {
super(16); // AbstractStringBuilder(16) 호출합니다.
}
public StringBuilder append(String str) {
super.append(str); // AbstractStringBuilder의 append(str) 메서드를 호출합니다.
return this;
}
public String toString() {
return new String(value, 0, count);
}
}
// 부모 클래스가 핵심구현입니다.
abstract class AbstractStringBuilder {
char[] value;
int count;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
void ensureCapacityInternal(int minimumCapacity) {
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
value = Arrays.copyOf(value, newCapacity);
}
}
이름 | 설명 |
value | 실제 문자열 저장소로 초기 크기는 16글자 크기입니다. |
count | 현재 저장된 문자 개수입니다. |
append(String str) | 문자열을 삽입하는 메서드입니다. |
toString( ) | String 타입으로 변경 시키는 메서드입니다. |
expandCapacity( ) ensureCapacityInternal( ) |
공간이 부족하면 배열 크기를 증가시키는 메서드 입니다. |
추상 클래스 사용 이유
StringBuffer도 존재합니다.Java에는 StringBuilder뿐 아니라 StringBuffer도 존재합니다.
728x90
반응형