String과 StringBuilder의 차이점은 주로 불변성(immutability), 성능, 그리고 **동기화(synchronization)**에 있습니다.
🔍 1. 불변성(immutability)
- String: 불변(immutable) 객체 → 한 번 생성되면 내부 값 변경 불가
- 문자열을 변경하면 새로운 객체가 생성되어 메모리에 저장
- StringBuilder: 가변(mutable) 객체 → 내부 버퍼를 변경할 수 있음
- 문자열을 변경해도 같은 객체를 유지
String str = "Hello";
str += " World"; // 새로운 String 객체 생성 (기존 "Hello"는 GC 대상)
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 같은 객체 내부에서 문자열 변경
💡포인트: 문자열을 자주 변경해야 한다면 StringBuilder가 성능 면에서 유리해요.
⚡ 2. 성능(Performance)
- String은 문자열 변경 시 매번 새로운 객체를 생성하므로 속도가 상대적으로 느림
- StringBuilder는 내부 버퍼를 수정하므로 성능이 훨씬 빠름
성능 비교 예제
// String
long start = System.nanoTime();
String text = "";
for (int i = 0; i < 10000; i++) {
text += i; // 문자열 변경 시마다 새 객체 생성
}
long end = System.nanoTime();
System.out.println("String 시간: " + (end - start) + "ns");
// StringBuilder
start = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i); // 동일 객체에서 수정
}
end = System.nanoTime();
System.out.println("StringBuilder 시간: " + (end - start) + "ns");
결과: StringBuilder가 훨씬 빠르게 동작
🔒 3. 스레드 안전성(Thread-Safety)
- String: 불변이므로 스레드 안전
- StringBuilder: 스레드 안전하지 않음 (동기화 X)
- StringBuffer: StringBuilder와 동일하지만 스레드 안전 (동기화 처리)
💡포인트:
- 단일 스레드 환경 → StringBuilder
- 멀티 스레드 환경 → StringBuffer
🛠️ 4. 주요 메서드 차이
기능 String StringBuilder
문자열 추가 | +, concat() | append(), insert() |
문자열 변경 | 변경 불가 | replace(), setCharAt() |
문자열 삭제 | 불가능 | delete(), deleteCharAt() |
역순 변경 | 불가능 | reverse() |
🎯 정리
특성 String StringBuilder
불변성 | O (Immutable) | X (Mutable) |
성능 | 느림 | 빠름 |
스레드 안전성 | O (Thread-safe) | X (Thread-unsafe) |
사용 시점 | 변경이 적은 경우 | 변경이 빈번할 경우 |
👉 결론:
- 문자열이 거의 변경되지 않으면 String 사용
- 문자열을 자주 수정해야 한다면 StringBuilder 사용
- 멀티스레드 환경에서 문자열을 자주 수정해야 한다면 StringBuffer 사용
'개발공부 > Java(JPA)' 카테고리의 다른 글
[Java] Map 과 HashMap의 차이점! (0) | 2025.02.17 |
---|---|
[JPA] JPA에서 동기(Synchronous) vs 비동기(Asynchronous) (0) | 2025.02.17 |
JPA 란? (1) | 2025.02.13 |
Entity (0) | 2025.02.13 |
Repository (0) | 2025.02.13 |