StringBuilder

hoon·2025년 1월 21일

JAVA

목록 보기
11/21

StringBuilder는 Java에서 문자열을 효율적으로 조작하기 위한 클래스다. 문자열은 일반적으로 불변(immutable)이기 때문에, 문자열 조작 작업이 많을 경우 성능 문제가 생길 수 있다. StringBuilder는 이런 문제를 해결하기 위해 설계되었으며, 가변성(mutable)을 제공한다.

아래에서 StringBuilder의 특징, 주요 메서드, 사용법 등을 정리해보겠다.


1. StringBuilder란?

  • Java의 java.lang 패키지에 포함된 클래스.
  • 문자열을 조작할 때 효율적인 가변적 문자열 클래스.
  • 내부적으로 문자열을 저장하기 위해 버퍼를 사용.
  • 문자열 추가, 삭제, 변경 작업이 빈번할 경우 String보다 성능이 뛰어남.

2. String과 StringBuilder의 차이점

특징StringStringBuilder
가변성불변 (immutable)가변 (mutable)
메모리 효율성문자열 조작 시 매번 새로운 객체 생성문자열 조작 시 동일 객체에서 변경
스레드 안정성스레드 안전 (thread-safe)스레드 안전하지 않음
속도상대적으로 느림빠름 (GC 부담 적음)

3. StringBuilder 생성

StringBuilder sb = new StringBuilder();           // 빈 문자열 생성
StringBuilder sb2 = new StringBuilder("Hello");   // 초기 문자열 설정
  • 생성자:
    • StringBuilder() : 빈 버퍼를 가진 StringBuilder 객체 생성.
    • StringBuilder(String str) : 초기 문자열을 가진 객체 생성.
    • StringBuilder(int capacity) : 초기 버퍼 크기를 설정.

4. 주요 메서드

(1) 문자열 추가

  • append(String str):
    • 문자열을 끝에 추가.
    • 반환값: this (현재 StringBuilder 객체)
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // "Hello World"
  • insert(int offset, String str):
    • 특정 위치에 문자열 삽입.
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
System.out.println(sb); // "Hello World"

(2) 문자열 삭제

  • delete(int start, int end):
    • 특정 범위의 문자열 삭제. (end는 포함하지 않음)
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11);
System.out.println(sb); // "Hello"
  • deleteCharAt(int index):
    • 특정 인덱스의 문자 삭제.
StringBuilder sb = new StringBuilder("Hello");
sb.deleteCharAt(4);
System.out.println(sb); // "Hell"

(3) 문자열 변경

  • replace(int start, int end, String str):
    • 특정 범위의 문자열을 다른 문자열로 교체.
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // "Hello Java"
  • setCharAt(int index, char ch):
    • 특정 인덱스의 문자를 변경.
StringBuilder sb = new StringBuilder("Hello");
sb.setCharAt(0, 'Y');
System.out.println(sb); // "Yello"

(4) 문자열 뒤집기

  • reverse():
    • 문자열의 순서를 뒤집음.
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // "olleH"

(5) 문자열 관련 정보 얻기

  • length(): 현재 문자열 길이 반환.
  • capacity(): 내부 버퍼 크기 반환.
  • charAt(int index): 특정 인덱스의 문자 반환.
StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.length());   // 5
System.out.println(sb.capacity()); // 기본값: 16 + 초기 문자열 길이
System.out.println(sb.charAt(1));  // 'e'

(6) 버퍼 관리

  • ensureCapacity(int minimumCapacity):
    • 내부 버퍼 크기를 설정.
  • trimToSize():
    • 문자열에 맞게 버퍼 크기를 줄임.

5. StringBuilder 사용 예제

예제 1: 문자열 뒤집기

StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // "olleH"

예제 2: 문자열 삽입 및 삭제

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");          // 추가
sb.insert(6, "Java ");        // 삽입
sb.delete(5, 11);             // 삭제
System.out.println(sb);       // "Hello Java"

예제 3: 효율적인 문자열 조합

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
    sb.append(i).append(", ");
}
System.out.println(sb.toString()); // "0, 1, 2, 3, 4, "

6. StringBuilder vs StringBuffer

  • StringBuilderStringBuffer의 기능은 거의 동일하다.
  • 차이점:
    • StringBuilder: 스레드 안전하지 않음, 단일 스레드 환경에서 더 빠름.
    • StringBuffer: 스레드 안전, 동기화가 필요할 때 사용.

7. 사용 시 주의점

  1. 멀티스레드 환경:

    • StringBuilder는 스레드 안전하지 않으므로 동기화가 필요한 경우 StringBuffer 사용.
  2. 메모리 관리:

    • 버퍼 크기를 초과하면 자동으로 크기를 늘리지만, 너무 자주 늘어나면 성능에 영향을 미칠 수 있음.
    • 초기 capacity를 적절히 설정하는 것이 좋음.

요약

  • StringBuilder는 문자열 조작이 빈번한 경우 사용하면 효율적.
  • 문자열 추가, 삭제, 변경, 뒤집기 등의 작업을 제공.
  • 단일 스레드 환경에서 String이나 StringBuffer보다 더 빠름.
  • 스레드 안전이 필요하지 않은 경우 적합.

0개의 댓글