"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
'프로그래밍 > Java' 카테고리의 다른 글
Java/Kotlin에서의 예외처리에 관하여 (1) | 2024.01.28 |
---|---|
Javadoc 알고 쓰기 (0) | 2024.01.06 |
[Java] 문자열에서 URL만 추출하기 (0) | 2021.01.08 |
[Java] URL인지 체크하기, URL 정규식 (0) | 2021.01.08 |
Java 사다리 게임 소스 (0) | 2017.12.01 |