티스토리 뷰
우리는 Stream 이 프로그래밍 중에 자주 나오는데 왜 이 단어가 쓰이며 무슨 의미인지 확신하지 못할 때가 많다.
그래서 이번 포스트를 통해 스트림에 대해 다시 알아보고자 한다.
먼저 스트림이란??!!
"스트림"이라는 단어는 우리가 프로그래밍에서 사용할 때 사용되는 의미와 실생활에서 사용되는 의미와
매우 유사한 의미를 나타내기 때문에 선택되었다.
데이터에 대한 내용은 잠시 잊고, 물줄기에 대한 비유를 생각해 보자!
강에서 물이 계속 흐르듯이 개발자는 데이터의 지속적인 흐름을 받는다.
데이터가 어디에서 오는지는 알 수 없으며, 대부분의 경우 굳이 어디서 받을지 알 필요가 없다.
(파일, 소켓 또는 기타 소스에서 오는 데이터든 상관 없다).
이것은 물줄기를 받는 것과 매우 유사하며, 물줄기가 어디에서 오는지 알 필요 없는 것과 유사하다.
(호수, 분수 또는 다른 원천에서 오든 상관 없다)
그렇긴 하지만, 일단 나는그 데이터들이 어디에서 왔든 간에,
내게 필요한 데이터를 얻는 것에만 신경을 쓸 것이기에!! 추상화의 의미가 더 명확해진다.
스트림을 랩할 수 있다고 생각하기 시작하면, 우리의 방법은 여전히 완벽하게 작동한다.
아래 예를 들어 다음과 같은 작업을 수행해 보자.
int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }
// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);
int x = ReadInt(reader);
보시다시피, 처리 로직을 변경하지 않고 입력 소스를 변경하는 것은 매우 쉬워졌다.
예를 들어, 파일 대신 네트워크 소켓에서 데이터를 읽으려면 아래와 같다.
Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);
매우 쉽지 않은가?
어디서 받은지, 찾을 필요도 없고 ,
어떤 종류의 입력 소스라도 사용할 수 있고, 그것을 위한 스트림 "랩퍼"를 만들 수 있는 한 말이다.
아래 같이도 사용할 수 있다.
public class RandomNumbersStreamReader : StreamReader {
private Random random = new Random();
public String ReadLine() { return random.Next().ToString(); }
}
// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());
알겠는가?
입력 소스가 무엇이든 상관하지 않는 한!!
다양한 방법으로 소스를 사용자가 지정할 수 있으며
해당 추상화는 매우 우아한 방법으로 입력을 처리 로직에서 분리할 수 있게 한다.
따라서 요약하자면,
스트림은 다른 소스를 숨겨(추상하는) 로직을 분리하고 가독성을 높이는 입력 소스일 뿐이다.