반응형
알고리즘 문제를 풀며 자주 사용했던 StringBuilder
를 더 깊이 공부하고, 주요 메서드를 정리했습니다. StringBuilder
는 문자열을 효율적으로 다룰 수 있는 강력한 도구로, 이를 잘 활용하면 성능을 크게 향상시킬 수 있습니다.
1. StringBuilder란?
StringBuilder
는 가변(mutable) 문자열을 처리하기 위해 Java 1.5(Java 5)에서 도입된 클래스입니다. Java의 String
클래스는 불변(immutable)이기 때문에 문자열을 조작할 때마다 새로운 객체가 생성되는데, 이는 성능 문제를 야기할 수 있습니다. 반면 StringBuilder
는 기존 객체를 수정하여 효율적으로 문자열을 조작할 수 있습니다.
StringBuilder의 특징
- 가변성: 문자열을 추가, 수정, 삭제할 때 기존 객체를 재사용합니다.
- 싱글 스레드 환경에 최적화: 동기화를 지원하지 않으므로 멀티스레드 환경에서는 사용하지 않는 것이 좋습니다.
- 성능:
String
보다 빠르고, 멀티스레드 동기화를 지원하는StringBuffer
보다 가볍고 빠릅니다.
2. StringBuilder의 생성자
StringBuilder
는 다양한 방법으로 객체를 생성할 수 있습니다:
2.1 기본 생성자
빈 문자열로 초기화합니다.
StringBuilder sb = new StringBuilder();
2.2 문자열을 인자로 받는 생성자
초기 문자열 값을 설정할 수 있습니다.
StringBuilder sb = new StringBuilder("Hello");
2.3 초기 용량을 설정하는 생성자
초기 용량을 설정하여 성능을 최적화할 수 있습니다.
StringBuilder sb = new StringBuilder(50); // 초기 용량을 50으로 설정
3. StringBuilder의 주요 메서드
3.1 append()
문자열의 끝에 문자열, 숫자, 문자 등을 추가합니다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.append(123);
System.out.println(sb.toString()); // 출력: Hello World123
- 다양한 타입(
String
,char
,int
,boolean
,double
등)을 받을 수 있어 편리합니다. - 반환 타입이
StringBuilder
이므로, 메서드 체이닝이 가능합니다:
sb.append(" World").append(123).append('!');
3.2 insert()
지정된 위치에 문자열이나 값을 삽입합니다.
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " Java");
System.out.println(sb.toString()); // 출력: Hello Java
- 특정 인덱스에 값을 삽입할 수 있으며, 이 때 문자열이 자동으로 오른쪽으로 이동합니다.
- 다양한 타입(
String
,char
,int
등)을 삽입할 수 있습니다.
3.3 delete() deleteCharAt()
문자열의 특정 부분을 삭제합니다.
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11); // 인덱스 5부터 11 이전까지 삭제
System.out.println(sb.toString()); // 출력: Hello
sb.deleteCharAt(0); // 첫 번째 문자 'H' 삭제
System.out.println(sb.toString()); // 출력: ello
delete(int start, int end)
: 특정 범위(start ~ end-1)의 문자열을 삭제합니다.deleteCharAt(int index)
: 특정 인덱스의 문자 하나를 삭제합니다.
3.4 replace()
특정 인덱스 범위의 문자열을 다른 문자열로 교체합니다.
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb.toString()); // 출력: Hello Java
replace(int start, int end, String str)
: 인덱스start
부터end-1
까지의 문자열을str
로 대체합니다.
3.5 reverse()
문자열을 반전시킵니다.
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 출력: olleH
- 간단한 메서드로 문자열을 뒤집을 수 있어 알고리즘 문제에서 유용하게 사용할 수 있습니다.
3.6 setCharAt()
특정 인덱스의 문자를 변경합니다.
StringBuilder sb = new StringBuilder("Hello");
sb.setCharAt(1, 'a');
System.out.println(sb.toString()); // 출력: Hallo
- 지정된 인덱스의 문자 하나를 교체할 수 있습니다.
3.7 substring()
String
클래스의 substring()
과 비슷하게, StringBuilder
의 문자열 일부를 추출할 수 있습니다.
StringBuilder sb = new StringBuilder("Hello World");
String sub = sb.substring(6, 11);
System.out.println(sub); // 출력: World
substring(int start, int end)
:start
부터end-1
까지의 문자열을 반환합니다.
3.8 length()와 capacity()
length()
: 현재StringBuilder
의 문자열 길이를 반환합니다.capacity()
: 현재StringBuilder
의 용량(메모리 크기)을 반환합니다. 문자열의 길이보다 크며, 필요에 따라 자동으로 증가합니다.
StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.length()); // 출력: 5
System.out.println(sb.capacity()); // 기본 용량 16 + 문자열 길이 5 = 21
3.9 trimToSize()
StringBuilder
의 실제 문자열 길이에 맞춰 용량을 줄입니다. 메모리 최적화에 유용할 수 있습니다.
StringBuilder sb = new StringBuilder(50);
sb.append("Hello");
sb.trimToSize();
System.out.println(sb.capacity()); // 출력: 5 (Hello의 길이)
4. StringBuilder의 성능 최적화 팁
- 초기 용량 설정: 반복적인 추가 작업이 예상되는 경우, 초기 용량을 설정하여 메모리 할당을 줄일 수 있습니다.
- 메서드 체이닝 활용:
append()
메서드처럼 반환값이StringBuilder
인 메서드를 연결하여 한 줄에 여러 작업을 수행할 수 있습니다. - 메모리 최적화: 작업이 끝난 후
trimToSize()
메서드를 사용하여 불필요한 용량을 줄일 수 있습니다.
5. StringBuilder 사용 시 주의사항
- 멀티스레드 환경에서 사용하지 말 것:
StringBuilder
는 동기화를 지원하지 않으므로 멀티스레드 환경에서는StringBuffer
를 사용하는 것이 안전합니다. - 변경이 적은 문자열에는 String 사용: 불필요하게
StringBuilder
를 사용하는 것보다, 변경이 거의 없는 문자열에는String
을 사용하는 것이 더 적합합니다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] String vs StringBuilder vs StringBuffer - 성능 비교 실험 (2) | 2024.10.11 |
---|