
String은 불변 객체 (immutable)로 값이 바뀌면 → 새로 생성됨 → 메모리 낭비 → 성능 나빠짐
StringBuilder, StringBuffer는 가변 객체 → 수정에 유리
| 구분 | String | StringBuilder | StringBuffer |
|---|---|---|---|
| 특성 | ❌ 불변 | ✅ 가변 | ✅ 가변 (멀티스레드용) |
| 속도 | 🐢 느림 | ⚡가장 빠름 | 🏃♀️➡️ 상대적으로 느림 (동기화 비용) |
| 동기화 | ❌ | ❌ | ✅ |
| 추천 환경 | 불변 문자 | 단일 스레드 | 멀티 스레드 |
String str = "Hello";
str += " World"; // 내부적으로 새로운 String 객체 생성
System.out.println(str); // Hello World
+ 연산할 때마다 새 객체 생성 ➔ 문자열 많아지면 시간 폭탄💣
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
System.out.println(sb.toString()); // Hello World
기존 객체 안에서 이어 붙임 ➔ 속도 훨씬 빠름!
StringBuffer sbf = new StringBuffer();
sbf.append("Hello");
sbf.append(" World");
System.out.println(sbf.toString()); // Hello World
➔ StringBuilder랑 비슷하지만, synchronized로 멀티스레드 안전!
String = 읽기 전용
StringBuilder = 수정 많은 단일 스레드
StringBuffer = 수정 많은 멀티 스레드
+) 알고리즘에서 출력할 땐 StringBuilder 쓰는 게 시간 초과 방지
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
sb.append("숫자: ").append(i).append("\n");
}
System.out.print(sb);
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
// 문자열 중간에 삽입
sb.insert(5, " World"); // "Hello" 뒤에 " World" 추가
System.out.println(sb); // 출력: Hello World
// 일부 삭제
sb.delete(5, 11); // " World" 삭제
System.out.println(sb); // 출력: Hello
// 문자열 뒤집기
sb.reverse();
System.out.println(sb); // 출력: olleH
}
}