
C#에서는 파일에 데이터를 쓰거나 읽기 위해 스트림(Stream)이라는 개념을 사용합니다.
처음 들으면 조금은 막연하게 느껴질 수 있지만, 사실 스트림은 파일뿐만 아니라
네트워크, 메모리 등 다양한 데이터 입출력을 다루는 근본적이고 중요한 개념입니다.
이번 글에서는 스트림(Stream)이 대체 무엇인지 그 개념에 대해 알아보겠습니다.
스트림(Stream)은 데이터가 흐르는 통로 또는 연속적인 데이터의 흐름을 의미합니다.
수도꼭지를 틀면 물이 파이프를 통해 흘러나오는 것처럼, 스트림도 마찬가지로
데이터가 바이트(byte) 단위로 순서대로 흐를 수 있게 해주는 '통로' 역할을 합니다.
데이터의 시작점과 끝점이 어디든 상관없이, 하나의 표준화된 방법으로 제공합니다.
스트림은 기본적으로 두 가지 일을 할 수 있어요.
"그냥 파일 전체를 한 번에 읽거나 쓰면 안 되나요?"라고 생각할 수 있어요.
물론 작은 파일이면 괜찮지만, 스트림을 사용하면 효율적인 프로그램을 만들 수 있습니다.
1. 메모리 효율성
만약 30GB짜리 거대한 동영상 파일을 컴퓨터가 처리한다고 상상해보세요.
컴퓨터의 메모리(RAM)가 8GB라면, 이 파일을 통째로 메모리에 불러오기 힘들겠죠?
스트림은 파일 전체를 메모리에 올리지 않고, 필요한 만큼 조금씩 읽어와서 처리합니다.
덕분에 아무리 큰 파일이라도 적은 메모리로 처리할 수 있게 됩니다.
2. 추상화
C#에서 스트림은 일종의 '설계도'와 같아요.
이 설계도를 바탕으로 다양한 종류의 '수도관'을 만들어 놨어요.
FileStreamNetworkStreamMemoryStream3. 일관성 있는 프로그래밍: 파일, 네트워크, 메모리 등 데이터 소스의 종류에 관계없이
Read()와 Write()라는 동일한 방식으로 데이터를 다룰 수 있습니다.
4. 유연성: 필요에 따라 데이터 소스를 파일에서 메모리 버퍼로, 또는 네트워크 스트림으로
전환할 수 있으며, 기존 코드의 큰 수정 없이 처리 방식만 변경할 수 있습니다.
C#에서는 System.IO.Stream이라는 추상 클래스가 모든 스트림의 '조상' 역할을 합니다.
그리고 각각의 목적에 특화된 다양한 '자손'의 스트림 클래스들이 존재합니다.
FileStream: 파일에 데이터를 읽고 쓸 때 사용하는, 가장 대표적인 스트림입니다.MemoryStream: 메모리(RAM)를 데이터의 통로로 사용합니다.NetworkStream: 네트워크를 통해 데이터를 주고받을 때 사용합니다.BufferedStream: 다른 스트림을 감싸서 '버퍼(Buffer)'라는 임시 저장 공간을 만듭니다.System.IO.Stream클래스는 기본적으로 '순차 접근'을 포함하고 있으며,
스트림(Stream)의 종류에 따라 '임의 접근'도 할 수 있습니다.
NetworkStream: 네트워크 통신은 기본적으로 데이터가 순서대로 흐릅니다.CryptoStream: 대부분의 암호화/복호화 방식은 '순차 접근'이 효율적입니다.FileStream: 파일은 임의 접근이 가능한 매체입니다.MemoryStream: 메모리는 임의 접근이 가능한 매체입니다.C#에서 스트림(Stream)의 개념을 잘 이해하고 나면
앞으로 데이터를 다루는 일이 훨씬 수월하답니다.