📌 StringBuffer란?
StringBuffer는 Java에서 문자열을 다룰 때 사용되는 클래스로, 가변(mutable) 문자열을 처리할 수 있도록 설계된 객체입니다.
기본적으로 String 객체는 불변(immutable) 속성을 가지기 때문에, 문자열을 변경할 때마다 새로운 객체가 생성됩니다.
반면, StringBuffer는 기존 객체를 수정할 수 있어 메모리 효율이 좋고 속도가 빠릅니다.
📌 주요 특징
- 가변(mutable) 문자열 → String과 다르게 문자열을 직접 변경 가능
- 메모리 효율적 → String처럼 새로운 객체를 생성하지 않고 기존 객체를 수정
- 스레드 안전(thread-safe) → 멀티스레드 환경에서도 안전하게 사용 가능 (synchronized 처리)
📌 주요 메서드
메서드설명
append(String s) | 문자열을 추가 |
insert(int index, String s) | 특정 위치에 문자열 삽입 |
replace(int start, int end, String s) | 부분 문자열 교체 |
delete(int start, int end) | 특정 범위 문자열 삭제 |
deleteCharAt(int index) | 특정 위치의 문자 삭제 |
reverse() | 문자열을 뒤집음 |
length() | 문자열 길이 반환 |
toString() | StringBuffer를 String으로 변환 |
📌 예제 코드
public class StringBufferExample {
public static void main(String[] args) {
// StringBuffer 생성
StringBuffer sb = new StringBuffer("Hello");
// 문자열 추가 (append)
sb.append(" World");
System.out.println(sb); // 출력: Hello World
// 특정 위치에 문자열 삽입 (insert)
sb.insert(5, ",");
System.out.println(sb); // 출력: Hello, World
// 문자열 변경 (replace)
sb.replace(6, 7, "-");
System.out.println(sb); // 출력: Hello- World
// 문자 삭제 (delete)
sb.delete(5, 7);
System.out.println(sb); // 출력: HelloWorld
// 문자열 뒤집기 (reverse)
sb.reverse();
System.out.println(sb); // 출력: dlroWolleH
// 최종 결과를 String으로 변환
String result = sb.toString();
System.out.println("최종 문자열: " + result);
}
}
String vs StringBuffer 차이점
비교항목 | String | StringBuffer |
변경 여부 | 불변(immutable) | 가변(mutable) |
메모리 사용 | 변경 시 새 객체 생성 → 메모리 낭비 | 기존 객체 수정 → 메모리 절약 |
속도 | 문자열 변경이 잦으면 느림 | 문자열 변경이 잦으면 빠름 |
멀티스레드 안전성 | final이므로 안전 | synchronized 적용되어 안전 |
📌 언제 사용할까?
- String: 변경할 필요 없는 문자열 (ex. 불변성이 중요한 경우)
- StringBuffer: 문자열을 자주 변경해야 할 때 (append, delete 등)
- StringBuilder: StringBuffer와 동일하지만 스레드 안전성을 보장하지 않아서 단일 스레드 환경에서 더 빠름
📌 결론
- 문자열을 자주 변경해야 한다면 → StringBuffer 또는 StringBuilder 사용
- 멀티스레드 환경에서는 StringBuffer(스레드 안전)
- 단일 스레드 환경에서는 StringBuilder(더 빠름)
📌 StringBuilder란?
StringBuilder는 Java에서 가변(mutable) 문자열을 처리할 수 있도록 설계된 클래스입니다.
StringBuffer와 거의 동일하지만, synchronized(동기화)가 적용되지 않아 더 빠릅니다.
즉, 단일 스레드 환경에서 StringBuffer보다 성능이 좋습니다.
📌 주요 특징
- 가변(mutable) 문자열 → 기존 문자열을 수정할 수 있음 (String은 불변)
- 메모리 효율적 → String처럼 새로운 객체를 생성하지 않고 기존 객체를 수정
- 빠른 속도 → StringBuffer보다 동기화 비용이 없어 단일 스레드 환경에서 더 빠름
- 멀티스레드 환경에서는 안전하지 않음 → 동기화(synchronized)가 없음
📌 주요 메서드
append(String s) | 문자열을 추가 |
insert(int index, String s) | 특정 위치에 문자열 삽입 |
replace(int start, int end, String s) | 부분 문자열 교체 |
delete(int start, int end) | 특정 범위 문자열 삭제 |
deleteCharAt(int index) | 특정 위치의 문자 삭제 |
reverse() | 문자열을 뒤집음 |
length() | 문자열 길이 반환 |
toString() | StringBuilder를 String으로 변환 |
📌 예제 코드
public class StringBuilderExample {
public static void main(String[] args) {
// StringBuilder 생성
StringBuilder sb = new StringBuilder("Hello");
// 문자열 추가 (append)
sb.append(" World");
System.out.println(sb); // 출력: Hello World
// 특정 위치에 문자열 삽입 (insert)
sb.insert(5, ",");
System.out.println(sb); // 출력: Hello, World
// 문자열 변경 (replace)
sb.replace(6, 7, "-");
System.out.println(sb); // 출력: Hello- World
// 문자 삭제 (delete)
sb.delete(5, 7);
System.out.println(sb); // 출력: HelloWorld
// 문자열 뒤집기 (reverse)
sb.reverse();
System.out.println(sb); // 출력: dlroWolleH
// 최종 결과를 String으로 변환
String result = sb.toString();
System.out.println("최종 문자열: " + result);
}
}
📌 String vs StringBuffer vs StringBuilder 차이점
비교항목 | String | StringBuffer | StringBuilder |
변경 여부 | 불변(immutable) | 가변(mutable) | 가변(mutable) |
메모리 사용 | 변경 시 새 객체 생성 → 메모리 낭비 | 기존 객체 수정 → 메모리 절약 | 기존 객체 수정 → 메모리 절약 |
속도 | 문자열 변경이 잦으면 느림 | 멀티스레드 가능하지만 느림 | 멀티스레드 지원 없음, 가장 빠름 |
멀티스레드 안전성 | final이므로 안전 | synchronized 적용되어 안전 | 동기화 없음, 멀티스레드에서 안전하지 않음 |
사용 환경 | 문자열 변경이 적은 경우 | 멀티스레드 환경 | 단일 스레드 환경 (빠른 성능) |
📌 언제 사용할까?
✅ String → 문자열 변경이 거의 없고, 불변성을 유지해야 할 때
✅ StringBuffer → 멀티스레드 환경에서 안전한 문자열 조작이 필요할 때
✅ StringBuilder → 단일 스레드 환경에서 문자열 변경이 많을 때 (속도가 가장 빠름)
📌 결론
- StringBuilder는 StringBuffer보다 빠르고, 멀티스레드 환경이 아니라면 더 적합한 선택
- 멀티스레드 환경이면 StringBuffer, 단일 스레드 환경이면 StringBuilder를 사용
'ComputerScience > Java' 카테고리의 다른 글
자연 정렬(Natural Ordering)이란? - Comparable, Comparator 예제 (0) | 2025.02.27 |
---|---|
Java 객체비교 인터페이스 - Comparable, Comparator (0) | 2025.02.27 |
isNumeric()과 isDigit() : 문자가 숫자인지 확인 (+차이점) (0) | 2025.02.26 |
BufferedReader, StringTokenizer 주요 메서드 (0) | 2025.02.24 |
BufferedReader와 StringTokenizer (0) | 2025.02.24 |