BE/Java

[Java] StringBuffer, StringBuilder

baek-dev 2024. 12. 19. 19:39

문자열을 조작하는데 사용하되는 클래스

1. StringBuilder 와 StringBuffer 의 공통점

1.1. 가변 문자열

  • `String`클래스는 불변이다. 즉, 문자열을 수정하면 새로운 문자열 객체를 생성한다
  • 반면, `StringBuilder`, `StringBuffer`는 가변적으로 설계되어 한 객체에서 문자열을 직접 수정할 수 있다
    메모리 효율성을 높이고, 문자열을 자주 수정하는 작업에서 더 빠른 성능을 제공한다

2. 차이점

특성 `StringBuilder` `StringBuffer`
쓰레드 안정성 비동기적으로 동작 (쓰레드 안전 아님) 동기화 처리
속도 더 빠름 동기화로 인해 약간 느림
사용 상황 단일 스레드 환경에서 사용 멀티 스레드 환경에서 사용
  • 쓰레드 안전(Thread-Safe) : 여러 스레드가 동시에 같은 객체를 조작해도 문제가 생기지 않는 상태를 의미한다
    StringBuffer는 쓰레드 안전성을 보장하기 위해 내부적으로 동기화(synchronization)를 사용한다
  • 따라서 멀티스레드 환경에서는 StringBuffer, 단일 스레드 환경에서는 StringBuilder를 사용하는 것이 권장된다

3. 주요 메서드

두 클래스는 동일한 메서드를 제공한다.

3.1. `append(String str)`

  • 문자열을 객체의 끝에 추가한다
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World

3.2. `insert(int offset, string str)`

  • 지정된 위치에 문자열을 삽입한다.
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " Java");
System.out.println(sb); // 출력: Hello Java

3.3. `delete(int start, int end)`

  • 지정된 범위의 문자열을 삭제한다
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11);
System.out.println(sb); // 출력: Hello

3.4. `replace(int start, int end, string str)`

  • 지정된 범위의 문자열을 다른 문자열로 대체한다
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // 출력: Hello Java

3.5. `reverse()`

  • 문자열을 뒤집습니다
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // 출력: olleH

3.6. `capacity()` 와 `length()`

  • `capacity()` : 내부 버퍼 크기를 반환한다
  • `length()` : 현재 문자열의 길이를 반환한다
StringBuilder sb = new StringBuilder("Hello");
System.out.println("Length: " + sb.length()); // 출력: Length: 5
System.out.println("Capacity: " + sb.capacity()); // 초기 용량은 16 + 문자열 길이

4. 성능 비교

  • 문자열을 자주 조작하는 작업 (예 : 반복적인 추가, 삽입, 삭제 등) 에서는 `StringBuilder`와 `StringBuffer`가 훨씬 빠르다
  • `String`으로 동일한 작업을 수행하면 매번 새로운 객체를 생성하므로 메모리와 CPU 성능에 부담을 준다

5. 활용 사례

5.1. 단일 스레드 환경에서 효율적인 문자열 조작

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Welcome");
        sb.append(" to Java");
        sb.insert(7, " everyone,");
        sb.replace(16, 20, "the world of");
        sb.delete(0, 7);
        sb.reverse();

        System.out.println(sb); // 최종 출력: avaJ fo dlrow eht
    }
}

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

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("Multithreading");
        sb.append(" is safe");
        sb.insert(14, " and synchronized,");

        System.out.println(sb); // 출력: Multithreading and synchronized, is safe
    }
}

6. 결론

 

  • 단일 스레드 환경에서 문자열 조작을 한다면 StringBuilder를 사용. 빠르고 간편하다
  • 멀티 스레드 환경에서 쓰레드 간 안전성을 보장하려면 StringBuffer를 사용
  • 두 클래스 모두 String보다 효율적이므로, 문자열을 자주 수정해야 할 경우에는 String 대신 사용하는 것이 좋다

 

 

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 프록시  (0) 2024.12.22
[Java] 쓰레드  (0) 2024.12.22
[Java] 영속성  (0) 2024.12.16
[Java] 레이어드 아키텍처와 mvc  (1) 2024.12.15
[Java] 명령형 , 선언형 프로그래밍  (0) 2024.12.12