본문 바로가기
알고리즘

[자료구조] StringBuilder 란?

by xunxou 2024. 9. 18.

1. StringBuilder란?

자바에서 문자열을 효율적으로 조작하기 위해 사용하는 클래스 입니다.

문자열을 반복적으로 변경해야 하는 상황에서 성능을 최적화 할 수 있도록 설계되었습니다.

문자열을 생성, 연결, 수정하는 작업에서 성능 이점을 제공합니다.

 

다음과 같은 경우, 사용하면 유용합니다.

  • 반복문 내에서 문자열을 계속해서 연결하거나 수정하는 경우
  • 대량의 문자열을 조작하는 경우
  • 성능이 중요한 어플리테이션에서 문자열을 자주 변경하는 경우

 

 

2. 특징

동기화

StringBuilder는 동기화(synchronized) 되지 않습니다.

따라서 멀티스레드 환경에서는 안전하지 않으며, 동기화가 필요한 경우 StringBuffer를 사용하는 것이 좋습니다.

 

성능

문자열의 반복적인 연결, 삽입, 수정이 필요한 경우 String 보다 훨씬 빠른 성능을 제공합니다.

 

기본용량

StringBuilder는 기본적으로 16개의 문자를 저장할 수 있는 초기 용량을 가지며, 필요에 따라 크기가 자동으로 증가합니다.

 

 

3. StringBuilder 장단점

장점

  • 문자열을 자주 변경해야 하는 경우 String 보다 훨씬 빠릅니다
  • 동적으로 크기가 조정되며, 메모리와 성능이 최적화 됩니다
  • 다양한 문자열 조작 메서드를 제공하여 유연하게 사용 가능합니다.

 

단점

  • 동기화 되지 않아 멀티스레드 환경에서는 사용 시 주의가 필요합니다
  • 멀티스레드 환경에서는 StringBuffer를 사용하는 것이 더 안전합니다.

 

 

4. StringBuilder vs String

불변성과 가변성

String 객체는 불변(immutable) 입니다.

즉, 한번 생성된 문자열은 변경할 수 없으며 문자열을 변경할 때마다 새로운 String 객체가 생성됩니다.

그러나 StringBuilder는 가변(mutable) 객체로, 문자열의 내용이 변경되더라도 새로운 객체를 생성하지 않고 내부 버퍼에서 수정이 이루어집니다.

따라서 문자열을 연결하거나 수정할때 StringBuilder 는 기존 문자열에 새로운 내용을 추가하는 방식으로 작동하므로 메모리와 성능면에서 String 보다 효율적입니다.

 

 

5. Java에서 StringBuilder

5.1. java에서 StringBuilder 클래스 구현

코드

public class StringBuilder {
    private char[] value;
    private int size;
    private int index;

    public StringBuilder() {
        size = 1;
        value = new char[size];
        index = 0;
    }

    // 문자열 추가
    public void append(String str) {
        if(str == null) str = "null";
        int len = str.length();
        ensureCapacity(len);
        for(int i = 0; i< str.length(); i++) {
            value[index] = str.charAt(i);
            index++;
        }
    }

    // 문자열을 담기에 넉넉한지 확인하고 부족하면 늘려준다.
    private void ensureCapacity(int len) {
        if(index + len > size) {
            size = (size+len) * 2;
            char[] newValue = new char[size];
            for(int i = 0; i < value.length; i++){
                newValue[i] = value[i];
            }
            value = newValue;
        }
    }

    // 배열의 0번부터 index 까지의 모든 char를 문자로 변환하여 반환
    public String toString(){
        return new String(value, 0, index);
    }
}

 

 

실행

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    sb.append("Code");
    sb.append("Bee");
    sb.append(" is");
    sb.append(" nice");
    System.out.println(sb.toString());
}

 

 

결과 출력

CodeBee is nice

 

 

 

5.2. Java에서 StringBuilder 클래스 사용

주요 메서드

  • append() : 문자열이나 다른 형식의 데이터를 현재 StringBuilder 객체 끝에 추가
  • insert() :  지정한 위치에 문자열을 삽입
  • delete() : 지정한 범위의 문자열을 삭제
  • replace() : 지정한 범위의 문자열을 다른 문자열로 대체
  • reverse() : 문자열의 순서를 역순으로 변경
  • toString() : StringBuilder 객체에 저장된 내용을 String 객체로 변환

 

코드

public static void main(String[] args) {
    // StringBuilder 객체 생성
    StringBuilder sb = new StringBuilder("Hello");

    // 문자열 추가
    sb.append(" Bee!");
    System.out.println(sb.toString());  // 출력: Hello Bee!

    // 문자열 삽입
    sb.insert(6, "Code");
    System.out.println(sb.toString());  // 출력: Hello CodeBee!

    // 문자열 삭제
    sb.delete(13, 14);
    System.out.println(sb.toString());  // 출력: Hello CodeBee

    // 문자열 대체
    sb.replace(6, 13, "Everyone");
    System.out.println(sb.toString());  // 출력: Hello Everyone

    // 문자열 역순
    sb.reverse();
    System.out.println(sb.toString());  // 출력: enoyrevE olleH
}

 

 

결과 출력

Hello Bee!
Hello CodeBee!
Hello CodeBee
Hello Everyone
enoyrevE olleH

 


참고자료

챗 gpt

youtube - 엔지니어 대한민국 님

'알고리즘' 카테고리의 다른 글

[자료구조] ArrayList 란?  (2) 2024.09.03
[자료구조]해시테이블(HashTable) 이란?  (0) 2024.09.02