-
Java) StringBuilder 와 StringBufferCS 2024. 8. 7. 22:30
앞서 String 에 대해 깊게 공부를 했으니 이제 StringBuilder 와 StringBuffer 에 대해 깊게 배워보려고한다.
https://will-of-rough.tistory.com/55
String 에게 깊은 인상을 으아아ㅏㅏ... 개요
StringBuilder는 가변 길이의 문자열을 생성하고 조작하는 데 사용되는 클래스
StringBuilder 는 문자열을 생성하고 조작하는데 특화된 클래스다.
사실 StringBuilder 는 실제 업무에서만 사용안할 뿐이지 내부에서는 굉장히 많이 사용한다.
당장 String 의 내부 메소드만 보더라도 문자열 교체는 전부 StringBuilder 를 사용하고있다.
그러면 이 StringBuilder 란 도대체 무엇일까?
StringBuilder 클래스
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, Comparable<StringBuilder>, CharSequence {
StringBuilder 클래스를 보면 AbstractStringBuilder 라는 추상클래스를 상속받아 사용하고있다.
AbstractStringBuilder는 문자열을 조작하는 데 필요한 기본적인 기능과 데이터를 관리한다. 이를 통해 StringBuilder와 StringBuffer가 코드 중복 없이 효율적으로 문자열을 처리할 수 있게 되는것이다. 즉 문자열을 관리하는 공통 기능을 추상 클래스화 한것이다.
주요 필드
- value:
- char[] value: 문자열 데이터를 저장하는 배열
- 문자열이 이 배열에 저장되며, 배열의 크기는 필요에 따라 동적으로 조절될 수 있다
- count:
- int count: 현재 문자열의 길이
- 배열에서 실제 문자열 데이터의 길이를 나타내며, 배열의 길이와는 다를 수 있다.
주요 메서드
AbstractStringBuilder는 다양한 문자열 조작 메서드를 제공하며, StringBuilder와 StringBuffer가 이를 사용하여 문자열을 효율적으로 처리할 수 있도록 합니다. 몇 가지 주요 메서드는 다음과 같습니다:
append()
public AbstractStringBuilder append(String str) { if (str == null) { return appendNull(); } int len = str.length(); ensureCapacityInternal(count + len); putStringAt(count, str); count += len; return this; }
AbstractStringBuilder 는 사실상 char[] (JDK9부터는 byte[]로 저장) 로 되어있는데, byte[] value 배열을 사용하여 문자열 데이터를 저장하고. 새로운 데이터를 추가할 때, 필요한 경우 내부 배열의 크기를 조정하여 데이터를 저장합니다.
delete()
public AbstractStringBuilder delete(int start, int end) { int count = this.count; if (end > count) { end = count; } checkRangeSIOOBE(start, end, count); int len = end - start; if (len > 0) { shift(end, -len); this.count = count - len; } return this; } private void shift(int offset, int n) { System.arraycopy(value, offset << coder, value, (offset + n) << coder, (count - offset) << coder); }
이제 Delete 의 내부 동작에 대해 쉽게 예시를 해보자면
- "abcdef" 문자열이 있고 각 위치는 012345 가 있다.
- 이 중에 3 (d) 를 삭제하려면
- abc 이후 def 중 ef 를 왼쪽으로 한칸씩 옮긴다 -> abceff
- 이후 문자열의 사이즈 개수를 한개 줄인다. -> abcef
이미 String 에서 많은것을 보았으니 이정도면 충분하다.
StringBuffer
StringBuffer 클래스는 Java에서 문자열을 조작하는 데 사용되는 가변(mutable) 문자열 클래스입니다. StringBuffer는 String과 달리 문자열을 변경할 수 있으며, 여러 스레드가 동시에 안전하게 사용할 수 있도록 동기화(synchronized)되어 있습니다.
주요 특징
- 가변성 (Mutability):
- StringBuffer 객체는 생성된 후에도 그 내부의 문자열을 변경할 수 있습니다. 이는 String의 불변성과 대조적입니다.
- 동기화 (Synchronization):
- StringBuffer의 모든 공용 메서드는 동기화되어 있습니다. 이는 여러 스레드가 동시에 같은 StringBuffer 인스턴스를 수정하더라도 데이터 일관성을 유지할 수 있도록 합니다.
- 성능:
- StringBuffer는 String과 달리 문자열 변경 시 새로운 객체를 생성하지 않으므로, 문자열을 빈번하게 수정해야 하는 경우 성능이 뛰어납니다.
- 그러나 동기화 오버헤드로 인해 단일 스레드 환경에서는 StringBuilder보다 성능이 떨어질 수 있습니다.
차이점
StringBuffer 는 동기화 StringBuilder 는 비동기화
동기화와 비동기화의 장단점은 추후 다시 설명하겠다. 그냥 간단하게 저렇게 알면된다.
몽말인지 알지? 추가
String + String 에서 + 는 도대체 무슨역할일까?
String 의 더하기는 컴파일에서 StringBuilder 를 통한 더하기가 된다.
//Java 코드 String str1 = "Hello"; String str2 = "World"; String result = str1 + " " + str2; //변환 String result = new StringBuilder() .append(str1) .append(" ") .append(str2) .toString();
그렇기에 굳이 StringBuilder 를 통해 직접적으로 합치지 않아도 된다.
그리고 추가로 자동 최적화가 있는데, 바로 스트링 리터럴 문자열 더하기이다.
//Java 코드 String result = "Hello" + " " + "World"; //컴파일 String result = "Hello World";
그렇기에 굳이 매번 StringBuilder 를 통해서 더할필요 없다.
'CS' 카테고리의 다른 글
Java) 컴파일, 인터프리터 그리고 자바 (0) 2024.11.10 Java) String 부수기 (0) 2024.08.06 Java) 정규표현식 (5) 2024.08.05 Java) 가비지 컬렉션 (0) 2024.08.04 - value: