본문 바로가기

TechLog

닷넷 프레임워크의 스트림 이해하기

닷넷 프레임워크의 스트림 이해하기

스트림은 닷넷 프레임워크의 입출력 작업에서 가장 중요한 개념입니다. 이 아티클에서는 스트림의 개념을 설명하는 것과 함께, System.IO 네임스페이스에 있는 스트림 관련 클래스들을 설명합니다.

 

 

안녕하세요 : )

 

Java 와 닷넷 프레임워크에서는 입출력 작업을 스트림이란 개념을 통해서 추상화합니다. 바이트 단위의 입출력을 스트림을 통해서 하나의 그룹으로 묶어 줌으로써, 비동기 통신 및 이벤트 방식의 입출력 등 보다 상위의 기능을 지원할 수 있는 형태로 제공하고 있습니다. 이런 스트림의 개념을 이해함으로써 닷넷 프레임워크에서 이루어지는 입출력 및 제어 구조를 쉽게 이해할 수 있을 것이라고 생각합니다.

 

그럼 시작합니다 : )

 

 

스트림이 뭐에요?

 

스트림(Stream)을 사전에서 찾아보자.

 

    stream         

        1   A stream is a small narrow river.

        2   A stream of smoke, air, or liquid is a narrow moving mass of it.

        3   A stream of vehicles or people is a long moving line of them.

...

            (Collins Cobuild 영영사전, (c) HarperCollins Publishers.)

 

뉘 앙스를 굳이 집어보자면, '(액체 등의)좁은 흐름' 정도로 볼 수 있겠다. 닷넷에서의 스트림을 정의하자면 다음과 같다 : 일련의 바이트들에 대한 일반적인 시각을 제공하는 것(Provides a generic view of a sequence of bytes, MSDN) 스트림은 입력 스트림과 출력 스트림으로 나뉘고, 입력 스트림을 통해 입력된 일련의 바이트들은 해당 스트림의 출력 스트림으로 출력된다.

 

좀 더 쉬운 설명을 위해서, 수도꼭지를 상상해 보자. 하나의 수도꼭지가 있고, 그곳에 고무 호스를 연결하면 수도꼭지에서 나오는 물이 호스의 다른 한 쪽으로 흘러나오게 된다. 그럼 그 고무 호스 끝에는 샤워기 꼭지를 연결할 수 있을 것이고, 물은 샤워기 꼭지를 통해 여러 갈래로 갈라져서 흘러나오게 될 것이다.

 

물 을 일련의 바이트로 보면, 처음의 수도꼭지는 출력 스트림으로 볼 수 있을 것이다. (물이 흘러나오므로) 그러면 수도꼭지는 호스의 한쪽 끝(=입력 스트림)과 연결되어 물을 흘려넣을 것이고, 흘려넣어진 물은 호스의 다른 한쪽 끝(=출력 스트림)으로 흘러나오게 된다. 마침내 호스의 다른 한쪽 끝으로 흘러나온 물은 다시 샤워기 꼭지(=입력 스트림)으로 들어가고, 결국 여러 갈래의 물줄기(=가공된 데이터)로 갈라져서 샤워기 끝(=출력 스트림)으로 흘러나오게 될 것이다.

 

이 정도면 이해가 가시는가?

 

 

System.IO 네임스페이스

 

닷 넷에서의 입출력 자체가 스트림이라는 개념을 기반으로 해서 이루어지는 만큼, 닷넷에서는 스트림과 입출력과 관계된 클래스들을 System.IO 네임스페이스에서 제공하고 있다. 스트림과 직접적으로 관련된 클래스는 꽤 많이 존재한다. (Stream 클래스에서 직접 상속되지 않은 클래스들도 있다) :

 

    Stream

바이트 읽기/쓰기를 지원하는 추상 클래스

    FileStream

Seek 메서드를 통한 파일의 임의 접근(Random Access)을 지원, 동기/비동기 작업을 지원

    MemoryStream

메모리에 직접 접근 가능함. 임시 버퍼로 유용하게 사용할 수 있는 스트림

    BufferedStream 

NetworkStream 같은 스트림에 버퍼링 기능을 지원하는 스트림. (FileStream, MemoryStream은 버퍼링이 별도로 필요하지 않음)

    TextReader  

유니코드 문자 읽기을 지원하는 추상 클래스

    StreamReader    

Encoding을 사용하여 문자->바이트간 변환을 지원하는 스트림.

    StringReader    

String을 문자로 읽어들이기 위한 스트림.

    TextWriter  

유니코드 문자 쓰기를 지원하는 추상 클래스

    StreamWriter    

Encoding을 사용하여 바이트->문자 변환을 Stream에 기록하는 기능을 지원.

    StringWriter    

문자를 String으로 쓰기 위한 클래스.

    BinaryReader    

바이너리 데이터를 스트림으로 처리하는 클래스.

    BinaryWriter

"

 

그 외에도 네트워크 I/O를 위한 System.Net.Sockets.NetworkStream 클래스, 암호화 스트림을 지원하기 위한 System.Securiry.Cryptography.CryptoStream 클래스, 오라클 데이터베이스의 특정 타입을 위한 System.Data.OracleClient.OracleBFile, System.Data.OracleClient.OracleLob 클래스 등이 존재한다.

 

 

참고

 

Inside C# 2nd Edition, 정보문화사

Stream Hierarchy http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemiostreamclasshierarchy.asp

 

 

정리

 

예 제도 간단하게 실으려 했으나.. 쓸데없이 길어질 것도 같고, 보통 스트림은 용도별로 나뉘기 때문에 특정 응용 부분과 함께 기술하는 것도 좋겠다 싶어서 다음으로 미뤄두도록 하겠습니다. 스트림을 이해하는데 이 아티클이 도움이 되길 바랍니다.

 

그럼 : )