문자열을 조작하는데 사용하되는 클래스
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 |