어제 오늘 내일

[Java] StringBuffer 클래스 사용법 및 예제 (String, StringBuffer, StringBuilder 비교) 본문

IT/Java

[Java] StringBuffer 클래스 사용법 및 예제 (String, StringBuffer, StringBuilder 비교)

hi.anna 2025. 3. 14. 06:46

Java StringBuffer 클래스 사용법 및 예제

StringBuffer 클래스는 String과 달리 변경 가능한(mutable) 문자열을 다룰 수 있으며,

StringBuilder와 유사하지만

멀티스레드 환경에서 안전(Thread-safe)하게 동작합니다.

내부적으로 동기화(synchronized)가 적용되어 있어 여러 스레드가 동시에 접근해도

안정적으로 문자열을 수정할 수 있습니다.

 

1. StringBuffer 생성

StringBuffer sb1 = new StringBuffer(); // 빈 문자열 생성
StringBuffer sb2 = new StringBuffer("Hello"); // 초기 문자열 설정
StringBuffer sb3 = new StringBuffer(50); // 초기 용량(capacity) 설정
  • StringBuffer() : 빈 문자열 생성 (기본 용량 16)
  • StringBuffer(String str) : 주어진 문자열로 초기화
  • StringBuffer(int capacity) : 지정한 용량(capacity)으로 생성

 

2. 주요 메서드

1) 문자열 추가 (append)

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
  • 기존 객체를 수정하여 문자열을 추가할 수 있어 성능이 좋습니다.

2) 문자열 삽입 (insert)

StringBuffer sb = new StringBuffer("Hello");
sb.insert(5, " Java");
System.out.println(sb); // Hello Java
  • 특정 위치에 문자열을 삽입할 수 있음.

3) 문자열 삭제 (delete, deleteCharAt)

StringBuffer sb = new StringBuffer("Hello World");
sb.delete(5, 11); // " World" 삭제
System.out.println(sb); // Hello

sb.deleteCharAt(0); // 첫 번째 문자 'H' 삭제
System.out.println(sb); // ello
  • delete(start, end): 특정 범위의 문자열 삭제
  • deleteCharAt(index): 특정 위치의 문자 하나만 삭제

4) 문자열 변경 (replace)

StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // Hello Java
  • 특정 범위의 문자열을 다른 문자열로 교체할 수 있음.

5) 문자열 뒤집기 (reverse)

StringBuffer sb = new StringBuffer("abcd");
sb.reverse();
System.out.println(sb); // dcba
  • 문자열을 반대로 정렬함.

6) 문자열 길이 및 용량 관리 (length, capacity, ensureCapacity)

StringBuffer sb = new StringBuffer("Hello");
System.out.println(sb.length()); // 5
System.out.println(sb.capacity()); // 기본 용량(16) + "Hello" 길이(5)

sb.ensureCapacity(50); // 최소 50의 용량을 확보
System.out.println(sb.capacity()); // 변경된 용량 출력
  • length(): 현재 문자열의 길이 반환
  • capacity(): 내부 버퍼의 총 크기 반환
  • ensureCapacity(n): 최소 용량을 n 이상으로 설정하여 성능 최적화 가능

 

3. String, StringBuffer, StringBuilder 비교

  String StringBuffer StringBuilder
변경 가능 여부 불변 (Immutable) 가변 (Mutable) 가변 (Mutable)
동기화 지원 불필요 지원 (Thread-safe) 미지원 (싱글스레드에서 빠름)
성능 느림 (새로운 객체 생성) 상대적으로 느림 (동기화) 빠름 (동기화 없음)
사용 추천 환경 변경이 거의 없는 문자열 멀티스레드 환경 단일 스레드 환경에서 빠른 성능이 필요할 때
  • String은 불변 객체라서 문자열 변경이 많을 경우 비효율적.
  • StringBuffer는 동기화가 적용되어 있어 멀티스레드 환경에서 안전하지만, 성능은 StringBuilder보다 낮음.
  • StringBuilder는 동기화가 필요 없는 단일 스레드 환경에서 가장 성능이 좋음.

 

4. StringBuffer 활용 예제

1) 멀티스레드 환경에서 안전한 문자열 조작

class SharedBuffer {
    private StringBuffer buffer = new StringBuffer();

    public synchronized void appendData(String data) {
        buffer.append(data);
        System.out.println("Appended: " + data);
    }

    public synchronized String getData() {
        return buffer.toString();
    }
}

public class MultiThreadExample {
    public static void main(String[] args) {
        SharedBuffer sharedBuffer = new SharedBuffer();

        Thread t1 = new Thread(() -> sharedBuffer.appendData("Thread1 "));
        Thread t2 = new Thread(() -> sharedBuffer.appendData("Thread2 "));

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final Buffer: " + sharedBuffer.getData());
    }
}
  • synchronized 키워드를 사용하여 멀티스레드 환경에서 안전하게 문자열을 변경 가능.

 

5. 결론

  1. 문자열 변경이 적다면 String 사용 (불변 객체이므로 성능 문제 없음).
  2. 멀티스레드 환경에서 문자열을 자주 변경해야 한다면 StringBuffer 사용 (동기화 지원).
  3. 싱글스레드 환경에서 문자열을 자주 변경해야 한다면 StringBuilder 사용 (더 빠른 성능 제공).

StringBuffer는 멀티스레드 환경에서 안전하지만,

단일 스레드에서는 StringBuilder가 더 빠르므로 상황에 맞게 선택해야 합니다.

반응형
Comments