스트림 기반(Stream-based) 입출력은 데이터를 한 번에 처리하지 않고, 작은 단위로 나누어 순차적으로 처리하는 방식을 의미한다. 이는 데이터를 읽거나 쓸 때 메모리 효율성을 높이고 처리 속도를 향상시키는 데 유리하다.
스트림 기반 입출력의 주요 개념과 장점을 이해하기 위해 몇 가지 핵심 포인트를 설명하겠다:
- 스트림의 개념:
- 스트림은 데이터의 흐름을 의미한다. 입력 스트림(input stream)은 데이터가 프로그램으로 들어오는 흐름을, 출력 스트림(output stream)은 데이터가 프로그램에서 나가는 흐름을 말한다.
- 스트림은 연속적인 데이터의 흐름으로, 파일, 네트워크 소켓, 키보드 입력 등 다양한 소스와 목적지에서 사용된다.
- 버퍼링:
- 스트림 기반 입출력은 버퍼(buffer)를 사용하여 데이터를 임시 저장하고, 이를 통해 입출력 성능을 최적화한다.
- 버퍼링은 데이터를 한 번에 많이 읽거나 쓰는 대신, 작은 크기의 데이터를 모아서 한 번에 처리한다. 이렇게 하면 디스크나 네트워크와의 입출력 작업 횟수를 줄여 성능을 향상시킬 수 있다.
- 블록 단위 처리:
- 스트림 기반 입출력에서는 데이터를 한 번에 한 줄씩 또는 일정한 크기의 블록 단위로 처리한다. 이는 메모리 사용을 최소화하면서도 효율적으로 데이터를 다룰 수 있게 한다.
- 예를 들어, 파일을 읽을 때 모든 데이터를 한 번에 메모리에 올리지 않고, 필요한 만큼씩 읽어 처리할 수 있다.
- 예시 코드:
# 스트림 기반 입출력 예제
with open('example.txt', 'r') as f:
while True:
line = f.readline()
if not line:
break
print(line.strip())
이 예제는 파일 example.txt
를 스트림 기반으로 읽어서 한 줄씩 처리하는 코드이다. f.readline()
은 파일에서 한 줄씩 읽어 들이며, 더 이상 읽을 줄이 없으면 None
을 반환하여 루프를 종료한다.
- 장점:
- 메모리 효율성: 모든 데이터를 한꺼번에 메모리에 로드하지 않고, 필요한 부분만 읽어서 처리하기 때문에 메모리 사용량을 줄일 수 있다.
- 성능 향상: 버퍼링을 통해 입출력 작업의 빈도를 줄임으로써 디스크나 네트워크와의 통신 시간을 줄일 수 있다.
- 유연성: 스트림 기반 입출력은 다양한 데이터 소스와 목적지에 대해 동일한 방식으로 데이터를 처리할 수 있어 코드의 재사용성과 유연성이 높아진다.
이와 같이 스트림 기반 입출력은 대량의 데이터를 효율적으로 처리하기 위해 중요한 기법이다.