Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[Stream] - Stream 개요

작성자 : 박종명
최초 작성일 : 2008-06-16 (월요일)
최종 수정일 : 2008-06-16 (월요일)
조회 수 : 3134

* Stream

 번역 : 시내,, 흐름,연속,이어짐
       <<
컴퓨터>> 데이터의 흐름

 

* Stream 개요
컴퓨터에서의 Stream 은 위에서 정의한 대로 데이터의 흐름을 말한다.

특정 리소스(하드디스크,메모리,네트웍 장치,프린터 등)에 데이터를 순차적으로 쓰거나 읽도록 하는 매개체를 Stream 이라 한다. 이는 실제로 특정 형태로 존재하는 그 무엇이 아닌 추상적인 개념이라 할 수 있다.

 

* Backing Store

데이터를 쓰거나 읽어 들일 수 있는 리소스에는 파일,메모리,소켓 등이 있다

이를 Backing Store 라 하는데 MSDN 번역으로 백업 저장소라 한다.

 

아래 그림은 Backing Store Stream 의 개요 도를 나타낸다



위 그림에서 보여지듯이 백업 저장소로부터 데이터를 읽어 들이는 입력 스트림과 데이터를 쓰는 출력 스트림이 있으며 닷넷에서는 대표적으로 입력 스트림 : Console.Read(Line) , 출력 스트림(Console.Write(Line)가 있다.

이렇듯
스트림은 백업 저장소와의 상호작용(Read,Write)를 가능케 하는 추상적인 중간 매개체의 개념인 것이다.

 

 

* Stream Hierarchy

닷넷의 Stream 계층 구조를 살펴 보자.



스트림 관련 클래스는 Stream 이라는 추상 클래스로부터 상속을 받는 FileStream,MemoryStream,BufferedStream,CryptoStream,NetworkStream 등이 있다. 각 스트림의 명칭에서도 알 수 있듯이 백업 저장소의 종류에 따라 지원되는 스트림이 각각 존재 하고 있다.

Stream 클래스들은 기본적으로 바이트 배열 형식으로 데이터를 읽거나 쓰도록
되어 있다

 

그리고 StreamReader StreamWriter TextReader,TextWriter 이라는 추상 클래스로부터 상속을 받는 클래스로써  바이트 배열이 아닌 형식화된 텍스트(formatted text) 로 데이터를 일고 쓰도록 지원한다.

Stream 클래스는 바이트배열 기반으로 동작하기 때문에 데이터를 쓰거나 읽을 때 바이트 배열로 변환해야 하는 불편함이 있다.


따라서 보다 편한 I/O 를 위해 (형식화된)텍스트 그대로를 읽고 쓸 수 있도록 해주는 클래스라 볼 수 있다

또한 BinaryReader BinaryWriter 은 데이터를 바이너리(binary) 형식으로 읽고 쓸 수 있도록 해 준다.


, 컴퓨터 메모리에 표현된 형식으로 데이터를 읽고 쓸 수 있다는 것이다

 


* Stream Type

닷넷의 스트림에는 그 성격에 따라 기본 스트림과 장식(Decoration) 또는 구성 가능한(Composable) 스트림을 나눠 볼 수 있다.

1) 기본 스트림(Base Stream) : 기본 스트림은 백업 저장소와 직접적으로 연동하여 I/O 를 수행하는
                                             스트림이다.

2) 구성 스트림(Composable Stream) :

   장식된 혹은 구성 가능한 스트림은 기본 스트림을 통해 백업 저장소와 연동한다. Base Stream 에 의

   존하여 I/O를 수행하게 된다. Composable Stream 은 기본 Stream 을 확장(장식) 하여 I/O를 수행하게

   되는데 대표적으로 데이터의 암/복호화를 통한 I/O 지원(CryptoStream), 성능향상을 위한 버퍼를 사용한

   I/O 지원(BufferedStream) 등이 있다. 물론, 개발자가 직접 Base Stream 을 확장하여 특수한 목적을 달성

   케 하는 구성 스트림을 개발하여 적용 할 수도 있다

 

 

  아래는 닷넷 1.1 기준의 Stream 들의 Type 구분 개요도 이다



 

그림에서 볼 수 있듯이 Composable Stream 백업 저장소와의 연동을 위해 Base Stream 상위에서 동작함을 알 수 있다.(Composable Stream 은 생성자에서 Base Stream을 매개변수로 전달 받는다)

 

그리고 Reader/Writer (StreamReader/StreamWriter) Composable Stream Base Stream 모두와 상호 작용이 가능함을 나타낸다.  

참고 사항>>

Compossable Stream 중에 하나인 BufferedStream 은 데이터 입/출력 시 버퍼를 사용하여 I/O 성능의 향상을 가져다 준다. 따라서 Base Stream Buffered Stream 을 감싸면 I/O 작업 시 버퍼링 기능을 사용할 수 있다. 그러나 Base Stream 중의 하나인 FileStream 은 이미 내부적으로 버퍼링을 지원한다.

FileStream 을 사용해서 I/O를 수행할 경우 내부적으로 데이터들은 메모리에 모아두고 적절한 순간에 실제 디스크에 기록하게 하는 버퍼링 기능이 내부의 가장 효율적인 방법으로 사용하도록 설계 되어 있다.

따라서 FileStream 사용시 굳이 BufferedStream 을 사용해서 버퍼링 기능을 추가 할 필요가 없는 것이다.

 

 

* Decorator 패턴

닷넷의 Stream 관련 객체들의 구조를 살펴 보면 자바에서와 유사하게 Decorator 패턴이 적용되어 있음을 알 수 있다. 예를 들어 파일에 데이터를 읽고 쓰는 기본 동작에서 추가적인 동작(암호화,버퍼링) 수행하도록 장식된 스트림이 있다. 이는 상속을 통한 확장보다는 위임과 구성을 통해 객체의 동작을 확장하는 유연한

구조를 제공한다.



물론 닷넷의 스트림 구조는 자바에서와 같이 데코레이터 패턴의 구조와는 약간 다른점이 있다.

장식 대상이 되는 클래스(FileStream,MemoryStream ) 과 장식을 하는 클래스(CryptoStream,BufferedStream ) 이 데코레이터로 존재 하지만 장식을 하는 클래스의 추상화된 클래스인 Decorator 클래스는 제외되어 있다. Decorator 클래스가 없다고 해서 데코레이터 패턴이 아닌 것은 아니다.

아래 그림을 보면 데코레이터를 수행하는 목적을 알 수 있다



기본이 되는 FileStream 2단계 장식하는 개요도 이다. File 에 데이터를 읽고/쓸 때 버퍼를 사용하여 성능을 향상 시키고 암호화된 데이터 입/출력을 지원하는 것이다.

디자인 패턴에 관련된 사항은 관련 책을 자세히 읽어 보기를 바란다.

이름
비밀번호
홈페이지
NX <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요