# 1바이트씩 출력해 보는 메가바이트·킬로바이트 로드 프로그램 만들기 (초보자 가이드, 쉽게 따라하기)

---

# # 서론 – “왜 이렇게 많은 데이터를 출력해야 할까?”

프로그램을 개발하거나 서버를 운영할 때 **테스트용 데이터**가 필요합니다.

예를 들어 파일 업로드·다운로드 속도 측정, 메모리 사용량 파악, 혹은 네트워크 대역폭 검증 등 다양한 상황에서 **정해진 바이트 수 만큼의 데이터**를 빠르게 만들고 싶어지죠.

하지만 “1 MB를 바로 만들고 싶다”는 생각은 간단해 보이지만, 실제로는 **‘0’ 문자 1 048 576번을 출력**하는 정도의 로직이 필요합니다.

이번 포스트에서는 **레딧에 올라온 “Load a Megabyte or a Kilobyte”** 아이디어를 기반으로, **파이썬**만 있으면 몇 줄의 코드로 킬로바이트·메가바이트 단위 데이터를 손쉽게 “프린트”하는 방법을 초보자도 이해할 수 있게 풀어보겠습니다.

> **핵심 키워드**: `파이썬 파일 입출력`, `바이트 단위 출력`, `프로그래밍 초보`

---

# # 1. 프로그램 개요와 원리

## # 1‑1. 1 바이트 = 1 문자

컴퓨터는 문자 하나를 **1 바이트**(ASCII 기준)로 저장합니다.

따라서 `'0'` 한 글자를 `print()` 하면 **1 바이트**가 출력되는 것이죠.

## # 1‑2. 킬로바이트와 메가바이트 정의

| 단위 | 바이트 수 | 파이썬 코드 예시 |

|------|-----------|-----------------|

| 1 KB | 1 024 B   | `'0' * 1024`    |

| 1 MB | 1 048 576 B| `'0' * 1024 * 1024` |

즉, **‘0’을 1 024번** 반복하면 1 KB, **‘0’을 1 048 576번** 반복하면 1 MB가 됩니다.

## # 1‑3. 왜 “프린트”만으로도 충분할까?

- **콘솔**에 출력되는 텍스트 자체가 파일이 아니라 메모리 버퍼에 저장됩니다.

- 테스트용이라면 파일을 실제로 쓰지 않아도 **표준 출력**만으로 충분히 부하를 발생시킬 수 있습니다.

- 파일 입출력(`파이썬 파일 입출력`)보다 **속도가 빠르고 코드가 간결**합니다.

---

# # 2. 파이썬으로 구현하기 – 초보자도 5분 안에 완성!

아래 코드는 **명령줄 인자**로 `kb` 혹은 `mb`를 받아 해당 크기의 데이터를 콘솔에 출력합니다.

```
python

# !/usr/bin/env python3

import sys

def print_bytes(size: str):

    '''size가 'kb'이면 1KB, 'mb'이면 1MB를 출력한다.'''

    if size.lower() == 'kb':

        count = 1024               # 1KB = 1024 바이트

    elif size.lower() == 'mb':

        count = 1024 * 1024        # 1MB = 1,048,576 바이트

    else:

        print('사용법: python load.py [kb|mb]')

        return

    # 바이트 단위 출력 (키워드: 바이트 단위 출력)

    # 한 번에 너무 많이 출력하면 콘솔이 멈출 수 있으니

    # 10,000개씩 나눠서 출력한다.

    chunk = 10_000

    full_chunks, remainder = divmod(count, chunk)

    for _ in range(full_chunks):

        sys.stdout.write('0' * chunk)

    if remainder:

        sys.stdout.write('0' * remainder)

    # 마지막에 개행을 넣어 깔끔하게 마무리

    sys.stdout.write('\n')

    sys.stdout.flush()

if __name__ == '__main__':

    if len(sys.argv) != 2:

        print('사용법: python load.py [kb|mb]')

    else:

        print_bytes(sys.argv[1])

```

## # 코드 설명 (초보자를 위한 상세 주석)

1. **`import sys`** – 표준 입출력 스트림에 접근하기 위해 사용합니다.

2. **`print_bytes` 함수** – 인자로 `'kb'` 혹은 `'mb'`를 받아 바이트 수를 계산합니다.

3. **`chunk`** – 한 번에 10 000 바이트씩 출력하도록 나누어, 콘솔이 버퍼 오버플로우되는 상황을 방지합니다.

4. **`sys.stdout.write`** – `print()` 대신 사용하면 **줄바꿈 없이** 연속 출력이 가능해 **파일 입출력**과 유사한 동작을 구현합니다.

5. **`flush()`** – 버퍼에 남아 있는 데이터를 강제로 출력합니다.

> **팁**: 파일에 저장하고 싶다면 `sys.stdout`을 파일 객체(`open('output.bin','wb')`)로 바꾸면 됩니다. 이때는 **바이트 문자열**(`b'0'`)을 사용해야 합니다.

---

# # 3. 실행 결과 확인 방법

## # 3‑1. 콘솔에서 바로 확인

```
bash

$ python load.py kb | wc -c

1024

$ python load.py mb | wc -c

1048576

```

- `wc -c`는 **바이트 수**를 세어 주는 리눅스 명령어입니다.

- 위와 같이 파이프(`|`)를 연결하면 **출력된 바이트 수**를 즉시 검증할 수 있습니다.

## # 3‑2. 파일로 저장하고 확인하기

```
bash

$ python load.py mb > test.bin

$ ls -l test.bin

-rw-r--r-- 1 user user 1048576 Dec 13 12:30 test.bin

```

파일 크기가 **1 MB**가 된 것을 확인할 수 있습니다.

이때는 **파이썬 파일 입출력**을 활용한 것이므로, 파일 시스템에 실제 데이터가 기록됩니다.

---

# # 4. 응용 아이디어 – 테스트 환경을 더 풍부하게 만들기

| 활용 분야 | 구체적인 적용 예시 |

|----------|-------------------|

| 네트워크 부하 테스트 | `nc`(netcat)와 결합해 `nc -l 12345 < test.bin` 로 전송 속도 측정 |

| 메모리 사용량 측정 | `python -c 'data='0'* (1024*1024*10); print(len(data))'` 로 10 MB 메모리 할당 |

| 스트리밍 서비스 시뮬레이션 | `ffmpeg -f lavfi -i testsrc=size=1280x720:rate=30 -t 5 -f rawvideo -` 와 파이프 연결 |

| 로그 파일 자동 생성 | 일정 주기로 `load.py kb >> daily.log` 로 로그 파일 용량 관리 |

이처럼 **‘0’만 출력하는 간단한 프로그램**도 상황에 맞게 조합하면 **다양한 테스트 시나리오**를 손쉽게 구축할 수 있습니다.

---

# # 결론 – 직접 실행해 보고, 나만의 부하 테스트 도구를 만들어 보세요!

- **핵심 요점**

  1. 1 바이트 = 1 문자 → `'0'`을 반복 출력하면 바이트 단위 데이터 생성

  2. 파이썬 한 줄 코드로 킬로바이트·메가바이트를 즉시 출력

  3. `sys.stdout.write`와 `flush()` 로 **파일 입출력** 없이도 부하 시뮬레이션 가능

이제 여러분도 **프로그래밍 초보** 단계에서 바로 활용할 수 있는 “Load a Megabyte or a Kilobyte” 프로그램을 완성했습니다.

> **행동 유도**:

> 1️⃣ 위 코드를 복사해 `load.py` 파일에 저장하고 실행해 보세요.

> 2️⃣ `wc -c` 혹은 파일 크기 확인 명령으로 **정확히 1 KB / 1 MB**가 출력되는지 검증해 보세요.

> 3️⃣ 필요에 따라 **네트워크 부하 테스트**나 **로그 파일 자동 생성** 등 다양한 상황에 적용해 보세요.

작은 코드 한 줄이 여러분의 개발·운영 환경을 **더 견고하고 효율**적으로 만들어 줄 것입니다. 궁금한 점이나 추가 아이디어가 있다면 댓글로 알려 주세요! 🚀
