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

[파일구조] - 파일의 개념과 파일 연산

by CHML 2016. 4. 14.
1. 물리적 파일과 논리적 파일

파일은 파일을 직접 관리하는 파일 매니저와 파일을 이용하는 응용프로그램의 관점에 따라 두 가지로 나타낼 수 있다.


  • 물리적 파일(physical files): 파일 매니저의 관점에서 보는 파일로써 컴퓨터의 실제 디스크에 저장된 바이트의 연속을 의미한다.
  • 논리적 파일(logical files): 응용프로그램의 관점에서 보는 파일로써 물리적 파일로 연결된 채널을 의미한다. 응용프로그램에서는 논리적 파일을 통해 파일에 대한 연산을 수행한다. 그러나 응용프로그램은 논리적 파일이라는 물리적 파일과 연결된 채널을 이용함으로써 자신이 행하는 연산이 정확히 디스크의 어떤 위치에 적용되는지 알 필요가 없다. C언어에서 파일 디스크립터(file descriptor)를 이용하여 파일을 조작하는 것이 바로 논리적 파일의 개념을 이용하는 것이다.


2. 파일 열기

응용프로그램에서 물리적 파일에 접근하기 위해서는 먼저 논리적 파일(파일 디스크립터)을 생성해야한다. 응용프로그램이 논리적 파일을 생성하는 과정을 '파일을 연다'라고 표현한다. C언어에서는 아래의 코드처럼 논리적 파일을 생성한다.

fd = fopen(filename, type);


3. 파일 닫기

파일 닫기 연산은 실제로 매우 중요한 연산이다. 많은 소스 코드에서 파일을 닫지 않고 프로그램을 종료하는 경우가 있는데, 운영체제의 지원이 없다면 이러한 프로그램은 정상적으로 작동하지 않는다. 파일구조에서 가장 중요한 점은 디스크 접근을 최소화하는 것이다. 따라서, 운영체제는 파일 쓰기 연산에 대한 요청이 오면 디스크에 쓰는 것이 아니라 임시 버퍼에 데이터를 저장한다. 응용프로그램에 의해 파일 닫기 연산이 호출되면 운영체제는 임시 버퍼에 저장된 데이터를 한번에 디스크에 쓴다.

운영체제는 파일 닫기가 호출되지 않더라도 프로그램이 종료되면 자동으로 파일 닫기 연산을 실행한다. 만약 운영체제의 이러한 기능이 없다면, 파일 닫기를 호출하지 않은 프로그램에서 쓰도록 지시한 데이터는 실제 파일에 저장되지 않는 오류가 발생할 것이다.


4. 파일 읽기 및 쓰기

파일 읽기와 쓰기는 파일에 대한 연산에서 가장 빈번하게 사용되는 연산이다. 그러므로, 효율적인 파일구조를 설계하기 위해서는 파일 읽기와 쓰기 연산을 최적화하는 것이 중요하다. 만약 low-level에서 파일을 접근하다면 아래와 같이 파일의 이름, 연산을 적용하고자 하는 위치, 데이터의 크기 등에 대한 모든 정보를 함수의 인자로 전달해야할 것이다. 그러나 C++나 Java와 같은 high-level language에서는 << 연산자, read 메소드 등의 추상화된 연산자나 메소드를 호출하여 파일에 대한 읽기 및 쓰기를 수행한다.