본문 바로가기
객체지향설계

[파일구조] - 필드(Field)와 레코드(Record)

by CHML 2016. 4. 22.
1. 필드(Field)

파일구조에서 필드는 파일을 구성하는 요소 중에서 의미를 갖는 가장 작은 단위를 뜻한다. 즉, 가장 근본적인 관점에서 파일을 읽고 쓴다는 것은 필드를 읽고 쓴다는 것이다.

그러나 물리적인 공간에서 파일은 단순히 바이트(byte)의 연속일뿐이기 때문에 파일구조를 설계하기 위해서는 연속된 바이트에서 필드를 구분하기 위한 방법을 고려해야 한다. 연속된 바이트에서 필드를 구분하기 위한 일반적인 방법으로는 고정 길이 필드 방식, 길이 지시자 방식, 구획 문자 방식, 키워드=값 구조와 같은 기법이 있다.

앞으로는 아래와 같은 데이터 클래스 Person을 예시로 파일구조를 설계할 것이다. 또한, 구현 언어는 C++로 가정하여 예시 코드를 작성할 것이다.


1) 고정 길이 필드 방식

고정 길이 필드는 각각의 필드가 고정된 길이를 갖는 방식이다. 예를 들어, id 필드의 길이는 2bytes, name 필드는 8bytes, age는 2bytes, job 필드는 16bytes와 같이 고정된 각 필드마다 고정된 길이를 할당하는 것이다. 고정 길이 필드 방식을 이용하여 Person 클래스를 저장한다면 아래와 같은 구조로 저장된다.


 01

 NaKS    

 23

 student           


고정 길이 필드는 구조나 구현이 간단한 장점이 있지만, 위의 예와 같이 필드에 낭비되는 공간이 발생하며 낭비되는 공간으로 인해 파일의 크기가 커지는 단점이 존재한다.


2) 길이 지시자 방식 (가변 길이 필드)

고정 길이 필드의 단점을 극복하기 위한 방법으로는 가변 길이 필드를 생각할 수 있다. 가변 길이 필드를 구현하기 위한 방법으로는 길이 지시자 방식, 구획 문자 방식, 키워드=값 구조 등이 있다. 이 중에서 길이 지시자는 필드의 길이는 가변적으로 할당하되 각각의 필드에 필드의 길이를 추가하는 방식으로 필드를 해석할 수 있도록 한다. 길이 지시자 방식을 이용하여 Person 클래스를 저장한다면 데이터는 아래와 같은 구조를 갖게 된다.


 0201 

 04NaKS

 0223 

 07student 


길이 지시자 방식의 장점은 직관적이고 간단하게 가변 길이 필드를 해석할 수 있다는 것이다. 그러나 위의 예시에서 id 필드나 age 필드의 경우에는 길이를 나타내는 길이 지시자의 크기와 데이터의 크기가 같기 때문에 길이 지시자로 인해 필드의 크기가 2배로 커지는 단점이 존재한다. 이렇듯 항상 가변 길이 필드 방식이 고정 길이 필드 방식보다 좋다고 말할 수는 없다. 가변 길이 필드 방식과 고정 길이 필드 방식의 효율성은 처리하려는 데이터의 특성, 파일 연산의 구현 등에 따라 변할 수 있다.


3) 구획 문자 방식 (가변 길이 필드)

구획 문자 방식은 앞의 길이 지시자 방식과 동일하게 가변 길이 필드를 구현하기 위한 방법이다. 길이 지시자 방식은 필드의 가장 앞에 필드 길이를 표시한다면, 구획 문자 방식은 각각의 필드를 특정한 구획 문자로 구분한다. 예를 들어, 아래와 같이 구획 문자 '|'을 이용하여 각각의 필드를 구분하도록 파일구조를 설계할 수 있다. 


 01|NaKS|23|student


구획 문자는 데이터에 절대 포함되지 않을 문자로 지정해야 한다. 만약 위와 같이 구획 문자 '|'을 이용하는 파일구조에서 데이터에 |이 포함되어 있다면, 파일을 올바르게 읽지 못하는 경우가 발생한다.


4) 키워드=값 구조 (가변 길이 필드)

키워드=값 형태의 구조는 각각의 필드는 구획 문자로 구분하고, 하나의 필드에 키워드와 값을 같이 저장하는 방식이다. 키워드=값 구조를 이용하는 대표적인 사례로는 JSON(JavaScript Object Notation)이 있다.


id=01|name=NaKS|age=23|job=student 


구획 문자 방식에 불필요하게 키워드를 같이 저장하기 때문에 구획 문자 방식에 비해 더 많은 저장 공간을 이용하는 단점이 있다. 그러나 키워드=값 구조는 누락된 필드를 감지할 수 있고, 필드의 순서가 뒤바뀌어도 올바르게 필드를 읽어낼 수 있다는 유연성이 존재하기 때문에 JSON 등에서 이용되고 있다.


2. 레코드(Record)

파일구조에서 레코드는 필드의 집합을 의미한다. 예를 들어, Person 클래스에 대한 하나의 레코드는 id, name, age, job으로 표현되는 4개의 필드로 구성된다. 레코드 또한 필드 처럼 고정 길이, 가변 길이와 같은 저장 방식이 존재하며 레코드를 고정 길이로 구현하고 필드는 가변 길이로 구현할 수 있는 등, 레코드와 필드의 저장 방식은 서로 독립적이다. 만약 5개의 레코드 저장 방식과 4개의 필드 저장 방식이 존재한다면 일반적으로 총 20개의 데이터 저장 방식이 존재하게 되는 것이다.


1) 고정 길이 방식

고정 길이 방식은 단어 그대로 레코드의 길이가 고정된 것을 말한다. 고정 길이 방식 레코드는 아래와 같이 고정 길이 필드 방식과 가변 길이 필드 방식 모두에 대해 구현이 가능하다.


01NaKS    23student            


 01|NaKS|23|student


2) 필드 개수 지정 방식

각각의 레코드가 고정된 개수의 필드로 구성되는 레코드 저장 방식이다. 예를 들어, Person 클래스에 대한 정보를 처리하는 파일 매니저는 Person 클래스에 대한 레코드의 집합에서 4개의 필드를 읽으면 하나의 레코드를 읽었다고 인식할 수 있다.


3) 길이 지시자 방식

앞의 필드의 길이 지시자 방식처럼 레코드에 레코드 길이를 포함하여 저장하는 방식이다.


4) 인덱스 파일 방식

각 레코드의 시작 주소를 저장하고 있는 인덱스 파일을 따로 생성하여 레코드를 접근하는 방식이다. 서적의 인덱스 페이지에 있는 '어떤 단어는 몇 페이지에 있다'라는 정보 처럼 인덱스 파일에는 '어떤 레코드가 주소 xxxx에 있다'라는 정보가 저장되어 있다.



인덱스 파일 방식은 데이터 파일 이외에도 별도의 파일을 하나 더 유지해야하는 단점이 존재하지만, 인덱스 파일 방식은 파일 연산을 구현할 때 막강한 강점을 갖는다. 이러한 이유로 많은 시스템에서는 인덱스 파일 방식을 주로 이용하고 있다.


5) 구획 문자 방식

구획 문자를 이용하여 레코드를 구분하는 방식이다. 아래와 같이 '#'을 이용하여 레코드를 구분하도록 파일구조를 설계할 수 있다.


01|NaKS|23|student#02|SeoYU|25|engineer|03|KimHS|23|student# 


한번 더 강조하자면, 만약 데이터에 구획 문자가 포함되어 있다면 올바르게 파일 연산을 수행할 수 없기 때문에 구획 문자 방식을 이용할 때는 구획 문자를 매우 신중하게 선택해야 한다.