2009년 11월 5일 목요일

스트림(Stream)

스트림(Stream)

 

C#에서 스트림을 이용하여 I/O 작업을 있는 곳은 매우 다양합니다. 여러분이 쉽게 접할 있는 I/O 작업은 모니터와 키보드를 통한 입출력 방법입니다. 가장 많이 사용하는 Console.WriteLine() 메서드는 표준출력(Standard Output)으로서 명령 프롬프트 상에 데이터를 출력하는 것을 담당하고 있습니다. 그리고, Console.ReadLine() 메서드는 표준입력(Standard Input)으로서 키보드의 입력을 담당하고 있습니다. 이외에도 아주 다양한 곳에서 입출력 작업이 이루어지고 있습니다.

 

데이터를 입력받고 데이터를 출력하는 작업은 아주 까다로울 것이라고 생각하지만 여러분은 이미 이러한 입력과 출력 작업을 스트림을 통해서 사용하고 있었던 것입니다. 입력과 출력을 도와주는 스트림이 없다면 어떻게 해야 하는지를 한번 생각해 보십시오. 아마도 하드웨어적인 것까지 직접 프로그래머가 다루어야만 모니터에 뭔가를 출력할 있을 것입니다. 그래서, 입출력을 도와주는 중간 역할을 하는 것을 필요로 하는 것입니다. 입출력 작업을 도와주는 중간 매개체 역할을 하는 놈을 우리는 스트림(Stream)이라고 부릅니다.

 

스트림(Stream) 정의

q                자료의 입출력을 도와주는 추상적인 개념의 중간 매개체

 

스트림이 사용되는 입출력 장치(Input Output Device) 다양한 형태로 존재합니다. 가상의 메모리가 수도 있으며 디바이스(Device)같은 물리적인 장치가 수도 있습니다. 예는 다음과 같습니다.

 

     1 스트림을 사용하는

q              파일

q              키보드, 모니터, 마우스

q              메모리

q              네트워크 연결

q              프린트

 

입출력 장치(Input Output Device) 종류가 다양하듯이 스트림의 종류도 매우 다양합니다. 만약, 파일에 데이터를 읽어내거나 기록하고자 한다면, 여러분은 당연히 파일에 관련된 스트림을 찾고 파일을 목표지점으로 삼을 것입니다. 목표지점이란 스트림이 목표로 하는 곳을 말합니다. 입력 작업의 목표지점은 데이터가 존재하는 곳이며, 출력 작업의 목표지점은 데이터가 저장되는 곳이 것입니다.

 

C#에서 파일에 스트림을 생성하는 클래스는 FileStream 클래스입니다. 입력이든 출력이든 목표지점을 정확하게 주어야만 파일을 읽고 기록할 있습니다. 파일 입출력스트림에 목표지점(파일이름) 주고 스트림을 생성합니다. 그리고, 생성된 스트림을 이용하여 읽기와 쓰기 작업을 있습니다. 거짓말같지만 스트림이 하는 일은 이것밖에는 없습니다. Read, Write 기능이 스트림의 90% 차지하고 있습니다. 특별한 것은 없습니다. 스트림을 설명하고자 다음과 같은 비유가 가장 좋겠군요

 

스트림(Stream)이란?

      스트림은 데이터를 읽고 기록하는 중간역할을 한다.

      스트림은 빨대다.

      빨대는 음료수를 마시는 중간역할을 한다.

      빨대는 입에 있는 음료수를 다시 내뱉는 중간역할을 한다.

 

입출력 장치에 데이터를 기록하고 읽어들이기 위해서 스트림이 존재합니다. 스트림은 데이터 흐름이라는 방향성을 주어서 분류해 본다면 나를 기준으로 데이터가 들어오면 입력스트림(Input Stream)이고, 데이터가 밖으로 나간다면 무조건 출력스트림(Output Stream)입니다. 결국, 입력스트림과 출력스트림 개로 나누어 생각할 있습니다.

 

입력스트림(Input Stream)

q      입력스트림은 데이터를 스트림으로 읽어 들입니다. 그리고, 스트림에 존재하는 데이터를 하나씩 읽어들일 있습니다.

q      음료수를 마실 빨대를 이용하여 음료수를 빨대에 모으고 빨대에 들어있는 음료수를 흡입합니다. 그러면, 입안으로 음료수가 들어올 것입니다.

 

출력스트림(Output Stream)

q       출력스트림으로 데이터를 보냅니다. 그리고, 출력스트림에 보낸 데이터를 비워 버립니다. 그렇게 되면 출력스트림에 존재하던 데이터가 모두 목표지점에 저장됩니다.

q       입안에 있던 음료수를 빨대로 일단 보냅니다. 빨대에 들어있는 음료수를 불어 버립니다.(Flush) 그렇게 되면 음료수는 다시 안으로 들어가게 됩니다.

 

위와 같이 스트림은 데이터를 처리하는 중간자 역할 합니다. 우리는 데이터의 목표지점이 네트워크의 어떠한 장소이든 메모리이든 상관하지 않습니다. 다만, 해당 데이터를 스트림으로 내보내고 그리고 스트림에 존재하는 데이터를 읽어들이거나 기록해 버리면 그것으로 끝인 것입니다. 이것은 목표지점이 어디라도 상관없다는 이야기죠. 그리고, 복잡한 작업은 스트림이 알아서 해결해 주는 것입니다. 다음 절에서는 스트림의 종류에 대해 알아보겠습니다.

댓글 없음:

댓글 쓰기