어제 오늘 내일

[Java StringBuilder] capacity(), ensureCapacity() – 내부 버퍼 관리 본문

IT/Java

[Java StringBuilder] capacity(), ensureCapacity() – 내부 버퍼 관리

hi.anna 2025. 9. 22. 01:54

StringBuilder는 문자열을 수정할 때마다 새로운 객체를 만들지 않고, 내부 버퍼를 사용해 문자열을 관리합니다.
이 내부 버퍼의 크기를 확인하거나 조절하는 데 쓰이는 메서드가 capacity()ensureCapacity()입니다.

 

1. capacity() – 버퍼 크기 확인

public int capacity()
  • StringBuilder현재 버퍼 용량을 반환
  • 문자열 길이(length())와는 다름
StringBuilder sb = new StringBuilder("Hello");
System.out.println("문자열 길이: " + sb.length());   // 5
System.out.println("버퍼 용량: " + sb.capacity()); // 21 (기본 16 + "Hello" 5)

👉 StringBuilder는 처음부터 넉넉한 공간을 확보하고, 추가 문자열이 들어오면 버퍼를 자동 확장합니다.

 

2. ensureCapacity() – 버퍼 확장 예약

public void ensureCapacity(int minimumCapacity)
  • 최소한 minimumCapacity 용량을 확보하도록 보장
  • 현재 용량보다 작거나 같으면 아무 변화 없음
  • 현재 용량보다 크면, (기존 용량 × 2 + 2) 또는 최소 요구 용량 중 더 큰 값으로 확장
StringBuilder sb = new StringBuilder();
System.out.println("초기 용량: " + sb.capacity()); // 16

sb.ensureCapacity(50);
System.out.println("확장 후 용량: " + sb.capacity()); // 50 이상

👉 한 번에 대량의 문자열을 추가할 게 확실하다면, 미리 ensureCapacity()로 공간을 확보해두면 성능이 좋아집니다.

 

3. 실전 활용 예제

대량 데이터 처리 전에 용량 확보

int expectedSize = 1000;
StringBuilder sb = new StringBuilder();
sb.ensureCapacity(expectedSize);

for (int i = 0; i < 1000; i++) {
    sb.append(i).append(" ");
}
System.out.println("최종 용량: " + sb.capacity());

👉 미리 공간을 확보하지 않았다면, 반복 중 여러 번 버퍼가 재할당되며 성능 저하가 발생할 수 있습니다.

capacity vs length 차이

StringBuilder sb = new StringBuilder("Java");
System.out.println(sb.length());   // 4 (문자열 길이)
System.out.println(sb.capacity()); // 20 (버퍼 용량)

👉 문자열의 실제 길이와 버퍼 크기는 다르다는 점을 꼭 기억해야 합니다.

 

4. 정리

  • capacity() → 현재 내부 버퍼 용량 확인
  • ensureCapacity(n) → 최소 n 이상의 버퍼 확보 보장
  • 대량 데이터 처리 시 미리 용량 확보하면 성능 최적화 가능
  • length()capacity()는 서로 다름 (문자열 길이 vs 버퍼 크기)

🔑 한 줄 정리
👉 capacity()ensureCapacity()를 활용하면 StringBuilder를 더 효율적으로 사용할 수 있다!

 

 

반응형
Comments