도구스개발

갭 버퍼(Gap Buffer) 자료구조 계산기

텍스트 에디터가 쓰는 갭 버퍼에서 커서 이동·삽입·삭제 비용이 실제로 어떻게 계산되는지 보여줍니다. Emacs가 이 구조를 쓰는 이유입니다.

번째
번째

이 편집의 총 비용(문자 이동·복사 횟수)

15회

순수 배열이었다면 249,950회 — 16,663배 차이

① 커서 이동 비용10회
② 삽입 비용5회
③ 삭제 비용0회
총 비용(①+②+③)15회
편집 후 남은 빈 칸95자
커서 이동 비용은 거리에만 비례하고 문서 전체 길이와는 무관합니다. 100만 자짜리 문서든 10자짜리 문서든, 커서를 10칸 옮기면 비용은 똑같이 10입니다. 반대로 삽입·삭제는 커서가 있는 자리에서는 빈 칸이 남아 있는 한 O(1)입니다.
빈 칸이 바닥나면 재할당이 일어납니다. 이때는 기존 문서 전체를 새 배열로 옮겨야 해 O(문서 길이)가 듭니다. 동적 배열의 표준 전략대로 필요한 크기의 2배로 여유 있게 늘려서, 다음 재할당까지의 간격을 넓힙니다 (상환 분석으로 보면 삽입 1회당 평균 비용은 다시 O(1)이 됩니다).
Emacs를 비롯한 많은 전통 에디터가 갭 버퍼를 씁니다. VS Code 등 최신 에디터는 대신 균형 이진트리 기반의 로프(rope)를 씁니다 — 갭 버퍼는 «커서 근처 편집이 압도적으로 많다»는 실제 타이핑 패턴에 최적화된 구조이고, 로프는 임의 위치 편집·큰 문서의 자르기/붙이기에 강합니다.

사용 방법

  1. 1문서 전체 길이와 현재 커서(빈 칸) 위치, 남은 빈 칸 크기를 넣습니다.
  2. 2옮기려는 목표 위치와 그 자리에서 삽입·삭제할 문자 수를 넣습니다.
  3. 3커서 이동·삽입·삭제 각각의 비용과 총 비용을 확인합니다.

자주 묻는 질문

텍스트를 배열 하나에 통째로 두되 커서 위치에 빈 칸(gap)을 두는 자료구조입니다. 커서 바로 옆에서 문자를 넣고 지우는 것은 그 빈 칸을 줄이거나 늘리는 것뿐이라 O(1)입니다.

빈 칸을 새 위치로 옮기려면 그 사이에 있는 문자들을 빈 칸 반대편으로 하나씩 옮겨야 합니다. 비용은 정확히 두 위치의 차이(이동 거리)와 같고, 문서 전체 길이와는 무관합니다.

배열 전체를 더 큰 배열로 다시 만드는 재할당이 일어납니다. 이때는 기존 문서 전체를 옮겨야 해 O(문서 길이)가 듭니다. 동적 배열의 표준 전략대로 필요한 크기의 2배로 늘려 다음 재할당까지의 간격을 넓힙니다.

커서 옆 문자를 지우는 것은 빈 칸을 하나 늘리는 것뿐이라 재할당이 필요 없습니다. 삽입과 달리 삭제는 빈 칸이 얼마나 남았는지와 무관하게 언제나 O(1)입니다.

실제 타이핑은 커서 근처에서 계속 이어지는 경우가 압도적으로 많습니다. 갭 버퍼는 이 패턴에 최적화된 구조입니다. 반대로 VS Code 같은 최신 에디터는 임의 위치 편집·큰 문서의 자르기/붙이기에 강한 로프(rope) 구조를 씁니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 실제 문자 내용이 아니라 길이·위치 같은 숫자만으로 비용을 계산하는 추상 모델입니다.
  • 순수 배열과의 비교는 "삽입·삭제할 때마다 그 뒤 문자를 전부 민다"는 가장 단순한 구현을 기준으로 합니다.
  • 표준 텍스트 자료구조 문헌(Crowley, "Data Structures for Text Sequences" 등)의 결정적 구조라 법령·통계 의존이 없어 dataExpiry 등록 대상이 아닙니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 5일 · 결과는 참고용 추정치입니다.