프로그래밍/Java

Stream의 개념을 설명할 수 있나요? (의역)

Lou Park 2023. 7. 30. 13:59

"Stream"이라는 단어는 실제로 그걸 사용할때 전달하고자하는 의미와 비슷해서 선택된 것입니다.

그냥 다 잊어버리고, 물줄기(Water stream)에 대해서 생각해봅시다.

강에 흐르는 물처럼, 우리는 흐르는 데이터를 받을 수 있습니다.

이 데이터가 어디서 왔는지 알 필요는 없죠.

이게 파일에서 오든, 소켓에서 왔든, 다른 어떤 것이든...정말 알 필요가 없습니다.

 

뭐 물을 받을 때도 마찬가지입니다.

이 물이 호수에서 오든, 분수에서 왔든간에 알 필요가 없습니다.

 

즉, 이 데이터가 어디서 왔는지 관계없이 데이터를 받는데에만 신경을 쓰게된다는 겁니다.

데이터의 흐름이 추상화된 것이 "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을 이용하면 처리 로직을 변경하지 않고 Input Source를 아주 쉽게 바꿀 수 있습니다.

만약에 파일에서 대신에 네트워크 소켓에서 데이터를 읽는걸로 바꾼다고친다면 이렇게만 하면 되겠죠.

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

 

그리고 이 Input Source는 뭐든 될 수 있기 때문에, 직접 Stream "Wrapper"를 만들어서 이런 것도 할 수 있죠.

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());

 

ReadInt라는 메소드는 Input Source가 뭔들 상관없기떄문에 Source를 다양한 방법으로 커스터마이즈 할 수 있습니다.

이러한 추상화는 아주 우아한 방법으로 처리 로직과 입력을 분리시켜줍니다.


StackOverFlow에서 꽤 멋진 답변을 본거같아서 올린다.

https://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams