이를 해결하는 데 StringBuilder 클래스가 등장합니다. StringBuilder 클래스는 문자를 이어 붙이거나 빼는 등 수정할 때마다 새로운 문자열을 만들지 않고 내부 배열에서 직접 수정합니다. 문자를 이어 붙이는 것은 배열 뒤에 원소 하나를 집어넣는 것이니 상수 시간 O(1)이 기대 시간 복잡도가 됩니다.
잠깐만요
왜 시간 복잡도가 O(1)이 아니라 기대 시간 복잡도가 O(1)이 될까요? 내부적으로 배열을 사용하는 StringBuilder는 저장하는 문자열 길이가 너무 길어지면 배열 크기를 늘려 주어야 합니다. 이 과정에서 새로운 배열을 할당하고, 기존 배열 내용을 새로운 배열로 옮겨야 하기 때문에 O(N)의 시간이 소요됩니다. 하지만 이 작업은 매번 발생하지 않고 가끔 발생하므로 기대 시간 복잡도는 O(1)이 됩니다.
StringBuilder 클래스에서 자주 사용하는 메서드를 살펴봅시다.
▼ 표 4-3 자주 사용되는 StringBuilder의 메서드
메서드 |
역할 |
시간 복잡도 |
StringBuilder.toString() |
지금까지 구성한 문자열을 String 형식으로 반환한다. |
O(N) |
StringBuilder.append(char c) |
문자 c를 문자열 끝에 이어 붙인다. |
O(1) |
StringBuilder.length() |
지금까지 구성한 문자열 길이를 반환한다. |
O(1) |
StringBuilder.reverse() |
지금까지 구성한 문자열을 뒤집는다. |
O(N) |