닷넷 프레임워크의 스트림 이해하기
스트림은 닷넷 프레임워크의 입출력 작업에서 가장 중요한 개념입니다. 이 아티클에서는 스트림의 개념을 설명하는 것과 함께, 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
정리
예 제도 간단하게 실으려 했으나.. 쓸데없이 길어질 것도 같고, 보통 스트림은 용도별로 나뉘기 때문에 특정 응용 부분과 함께 기술하는 것도 좋겠다 싶어서 다음으로 미뤄두도록 하겠습니다. 스트림을 이해하는데 이 아티클이 도움이 되길 바랍니다.
그럼 : )
'TechLog' 카테고리의 다른 글
웹 서비스 팁 ; 세션 사용하기, 함수의 설명 제공하기 (0) | 2008.11.04 |
---|---|
닷넷에서 텍스트를 프린터로 출력하기 (2) | 2008.11.03 |
윈도우 서버 제품군(2003, 2008 등)에 msn 메신저 설치 (0) | 2008.10.25 |
Flash & Asp.net - 4 ; Asp.net & Flash & Web Service! (0) | 2008.10.24 |
Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기 (0) | 2008.10.23 |