ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java) StringBuilder 와 StringBuffer
    CS 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가 코드 중복 없이 효율적으로 문자열을 처리할 수 있게 되는것이다. 즉 문자열을 관리하는 공통 기능을 추상 클래스화 한것이다.

     

    주요 필드

    1. value:
      • char[] value: 문자열 데이터를 저장하는 배열
      • 문자열이 이 배열에 저장되며, 배열의 크기는 필요에 따라 동적으로 조절될 수 있다
    2. 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 의 내부 동작에 대해 쉽게 예시를 해보자면

    1. "abcdef" 문자열이 있고 각 위치는 012345 가 있다.
    2. 이 중에 3 (d) 를 삭제하려면
    3. abc 이후 def 중 ef 를 왼쪽으로 한칸씩 옮긴다 -> abceff
    4. 이후 문자열의 사이즈 개수를 한개 줄인다. -> abcef

     

    이미 String 에서 많은것을 보았으니 이정도면 충분하다.

     

    StringBuffer


    StringBuffer 클래스는 Java에서 문자열을 조작하는 데 사용되는 가변(mutable) 문자열 클래스입니다. StringBuffer는 String과 달리 문자열을 변경할 수 있으며, 여러 스레드가 동시에 안전하게 사용할 수 있도록 동기화(synchronized)되어 있습니다.

    주요 특징

    1. 가변성 (Mutability):
      • StringBuffer 객체는 생성된 후에도 그 내부의 문자열을 변경할 수 있습니다. 이는 String의 불변성과 대조적입니다.
    2. 동기화 (Synchronization):
      • StringBuffer의 모든 공용 메서드는 동기화되어 있습니다. 이는 여러 스레드가 동시에 같은 StringBuffer 인스턴스를 수정하더라도 데이터 일관성을 유지할 수 있도록 합니다.
    3. 성능:
      • 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

    댓글

Designed by Tistory.