[Basic] File, Stream 의 이해

한호성·2023년 4월 2일
0

Introduction

실무, 개인프로젝트 모두에서 파일과 관련하여 파일 읽기, 저장,삭제, 수정 등 다양한 일을 진행하였습니다. 하지만, 개념적인 부분이 늘 부족하다고 느껴졌습니다. 요번에는 파일 IO 에 대해 공부해보도록 하겠습니다.
[목차]

  • File 이란, File의 종류
  • Stream 개념

File 이란, File의 종류

파일이란 의미 있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치상의 논리적인 단위를 의미합니다
출처 (http://www.tcpschool.com/c/c_io_file)

파일이 필요한 이유

프로그래밍 관점에서 봤을 때, 프로그램에 관한 데이터를 어딘가에 영구적으로 저장해서 보관할 필요가 있습니다. 이 때, 사용하는 방법 중 하나가 파일에 저장을 하는 것입니다. (영구 저장소들의 한 종류)

파일의 종류

컴퓨터는 파일을 두 종류로 나눕니다.

  1. 바이너리 파일
  2. 텍스트 파일

(이 부분에 있어서, 저는 엄청나게 많이 햇갈렸습니다. 컴퓨터는 모두 이진데이터로 데이터를 저장하는데, 텍스트 파일은 이진파일이 아닌가? 라는 의문이 들면서 개념에 혼동이 왔습니다. 한번 정리해보도록 하겠습니다.)

우선 이해햐라 것은 두 파일 종류 모두 바이트 단위로 저장됩니다.
(바이트 = 8bit / 1bit 0과 1로 표현되는 이진 데이터)

그렇다면 어떤 차이가 있는 것일까요?

파일을 어떻게 저장하는지에 대해 알아보면 쉽게 이해가 가능합니다.
예를 들어 100 이란 숫자를 텍스트 파일과 Binary로 각각 저장해보도록 하겠습니다.
우선 텍스트 파일은 100 이란 숫자가, 1 , 0 , 0 3 바이트로 저장이 되어있습니다.

다음으로 바이너리 파일을 보면, 100 이란 숫자가 64 로 1byte 저장되어있습니다.(16진수 64 입니다. cf) 16진수는 4bit로 표현가능하며 8bit 가 1byte이므로, 16진수 2개로 1byte를 나타낼 수 있습니다.)

같은 숫자 100을 저장하더라도 이런 차이가 있습니다. 텍스트 파일은 읽을 수 있는 형태로 저장하고, 바이너리 파일은 숫자 자체를 저정합니다.

텍스트 파일은 인간친화적(눈에 바로 읽힘), 바이너리 파일(해석을 해서 봐야지 이해 가능함)은 기계친화적이라고 생각할 수 있겠습니다.
( 지금도 많이 사용하고 있는 JSON 파일은 텍스트 파일입니다. 문자를 문자그대로 형태로 보관하고 있는것이지요. 이미지,동영상 파일 같은 것들은 이진 파일이라고 보면 되겠습니다. 각 확장자에 맞는 프로그램에서 각 데이터를 변환해서 우리에게 맞게끔 보여준다고 이해하면 되겠습니다.)

다음으론 스트림에 대해 알아보겠습니다.
(이전에 공부한 Stream API는 아예 다른 내용입니다. Stream이라고 부른 의미정도는 비슷할 수도 있겠네요... )

Stream

파일 입출력 할 때, 모든 파일 컨텐츠를 다 메모리로 읽는다고 생각해보겠습니다.
만약 파일용량이 3~4GB 하는 영화라면..? 렘이 부족할 수도 있겠지요?

이를 해결할 수 있는 개념이 Stream 입니다.

(아마 노래 Streaming 서비스의 Streaming도 이 Stream 개념에서 온 것이라 생각합니다.)

스트림이란 파일의 일부를 볼 수 있느냐의 개념입니다. 즉, 파일은 이어지는 데이터들의 집합이고, 우리는 파일을 읽을 때, 순서대로 불러오면서 읽는다고 생각할 수 있습니다. 또, 이 Stream 안에서, 우리는 원하는 부분을 읽을 수 있다는 개념입니다.

각 언어마다, Stream 의 개념을 사용하는 Class들이 존재합니다. 어떻게 사용하는지 직접 사용하는 언어에서 공부해보면, 이해하기 좋을 것이라 생각합니다.

ex)Java  Stream Class
BufferedReader, BufferedWriter(character 기반),
BufferedInputStream BufferedOutputStream (Byte 기반)

느낀점

파일을 공부하면서 우리가 사용하고 있는 데이터들이 실제로 어떻게 저장되고 사용하는지 간단하게라도 알 수 있었습니다.

이전에는 그냥 구현에만 초점을 맞췄다면, 이제 어떤식으로 기계에 표현되는지도 알아야 문제를 만날 때 잘 해결할 수 있을 것이라 생각합니다. 이 개념을 갖고, 문제에 접근하면 조금 더 쉽게 문제를 해결할 것이라 생각합니다.

Reference

http://www.tcpschool.com/c/c_io_file
https://badayak.com/entry/C%EC%96%B8%EC%96%B4-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94

profile
개발자 지망생입니다.

0개의 댓글