피스 테이블(Piece Table) 계산기
텍스트에 삽입·삭제를 가하면 원본 버퍼는 그대로 두고 (버퍼,시작,길이) 조각 목록만 갱신하는 피스 테이블의 동작을 단계별로 보여줍니다.
① 처음 — 조각 1개(원본 전체)
원본[0,19]“the quick brown fox”
② 삽입
삽입 후 조각 목록
원본[0,4]“the ”추가[0,5]“very ”원본[4,15]“quick brown fox”
③ 삭제
삭제 후 조각 목록
추가[0,5]“very ”원본[4,15]“quick brown fox”
최종 문서
very quick brown fox
원본 버퍼(불변)“the quick brown fox”
추가 버퍼“very ”
최종 조각 개수2개
원본 버퍼는 한 번도 수정되지 않습니다. 삽입은 추가 버퍼 끝에 텍스트를 이어붙이고 조각 목록만 갈아 끼우며, 삭제는 겹치는 조각을 잘라내거나 통째로 뺄 뿐입니다. 두 버퍼 모두 복사가 일어나지 않으므로 문서가 아무리 커도 편집 하나당 조각 몇 개만 갱신하면 됩니다.
사용 방법
- 1원본 텍스트를 입력합니다.
- 2삽입 또는 삭제 연산을 위치·내용과 함께 추가합니다.
- 3조각 목록이 어떻게 갈라지고 재구성되는지, 최종 문서 내용을 확인합니다.
자주 묻는 질문
원본 버퍼(파일을 열 때 읽은 내용, 절대 수정하지 않음)와 추가 버퍼(사용자가 입력한 모든 문자가 이어붙는 곳) 두 개만 두고, 문서는 이 두 버퍼를 가리키는 (버퍼, 시작, 길이) 조각 목록으로 표현합니다.
삽입 위치가 어떤 조각의 중간이라면, 그 조각을 앞부분·뒷부분으로 쪼갠 뒤 그 사이에 추가 버퍼의 새 구간을 가리키는 조각을 끼웁니다. 텍스트 자체는 추가 버퍼 끝에 한 번만 이어붙이고, 조각 목록만 갈아 끼웁니다.
로프는 문자열을 이진트리로 쪼개 균형을 유지하고, 갭 버퍼는 캐럿(입력 위치) 주변에 빈 공간을 옮겨 다닙니다. 피스 테이블은 원본 버퍼를 절대 건드리지 않고 조각 목록만 갱신하는 것이 특징이며, 실행 취소(undo)가 조각 목록의 이전 상태로 돌아가는 것만으로 간단히 구현되는 장점이 있습니다.
Visual Studio Code의 텍스트 버퍼 구현이 피스 테이블 계열 구조를 씁니다. 큰 파일을 열어도 원본을 복사하지 않고 조각 목록만 관리하므로 메모리 효율이 좋습니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- J. Crowley, "Data Structures for Text Sequences"(1998)의 원본/추가 버퍼+조각 목록 구조와 VS Code 공식 블로그의 텍스트 버퍼 재구현 글을 정본으로 삼았습니다(2026-09-05 확인).
- 무작위로 생성한 삽입·삭제 시퀀스 20세트(각 30단계)를 순수 문자열 연산(slice·concat) 결과와 매 단계 대조해 항상 일치하는지 테스트로 고정했습니다(차등 테스트).
- 이 계산기는 조각 목록 갱신 원리를 보여주는 용도이며, 실제 에디터처럼 조각 개수가 무한히 늘어나는 것을 막는 병합·재구성 최적화는 다루지 않습니다.
함께 보면 좋은 도구
로프 자료구조문자열을 이진트리로 쪼갠 로프에서 자르기(split)·이어붙이기(concat)·중간 삽입이 실제로 어떻게 되는지 계산해 보여줍니다.갭 버퍼 자료구조텍스트 에디터가 쓰는 갭 버퍼에서 커서 이동·삽입·삭제 비용이 실제로 어떻게 계산되는지 보여줍니다.gitignore 판정.gitignore 규칙과 경로를 넣으면 그 파일이 무시되는지, 어느 줄이 마지막으로 이겼는지 알려줍니다.울프람 규칙규칙 번호 0~255를 8비트로 풀어 세 칸 이웃에 대응시키고 세대를 쌓아 무늬를 그립니다.2-SAT「둘 중 하나는 참」인 조건을 여럿 넣으면 참·거짓 배정이 가능한지 판정하고 배정을 하나 찾아 줍니다.
마지막 검증: 2026년 9월 5일 · 결과는 참고용 추정치입니다.