2009년 11월 5일 목요일

스트림의 종류

스트림의 종류

 

스트림의 종류를 구분하는 방법은 두가지가 있습니다. 먼저, 절에서 보았던 데이터 흐름의 방향성을 기준으로 입력스트림(Input Stream) 출력스트림(Output Stream)으로 나눌 있습니다. 다른 한가지 방법은 스트림이 데이터를 처리하는 단위를 기준으로 생각해 있는데, 바이트스트림(Byte Stream) 문자스트림(Character Stream)으로 구분할 있습니다. 바이트스트림, 문자스트림, 입력스트림, 출력스트림의 관계를 도식으로 나타내면 다음과 같습니다.

 

그림 9-1 스트림의 종류와 방향성

 

입력스트림과 출력스트림

기본적인 구분으로 입력스트림과 출력스트림으로 나눌 있습니다. 입력스트림은 Stream, TextReader, BinaryReader 클래스 등이 이에 해당합니다. 그리고, 출력스트림은 Stream, TextWriter, BinaryWriter 클래스가 있습니다.

 

 

데이터 흐름의 방향성 분류

q                입력스트림(ex: Stream, TextReader, BinaryReader)

q                출력스트림(ex: Stream, TextWriter, BinaryWriter)

 

위의 분류에서 이상한 것이 있습니다. Stream 클래스는 입력스트림에도 존재하고, 출력스트림에도 존재하고 있습니다. Stream 클래스는 사용 용도에 따라서 입력과 출력을 동시에 사용할 있는 클래스입니다. 반면에, TextReader BinaryReader 클래스는 입력 작업에만 사용이 가능하고, TextWriter BinaryWriter 클래스는 출력 작업만 가능한 클래스로 입력과 출력이 서로 나누어져 있습니다. 위에서 소개되어진 5개의 클래스 Stream, TextReader, TextWriter 추상클래스로 선언되어 있기 때문에 스스로 작업하는 것보다 파생클래스에서 이를 구현해서 사용합니다. 다음은 스트림의 종류를 상속 구조에 따라 분류하고 있습니다.

 

 

입력스트림과 출력스트림의 메서드

입력스트림은 Read()라는 메서드를 포함하고 있습니다. 읽어들인다는 의미겠죠. 다음은 바이트와 문자 단위로 입력스트림 작업을 사용하는 메서드들을 보여주고 있습니다.

 

입력스트림(Input Stream) 계열의 메서드

q                Stream 클래스: public abstract int Read(byte[ ] buffer, int offset, int count)

q                TextReader 클래스 : public virtual int Read()

q                TextReader 클래스 : public virtual int Read(char[ ], int, int)

q                TextReader 클래스 : public virtual string ReadLine()

q                BinaryReader 클래스 : public virtual int Read()

q                BinaryReader 클래스 : public virtual int Read(byte[], int, int)

q                BinaryReader 클래스 : public virtual int Read(char[], int, int)

 

출력스트림은 Write()라는 메서드를 포함하고 있습니다. 기록한다는 의미겠죠. 다음은 출력 작업을 사용하는 메서드를 보여주고 있습니다.

 

출력스트림(Output Stream) 계열의 메서드

q                Stream 클래스: public abstract void Write(byte[ ] buffer, int offset, int count)

q                TextWriter 클래스 : public virtual void Write(bool value)

q                TextWriter 클래스 : public virtual void Write(char[ ])

q                TextWriter 클래스 : public virtual void Write(object obj)

q                TextWriter 클래스 : public virtual void WriteLine(bool value)

q                TextWriter 클래스 : public virtual void WriteLine(char[ ])

q                TextWriter 클래스 : public virtual void WriteLine(object obj)

q                BinaryWriter 클래스 : public virtual void Write(byte)

q                BinaryWriter 클래스 : public virtual void Write(byte[])

q                BinaryWriter 클래스 : public virtual void Write(char)

q                BinaryWriter 클래스 : public virtual void Write(char[])

 

입력스트림(Input Stream) 사용

q                목표지점에 데이터 스트림 생성

q                [알맞은 데이터 스트림으로 변환]

q                데이터 입력(Read 계열 메서드)

q                데이터 스트림 닫기(Close() 메서드)

 

출력스트림(Output Stream) 사용

q                목표지점에 데이터 스트림 생성

q                [알맞은 데이터 스트림으로 변환]

q                데이터 출력 또는 저장(Write 계열 메서드)

q                데이터 스트림 닫기(Close() 메서드)

 

문자스트림과 바이트스트림

기본적인 분류는 각각의 장치에 쌍으로 입출력이 존재한다고 있습니다. 다른 분류 방법은 스트림의 처리 단위를 기준으로 분류입니다. 문자 단위로 스트림을 처리한다면 문자스트림(Character Stream)이라고 있으며, 바이트 단위로 스트림을 처리한다면 바이트스트림(Byte Stream)이라고 말할 있습니다.

 

바이트스트림은 데이터를 바이트 단위로 주고받는 스트림입니다. 대표적인 바이트스트림은 Stream 클래스입니다. Stream 클래스는 데이터를 원시바이트로 주고받을 있습니다. Stream 클래스는 입력과 출력을 하나의 클래스에서 해결하고 있으며, Stream 클래스를 상속하여 구현한 모든 스트림들은 바이트스트림에 해당합니다. 그리고, 약간 특이한 것은 스트림의 클래스 이름에 Stream이라는 단어가 붙어 있으면 바이트스트림 계열에 속한다는 것입니다. 바이트 계열의 스트림은 대부분 형식을 따르고 있으니, Stream이라는 단어가 붙어 있으면 바이트스트림이라고 생각하시면 됩니다. 바이트스트림의 예는 다음과 같습니다.

 

바이트스트림(Byte Stream) 종류

q                Stream : 스트림 계층 구조의 최상위 추상 기본클래스

q                BufferedStream : 바이트스트림에 버퍼 기능의 추가

q                FileStream : 파일 I/O 사용

q                MemoryStream : 메모리에 사용

 

그렇다면, 문자스트림은 무엇일까요? C#에서 사용하는 문자방식은 바이트로 하나의 문자를 표현하는 유니코드(Unicode) 방식을 사용합니다. 바이트 단위로 전송된 데이터를 C# 내부에서는 유니코드로 인코딩해서 사용합니다. 물론, 각각의 원시바이트의 문자 인코딩 방식에 따라서 해석하고 이것을 C#에서 사용할 있는 문자로 바꾸는 역할은 스트림이 담당합니다.

 

문자스트림은 TextReader TextWriter 상속해서 구현합니다. TextReader StringReader 확장되어지며 TextWriter StringWriter 확장되어 사용됩니다. 그리고, 문자스트림이 Reader 계열일 경우에는 문자를 읽어들이는 메서드를 포함하고 있고, Writer 계열일 경우에는 문자를 기록하는 메서드를 포함하고 있습니다.

 

문자스트림(Character Stream) 종류

q                TextReader, TextWriter : 문자스트림 계층 구조의 최상위 추상클래스

q                StreamReader : 입력 바이트스트림을 문자스트림으로 변환

q                StreamWriter : 출력 바이트스트림을 문자스트림으로 변환

q                StringReader : 문자열을 핸들하기 위한 입력 문자스트림

q                StringWriter : 문자열을 핸들하기 위한 출력 문자스트림

 

지금까지 스트림의 종류에 대해서 알아보았습니다. 위의 스트림들은 문자스트림이든 바이트스트림이든, 모두 처음엔 바이트로 받아들이는 것은 마찬가지입니다. 그리고, 해당 스트림이 용도에 따라 알아서 처리를 해주는 것이지요. 각각의 스트림은 가공하는 방법과 장치가 다를 데이터를 읽고 기록한다는 측면은 동일합니다. 장치에 맞는 스트림을 선택하고 이용하는 것은 프로그래머의 몫입니다. 결론적으로 스트림은 데이터를 얻거나 저장할 있게 도와주며, 프로그래머가 사용하기 쉽도록 데이터를 변환해 주는 역할까지 수행합니다.

 

이외에도 데이터타입(Data Type) 따라서 적당한 바이너리 형태로 읽거나 기록하는 BinaryReader, BinaryWriter 있습니다. 이것에 대해서는 앞으로 나올 절들에서 다루게 것입니다.

 

[출처 : http://imadonis.springnote.com/pages/435987]

댓글 없음:

댓글 쓰기