반응형
✅ StringBuilder란?
: Java에서 문자열을 효율적으로 조작할 수 있도록 제공되는 클래스
String은 불변(immutable) 특성 때문에 문자열을 반복적으로 수정하면 매번 새로운 객체가 생성되어 성능이 떨어질 수 있다. 이를 보완하기 위해 StringBuilder는 내부 버퍼(buffer) 를 이용하여 문자열을 변경할 수 있게 해준다.
📊 *버퍼(buffer) 참고
버퍼는 간단히 말해 임시 저장 공간이다. StringBuilder는 문자열을 붙일 때마다 새로운 객체를 만들지 않고, 내부 버퍼에 계속 내용을 추가하면서 수정할 수 있음.
String (불변)
"H" + "e" → "He" (새 객체)
+ "l" → "Hel" (새 객체)
+ "l" → "Hell" (새 객체)
+ "o" → "Hello" (새 객체)
StringBuilder (가변, 버퍼)
[ 'H', 'e', 'l', 'l', 'o', ..., ..., ... ] ← 버퍼에 계속 추가됨
✅ 주요 메서드
메서드명 | 설명 |
append(String s) | 문자열 추가 |
insert(int offset, String s) | 특정 위치에 문자열 삽입 |
delete(int start, int end) | 부분 문자열 삭제 |
reverse() | 문자열 뒤집기 |
toString() | 최종 문자열 반환 |
✅ 활용 예시
1. 문자열 뒤집기
String str = "abcde";
String reversed = new StringBuilder(str).reverse().toString(); // 출력: edcba
2. 반복문으로 문자열 이어붙이기
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
sb.append(i);
}
System.out.println(sb.toString()); // 출력: 12345
3. 문자열 배열 이어붙이기
String[] arr = {"apple", "banana", "cherry"};
StringBuilder sb = new StringBuilder();
for (String s : arr) {
sb.append(s).append(" ");
}
System.out.println(sb.toString().trim()); // 출력: apple banana cherry
✅ String / StringBuilder / StringBuffer 비교
클래스 | 불변성 | 안전성 | 속도 | 사용 시점 |
String | ✅ 불변 | ✅ 안전 | ❌ 느림 | 값이 바뀌지 않는 문자열, 간단한 처리 |
StringBuilder | ❌ 가변 | ❌ 비안전 | ✅ 빠름 | 단일 쓰레드에서 문자열을 많이 조작할 때 |
StringBuffer | ❌ 가변 | ✅ 안전 | ⏸ 중간 | 멀티스레드 환경에서 문자열 조작이 필요한 경우 |
*StringBuffer는 StringBuilder와 거의 동일한 기능을 제공하지만, 모든 메서드에 synchronized 키워드가 붙어 있어 스레드에 안전함.
But, 그만큼 성능이 느릴 수 있으므로 멀티스레드 환경에서만 사용하는 것이 좋음
◾ 예시 사용 상황
사용 상황 | 추천 클래스 | 이유 |
문자열을 반복해서 누적하거나 편집해야 할 때 | StringBuilder | 성능 좋고 메모리 효율적 |
문자열이 자주 바뀌지 않고, 간단하게 다룰 때 | String | 코드가 더 직관적이고 간결함 |
한 번 생성한 문자열을 계속 참조하거나 비교할 때 | String | 불변성으로 인해 안정적이며 예측 가능 |
여러 스레드가 동시에 접근하는 환경 | StringBuffer | StringBuilder는 스레드 안전하지 않음 |
*문자열이 자주 바뀌고 덧붙이거나 수정해야 한다면 StringBuilder 사용을 고려하고, 그렇지 않고 간단하게 다룰 수 있으면 String으로도 충분
반응형
'Backend > Java' 카테고리의 다른 글
[Java]DTO는 항상 만들어야 할까? (0) | 2025.04.09 |
---|---|
[Java] 클래스 파일 -> 자바 파일로 디컴파일 하는 법(jad decomplier 사용) (2) | 2024.09.24 |
[Java]split() 메서드 (0) | 2024.09.11 |
[Java]중첩 클래스(Nested Class) (2) | 2024.02.24 |
[Java] throws와 throw의 차이 (0) | 2024.02.23 |