Skip to content

Latest commit

 

History

History
131 lines (90 loc) · 4.67 KB

stringbuffer-vs-string-vs-stringbuilder.md

File metadata and controls

131 lines (90 loc) · 4.67 KB

StringBuffer vs String vs StringBuilder

좋은 질문이야! StringBuffer는 자바에서 문자열을 효율적으로 다루기 위해 제공되는 가변 문자열 객체 중 하나야. 문자열을 자주 수정해야 하는 경우, StringBuffer는 불변 객체인 String보다 성능적으로 더 유리해.


1. StringBuffer란?

  • StringBuffer는 자바에서 문자열을 **수정 가능한 객체(Mutable Object)**로 다룰 수 있도록 만들어진 클래스야.
  • 문자열을 추가하거나 수정할 때 새로운 객체를 생성하지 않고, 기존 객체를 수정하기 때문에 메모리와 성능을 효율적으로 사용할 수 있어.

예시: String과 StringBuffer의 차이

// String: 새로운 객체를 계속 생성
String str = "Hello";
str = str + " World";  // 새로운 문자열 객체 생성 ("Hello World")
System.out.println(str);  // 출력: Hello World

// StringBuffer: 기존 객체를 수정
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");  // 기존 객체에 문자열 추가
System.out.println(sb.toString());  // 출력: Hello World
  • String"Hello World"라는 새로운 객체를 생성했지만,
    StringBuffer는 기존 객체에 " World"를 추가했어.

2. StringBuffer의 주요 특징

  1. 가변성(Mutable)
    • StringBuffer는 문자열을 수정 가능한 상태로 유지해.
    • 문자열에 값을 추가하거나, 삭제하거나, 특정 위치에 삽입할 수 있어.
  2. 동기화(Synchronized)
    • StringBuffer는 **스레드-안전(Thread-Safe)**한 클래스야.
    • 여러 스레드가 동시에 StringBuffer를 수정해도 문제가 없도록 설계됐어.
    • 그러나 동기화 때문에 StringBuilder보다 조금 느릴 수 있어.
  3. 유연한 메모리 관리
    • StringBuffer는 내부적으로 **버퍼(buffer)**를 사용해서 문자열 크기를 관리해.
    • 필요할 때만 크기를 늘려가므로 메모리를 효율적으로 사용할 수 있어.

3. StringBuffer와 StringBuilder의 차이

  • StringBuffer는 **동기화(Synchronized)**를 지원해서 멀티스레드 환경에서 안전하게 사용할 수 있어.
  • StringBuilder는 동기화를 지원하지 않아서, 싱글 스레드 환경에서 더 빠르게 동작해.

간단한 비교:

특성 String StringBuffer StringBuilder
가변성 불변 (Immutable) 가변 (Mutable) 가변 (Mutable)
동기화 불필요 동기화 지원 (Thread-Safe) 동기화 없음 (더 빠름)
성능 느림 동기화로 약간 느림 동기화가 없어 빠름
멀티스레드 환경 적합하지 않음 적합 적합하지 않음

4. StringBuffer 주요 메서드

StringBuffer에는 문자열을 다루기 위한 다양한 메서드가 있어. 몇 가지 유용한 메서드를 살펴보자:

(1) append(String str)

문자열을 끝에 추가.

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb);  // 출력: Hello World

(2) insert(int offset, String str)

특정 위치에 문자열 삽입.

StringBuffer sb = new StringBuffer("Hello");
sb.insert(5, " Java");
System.out.println(sb);  // 출력: Hello Java

(3) replace(int start, int end, String str)

특정 범위의 문자열을 다른 문자열로 교체.

StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb);  // 출력: Hello Java

(4) delete(int start, int end)

특정 범위의 문자열 삭제.

StringBuffer sb = new StringBuffer("Hello World");
sb.delete(5, 11);
System.out.println(sb);  // 출력: Hello

(5) reverse()

문자열을 뒤집기.

StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb);  // 출력: olleH

5. 언제 StringBuffer를 사용할까?

  • 문자열을 자주 변경하거나 추가/삭제해야 할 때.
  • 멀티스레드 환경에서 문자열 작업을 안전하게 처리해야 할 때.

요약

  • StringBuffer는 문자열을 효율적으로 다룰 수 있는 가변 클래스야.
  • 동기화 기능이 있어서 멀티스레드 환경에서 안전하게 사용할 수 있어.
  • 하지만 동기화가 필요하지 않다면 StringBuilder를 사용하는 게 더 빠르고 적합할 수 있어.

궁금한 점이 있으면 언제든 물어봐! 😊