개발/자바

StringBuffer vs String vs StringBuilder

피터JK 2025. 2. 13. 10:59
728x90

🔹 StringBuffer 개요

StringBuffer는 Java에서 문자열을 다룰 때 사용되는 클래스로, 가변(mutable) 문자열을 다룰 수 있도록 설계되었습니다.

👉 StringBuffer는 String과 다르게, 문자열을 변경할 수 있습니다!

  • String은 불변(immutable) 객체이므로, 문자열을 수정하면 새로운 객체가 생성됩니다.
  • 반면, StringBuffer는 내부 버퍼(buffer)를 사용하여 문자열을 변경 가능하도록 만듭니다.

🔹 StringBuffer vs String vs StringBuilder

클래스 변경 가능 여부 동기화(멀티스레드 안전) 성능
String ❌ (불변) ✅ (스레드 안전) 느림 (새 객체 생성)
StringBuffer ✅ (가변) ✅ (스레드 안전) 보통 (멀티스레드 지원)
StringBuilder ✅ (가변) ❌ (스레드 안전 X) 빠름 (싱글스레드 환경)

멀티스레드 환경에서는 StringBuffer 사용
싱글스레드 환경에서는 StringBuilder 사용 (더 빠름!)


🔹 StringBuffer 생성 방법

// 기본 생성자 (초기 용량 16)
StringBuffer sb1 = new StringBuffer();

// 특정 문자열로 초기화
StringBuffer sb2 = new StringBuffer("Hello");

// 초기 용량 지정
StringBuffer sb3 = new StringBuffer(50);

🔹 StringBuffer 주요 메서드

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); // "Hello"
System.out.println(sb);

👉 특정 범위의 문자를 삭제합니다.

StringBuffer sb = new StringBuffer("Hello");
sb.deleteCharAt(4); // "Hell"
System.out.println(sb);

👉 특정 위치의 한 문자만 삭제합니다.


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("Hello");
sb.reverse();
System.out.println(sb); // "olleH"

👉 문자열을 반대로 뒤집습니다.


6️⃣ 문자열 길이 확인 (length())

StringBuffer sb = new StringBuffer("Hello");
System.out.println(sb.length()); // 5

7️⃣ 버퍼 크기 확인 (capacity())

StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity()); // 16 (기본 용량)

StringBuffer sb2 = new StringBuffer("Hello");
System.out.println(sb2.capacity()); // 16 + 5 = 21

👉 StringBuffer는 내부적으로 기본 용량(16) + 문자열 길이만큼 저장 공간을 가집니다.


🔹 StringBuffer vs StringBuilder 성능 비교

public class StringBufferTest {
    public static void main(String[] args) {
        long startTime, endTime;

        // StringBuffer 테스트
        StringBuffer sb = new StringBuffer();
        startTime = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            sb.append("a");
        }
        endTime = System.nanoTime();
        System.out.println("StringBuffer 실행 시간: " + (endTime - startTime) + "ns");

        // StringBuilder 테스트
        StringBuilder sb2 = new StringBuilder();
        startTime = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            sb2.append("a");
        }
        endTime = System.nanoTime();
        System.out.println("StringBuilder 실행 시간: " + (endTime - startTime) + "ns");
    }
}

실행 결과:
StringBuilder가 StringBuffer보다 빠릅니다.
싱글스레드 환경에서는 StringBuilder를 사용하는 것이 좋습니다!


🎯 정리

추천 클래스  
문자열이 변하지 않는 경우 String
멀티스레드 환경에서 문자열 변경 StringBuffer
싱글스레드 환경에서 문자열 변경 (빠름) StringBuilder

🔥 멀티스레드 환경에서는 StringBuffer, 성능이 중요한 경우 StringBuilder 사용!
🚀 이해가 잘 되셨나요? 😊

728x90