트랙
/
8th
8th
/
연습 문제
/
원형 버퍼
원형 버퍼

원형 버퍼

보통

지침

원형 버퍼, 순환 버퍼, 링 버퍼는 하나의 고정 크기 버퍼를 마치 끝과 끝이 연결된 것처럼 사용하는 자료 구조예요.

원형 버퍼는 처음에는 비어 있고, 미리 정해진 길이를 가져요. 예를 들어 다음은 요소 7개짜리 버퍼예요:

[ ][ ][ ][ ][ ][ ][ ]

버퍼 가운데에 1을 쓴다고 해봐요. (원형 버퍼에서는 정확히 어디에서 시작하는지는 중요하지 않아요.)

[ ][ ][ ][1][ ][ ][ ]

그다음 요소 두 개, 2와 3을 1 뒤에 이어 붙인다고 해봐요:

[ ][ ][ ][1][2][3][ ]

이때 버퍼에서 요소 두 개를 꺼내면, 버퍼 안에서 가장 오래된 값이 꺼내져요. 이 경우 꺼내지는 두 요소는 1과 2이고, 버퍼에는 3만 남아요:

[ ][ ][ ][ ][ ][3][ ]

버퍼에 요소가 7개 있으면 버퍼는 완전히 가득 찬 상태예요:

[5][6][7][8][9][3][4]

버퍼가 가득 차면 오류가 발생해서, 빈 자리가 생길 때까지 더 이상 쓸 수 없다는 것을 클라이언트에 알려줘요.

버퍼가 가득 찼을 때 클라이언트는 강제 쓰기로 가장 오래된 데이터를 덮어쓸 수도 있어요. 이 경우 요소 두 개, A와 B를 추가하면 3과 4를 덮어써요:

[5][6][7][8][9][A][B]

3과 4가 A와 B로 바뀌었으니 이제 버퍼에서 가장 오래된 데이터는 5예요. 마지막으로 요소 두 개를 꺼내면 5와 6이 반환되면서 버퍼는 이렇게 돼요:

[ ][ ][7][8][9][A][B]

빈 공간이 있기 때문에 클라이언트가 다시 덮어쓰기로 C와 D를 저장하면, 7과 8이 있는 자리가 아니라 이전에 5와 6이 저장되어 있던 자리가 사용돼요. 7은 여전히 가장 오래된 요소이고, 버퍼는 다시 가득 찼어요.

[C][D][7][8][9][A][B]

이 연습 문제에서는 아직 접해 보지 못했을 수도 있는 몇 가지 개념을 소개해요:

사용자 정의 네임스페이스

8th의 워드는 모두 네임스페이스에 속해요. 예를 들어 a:new는 a 네임스페이스의 new 워드를 가리켜요. 직접 네임스페이스를 정의할 수도 있는데, circular-buffer.8th 파일 맨 위에서 바로 그렇게 하고 있어요:

ns: cb

즉, 그 파일 안의 모든 워드에 cb:<word>로 접근할 수 있어요. 관련된 기능을 묶어 두는 아주 좋은 방법이죠.

더 자세한 내용은 네임스페이스 문서를 확인해 봐요.

예외

read와 write 워드는 잘못된 상태의 원형 버퍼에서 호출되면 예외를 발생시켜야 해요. 더 자세한 내용은 예외와 오류 처리 문서를 확인해 봐요.

객체

원형 버퍼는 원하는 대로 구현해도 되지만, 8th의 객체 지원을 사용하는 것도 고려해 볼 수 있어요.


출처

Wikipedia링크가 새 창이나 탭에서 열려요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
8th Exercism

원형 버퍼 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 8th 트랙을 연습 문제 70개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.

원형 버퍼 깊이 살펴보기!

이 영상에서는 원형 버퍼를 살펴봐요. 원형 버퍼가 무엇인지, 어디에 쓰이는지, 어떤 구현 방식들이 있는지 알아봐요. 큐, 정적 배열과 동적 배열, 불변 자료 구조, 그리고 재미있는 에이전트 기반 구현까지 다뤄요.