파일 편성은 레코드를 저장 장치의 어느 자리에 어떤 순서로 두고 어떻게 찾아갈지 정한 방식입니다. 순차·색인 순차·직접 셋이 기본이고, 같은 레코드를 담아도 하나를 찾는 데 읽는 양과 끼워 넣는 비용이 달라집니다.
데이터 전환은 표에서 표로만 일어나지 않습니다. 쓰던 시스템이 데이터를 파일로 쌓아 두었다면 그 파일이 어떤 편성인지 알아야 꺼내 오는 방법이 정해지고, 새로 담을 쪽도 어떻게 저장하느냐에 따라 찾는 속도가 갈립니다. 아래 그림은 같은 학생 다섯을 세 편성으로 저장해 두고 학번이 104인 레코드를 찾을 때, 읽는 칸이 몇 개인지를 나란히 보여 줍니다.
1순차 파일 — 차례대로 쌓는다
순차 파일(sequential file)은 레코드를 처리할 순서대로 저장 장치에 이어 붙여 둔 파일입니다. 보통 키 값 순으로 쌓습니다.
어디에 있는지 알려 주는 것이 없으니, 하나를 찾으려면 앞에서부터 차례로 읽습니다. 가운데에 레코드를 끼워 넣거나 지우려면 뒤에 있는 레코드를 모두 옮겨 써야 합니다.
대신 빈틈 없이 붙여 두어 저장 공간을 적게 쓰고, 처음부터 끝까지 한 번에 훑는 일은 가장 빠릅니다. 모아서 한꺼번에 처리하는 일괄 처리에 맞고, 앞에서부터만 읽을 수 있는 자기 테이프에서도 쓸 수 있습니다.
2색인 순차 파일 — 색인을 보고 건너뛴다
색인 순차 파일(indexed sequential file)은 레코드를 키 값 순으로 쌓아 두고, 어느 묶음에 있는지 적어 둔 색인을 따로 두는 파일입니다. 색인을 먼저 보고 묶음을 골라 건너뛰므로 앞에서부터 차례로 읽는 순차 처리와 하나만 바로 찾는 임의 처리를 모두 할 수 있습니다. 자기 디스크에서 씁니다.
파일은 세 구역으로 나뉩니다.
| 구역 | 담는 것 |
|---|---|
| 기본 구역(prime area) | 실제 레코드를 키 값 순으로 기록한다 |
| 색인 구역(index area) | 기본 구역 레코드의 위치를 찾아가는 색인을 기록한다 |
| 오버플로 구역(overflow area) | 기본 구역에 빈자리가 없을 때 넣을 자리로 미리 비워 둔다 |
기본 구역이 꽉 찼을 때 새 레코드를 오버플로 구역에 적고 원래 자리에서 그곳을 가리키므로, 순차 파일처럼 뒤를 다 옮겨 쓰지 않아도 됩니다. 다만 오버플로 구역이 쌓이면 찾는 데 걸리는 시간이 늘어나 파일을 다시 정리해야 합니다.
두 구역은 다시 아래처럼 나뉩니다. 디스크는 겹쳐 놓은 둥근 판으로 되어 있는데, 한 판에 그려진 동심원 하나가 트랙이고 여러 판에서 같은 자리에 있는 트랙을 묶은 것이 실린더입니다. 색인 구역 셋은 이 단위를 따라 층을 이룹니다 — 마스터 색인에서 실린더를, 실린더 색인에서 트랙을, 트랙 색인에서 레코드를 찾습니다.
| 구역 | 나뉘는 것 | 가리키는 범위 |
|---|---|---|
| 색인 구역 | 트랙 색인 | 한 트랙 안 레코드의 키 |
| 실린더 색인 | 한 실린더 안 트랙 색인 | |
| 마스터 색인 | 실린더 색인 — 실린더 색인이 커질 때 둔다 | |
| 오버플로 구역 | 실린더 오버플로 | 그 실린더의 기본 구역에서 넘친 레코드 |
| 독립 오버플로 | 실린더 오버플로마저 찼을 때 쓰는 별도 공간 |
3직접 파일 — 주소를 계산해 바로 간다
직접 파일(direct file)은 키 값을 저장 자리로 바꾸는 사상 함수(mapping function)를 두고, 계산한 자리에 레코드를 넣는 파일입니다. 찾을 때도 같은 함수로 자리를 계산해 다른 레코드를 거치지 않고 바로 읽습니다. 한 건을 묻고 바로 답하는 대화형 처리에 맞습니다.
학번을 학번 MOD 5로 계산하면 101은 1번, 104는 4번 자리입니다. 104를 찾을 때 101·102·103을 읽지 않습니다.
대신 자리 번호는 계산 결과라 키 순서와 다릅니다. 전체를 키 순으로 읽는 일에는 맞지 않고, 서로 다른 키가 같은 자리로 계산되는 일도 생깁니다. 사상 함수의 종류와 그때 처리하는 방법은 3과목 자료구조에서 해싱으로 다시 배웁니다. 사상 함수는 자료에 따라 매핑 함수라고도 부릅니다.
예제
창고 관리 프로그램이 다루는 파일 셋입니다. 각각 어느 편성이 맞을지 먼저 골라 보세요.
(가) 전국 매장이 보낸 하루 판매 기록을 밤에 모아, 처음부터 끝까지 읽어 합계만 냅니다. 가운데를 고치는 일은 없습니다.
(나) 품목 코드로 한 품목의 재고를 바로 찾아 수량을 고칩니다. 품목 코드 순으로 재고 목록 전체를 뽑기도 합니다.
(다) 출입 카드를 댈 때마다 사원번호로 한 건만 찾아 읽습니다. 전체를 순서대로 훑는 일은 없습니다.
답을 정했으면 아래 표로 맞춰 보세요. 첫 칸은 편성을 가르는 물음입니다.
| 가르는 물음 | 순차 파일 | 색인 순차 파일 | 직접 파일 |
|---|---|---|---|
| 하나를 찾을 때 읽는 레코드 | 찾을 때까지 앞에서부터 모두 | 색인을 거쳐 그 묶음만 | 계산한 자리 하나 |
| 키 순으로 전체를 읽을 수 있나 | 된다 — 저장 순서가 키 순이다 | 된다 | 어렵다 — 자리 번호가 키 순이 아니다 |
| 가운데에 끼워 넣을 때 | 뒤에 있는 레코드를 모두 옮겨 쓴다 | 오버플로 구역에 적는다 | 계산한 자리에 바로 넣는다 |
| 쓰는 매체와 맞는 처리 | 자기 테이프 · 일괄 처리 | 자기 디스크 · 순차와 임의 둘 다 | 자기 디스크 · 대화형 처리 |
- (가) 순차 파일, (나) 색인 순차 파일, (다) 직접 파일입니다.
- (나)와 (다)가 가장 헷갈립니다. 하나를 바로 찾는 것만 보면 둘 다 되지만, 키 순으로 전체를 뽑아야 하면 색인 순차입니다.
시험 포인트
- 필기: 색인 순차 파일은 기본 구역·색인 구역·오버플로 구역으로 나뉩니다. 색인 구역에 드는 것 셋(트랙 색인·실린더 색인·마스터 색인)을 주고 아닌 것을 고르게 하는 문제가 나옵니다 — 기본 구역은 색인 구역이 아닙니다. 편성마다 맞바꾸는 것도 묻습니다 — 순차는 공간을 적게 쓰나 끼워 넣기가 비싸고, 색인 순차는 두 처리를 다 하는 대신 공간을 더 쓰고, 직접은 한 건을 바로 찾으나 키 순으로 훑기 어렵습니다.
- 실기: 편성의 이름을 한글 이름과 영문으로 씁니다 — 순차 파일(Sequential File), 색인 순차 파일(Indexed Sequential File), 직접 파일(Direct File). 색인 순차 파일의 구역 이름도 씁니다 — 기본 구역(Prime Area), 색인 구역(Index Area), 오버플로 구역(Overflow Area). 색인 구역이 층으로 나뉘는 셋과 오버플로 구역이 나뉘는 둘은 한글로 씁니다 — 마스터 색인, 실린더 색인, 트랙 색인 · 실린더 오버플로, 독립 오버플로. 직접 파일이 두는 것은 사상 함수(Mapping Function, 자료에 따라 매핑 함수)입니다.
확인 문제
1. 은행이 하루 거래 내역을 파일로 쌓습니다. 거래가 일어난 시각 순으로 뒤에만 붙이고, 밤에 전체를 한 번 읽어 이자를 계산합니다. 지난 거래를 고치는 일은 없습니다. 이 파일을 순차 편성으로 두었을 때 받는 이로움을 고르세요.
- ① 거래번호로 한 건을 찾을 때 다른 거래를 읽지 않습니다.
- ② 가운데에 거래를 끼워 넣어도 뒤에 있는 거래를 옮겨 쓰지 않습니다.
- ③ 빈틈 없이 붙여 두어 저장 공간을 적게 쓰고, 전체를 한 번 훑는 일이 가장 빠릅니다.
- ④ 색인을 두지 않아도 거래 시각 범위로 묶음을 건너뛸 수 있습니다.
정답
③입니다. 이 파일은 뒤에만 붙이고 전체를 한 번 읽는 쓰임이라, 빈틈 없이 붙여 두는 순차 편성의 이로움을 그대로 받습니다.
- ① 직접 파일의 이로움입니다. 순차 파일은 찾는 레코드가 나올 때까지 앞에서부터 읽습니다.
- ② 색인 순차 파일이 오버플로 구역으로 하는 일입니다. 순차 파일은 뒤에 있는 레코드를 모두 옮겨 씁니다.
- ④ 묶음을 건너뛰려면 어느 묶음에 있는지 적어 둔 색인이 있어야 합니다.
2. 병원이 진료 기록을 환자번호 순으로 쌓아 두고, 환자번호로 한 건을 바로 찾는 일과 환자번호 순으로 전체를 뽑는 일을 모두 합니다. (가)~(다)는 한글 이름과 영문을 함께, (라)는 한글 이름으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 이 파일의 편성 이름
- (나) 실제 진료 기록이 키 값 순으로 들어가는 구역의 이름
- (다) 진료 기록이 어느 묶음에 있는지 적어 두어, 환자번호로 바로 찾아갈 때 먼저 읽는 구역의 이름
- (라) (다)가 층으로 나뉘는 셋의 이름 — 위에서부터 차례대로
정답
받는 답: (가) 색인 순차 파일(Indexed Sequential File) · (나) 기본 구역(Prime Area) · (다) 색인 구역(Index Area) · (라) 마스터 색인 · 실린더 색인 · 트랙 색인
(가)의 실마리는 '키 값 순으로 쌓고, 한 건 찾기와 키 순 전체 읽기를 모두 한다'입니다. (나)는 색인이 가리키는 쪽, 곧 실제 레코드가 놓인 구역이고, (다)는 그 자리를 알려 주어 먼저 읽는 쪽입니다. (라)는 찾아가는 차례대로 마스터 색인에서 실린더를, 실린더 색인에서 트랙을, 트랙 색인에서 레코드를 찾습니다.
- 같은 이름의 다른 꼴: 한글 이름만, 또는 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다.
- 틀리는 꼴 (나)와 (다)를 바꿔 쓴 꼴: 색인 구역에는 레코드의 위치를 찾아가는 색인만 들어가고, 실제 레코드가 놓이는 쪽이 기본 구역입니다.
- 틀리는 꼴 (다)에 오버플로 구역: 기본 구역이 꽉 찼을 때 넘친 레코드를 받는 자리입니다. 먼저 읽어 자리를 찾는 쪽이 아닙니다.
- 틀리는 꼴 (가)에 직접 파일: 직접 파일은 자리를 계산해 넣어 저장 순서가 키 순이 아닙니다. 환자번호 순으로 전체를 뽑기 어렵습니다.
- 틀리는 꼴 (라)에 기본 구역을 넣은 꼴: 기본 구역은 색인이 아니라 레코드가 놓이는 구역입니다. 색인 구역이 나뉘는 셋에 들지 않습니다.
- 틀리는 꼴 (라)를 아래에서부터 쓴 꼴: 트랙 색인부터 쓰면 찾아가는 차례와 거꾸로입니다. 마스터 색인이 가장 위에 있습니다.
3. 색인 순차 파일에서 기본 구역에 빈자리가 없을 때 새 레코드를 적는 구역과, 그 구역이 다시 나뉘는 두 가지의 이름을 한글 이름으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 기본 구역이 꽉 찼을 때 새 레코드를 적는 구역
- (나) (가)를 실린더마다 두는 것
- (다) (나)마저 찼을 때 쓰는 별도 공간
정답
받는 답: (가) 오버플로 구역 · (나) 실린더 오버플로 · (다) 독립 오버플로
기본 구역을 옮겨 쓰지 않고 넘친 레코드를 따로 받는 자리가 오버플로 구역이고, 실린더마다 두는 것과 그것이 찼을 때 쓰는 공용 공간으로 나뉩니다.
- 같은 이름의 다른 꼴: 영문만 쓴 꼴 — 문제가 한글 이름으로 쓰라고 했습니다.
- 틀리는 꼴 (가)에 색인 구역: 색인 구역은 위치를 가리키는 색인을 담는 곳입니다. 넘친 레코드를 담지 않습니다.
- 틀리는 꼴 (나)와 (다)를 바꿔 쓴 꼴: 실린더마다 하나씩 있는 쪽이 실린더 오버플로이고, 그것이 찬 뒤에 쓰는 공용 공간이 독립 오버플로입니다.
4. 다음 (가)~(다)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 통신사가 통화 기록을 걸린 차례대로 뒤에만 이어 붙여 쌓습니다. 한 건을 찾으려면 앞에서부터 읽어야 하고, 밤에 전체를 한 번 훑어 요금을 매깁니다.
- (나) 사물함 배정 기록을 사원번호로 자리를 셈해 그 자리에 넣습니다. 한 건을 찾을 때 다른 기록을 거치지 않지만, 사원번호 순으로 전체를 뽑기는 어렵습니다.
- (다) (나)에서 사원번호를 저장 자리로 바꾸는 데 쓴 것의 이름입니다.
정답
받는 답: (가) 순차 파일(Sequential File) · (나) 직접 파일(Direct File) · (다) 사상 함수(Mapping Function) 또는 매핑 함수
(가)의 실마리는 '뒤에만 이어 붙이고 앞에서부터 읽는다', (나)는 '자리를 셈해 바로 간다', (다)는 '키를 저장 자리로 바꾼다'입니다. 매핑 함수는 자료에 따라 부르는 이름이라 함께 받습니다.
- 같은 이름의 다른 꼴: 한글 이름만, 또는 영문만 쓴 꼴 — 문제가 한글 이름과 영문을 함께 쓰라고 했습니다.
- 틀리는 꼴 (가)에 색인 순차 파일: 어느 묶음에 있는지 적어 둔 색인이 따로 있어야 합니다. (가)는 색인 없이 이어 붙이기만 했습니다.
- 틀리는 꼴 (다)에 색인: 색인은 위치를 적어 두고 찾아가는 자료입니다. (다)는 적어 두지 않고 키로 자리를 셈하는 함수입니다.
5. 회사가 사원번호를 사원번호 MOD 100으로 계산한 자리에 출입 기록을 넣는 직접 파일을 씁니다. 다음 두 가지 일을 할 때 일어나는 일로 알맞은 것을 고르세요.
-
(1) 사원번호 1204의 기록 하나를 찾습니다.
-
(2) 사원번호 순으로 전체 기록을 뽑습니다.
-
① (1) 자리 하나만 읽는다 · (2) 저장 순서가 사원번호 순이라 그대로 읽으면 된다
-
② (1) 자리 하나만 읽는다 · (2) 저장 순서가 사원번호 순이 아니라 따로 정렬해야 한다
-
③ (1) 앞에서부터 찾을 때까지 읽는다 · (2) 그대로 읽으면 된다
-
④ (1) 앞에서부터 찾을 때까지 읽는다 · (2) 따로 정렬해야 한다
정답
②입니다. 1204를 100으로 나눈 나머지는 4라 4번 자리 하나만 읽습니다. 자리 번호는 계산한 값이라 1204가 4번, 1301이 1번처럼 사원번호 순서와 어긋나므로, 사원번호 순으로 뽑으려면 따로 정렬해야 합니다.
- ① (2)를 순차 파일처럼 봤습니다. 계산한 자리에 넣으면 저장 순서가 키 순과 달라집니다.
- ③ 두 오해가 겹쳤습니다. 직접 파일은 자리를 계산해 바로 가고, 저장 순서는 키 순이 아닙니다.
- ④ (1)을 순차 파일처럼 봤습니다. 사상 함수로 자리를 계산하므로 앞에서부터 읽지 않습니다.