본문 바로가기
Tech/Coding

출력 버퍼

by redcubes 2025. 4. 29.

두둥. 위 코드에는 무슨 일이 있는걸까?

import os
r = list(map(bytearray,(b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')

for c in r:
    os.write(1,c+b'\n')
for i in range(10):
    for j in range(10):
        r[i][j] = 153 - r[i][j]
print('반전 후')
for c in r:
    os.write(1,c+b'\n')

 

import os
import sys

r = list(map(bytearray, (b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')
sys.stdout.flush()  # 버퍼 강제 비움

for c in r:
    os.write(1, c + b'\n')

for i in range(10):
    for j in range(10):
        r[i][j] = 153 - r[i][j]

print('반전 후')
sys.stdout.flush()  # 다시 버퍼 강제 비움

for c in r:
    os.write(1, c + b'\n')

 

여기서 문제가 생기는 핵심 이유는 print 함수os.write 함수의 출력 방식이 다르기 때문입니다.


  • print() 함수
    • 버퍼링(buffering) 됩니다.
    • 즉, print()로 출력 요청을 하면 바로바로 출력되는 게 아니라, 어느 정도 모아뒀다가 한꺼번에 출력하기도 합니다.
    • (특히 표준 출력(stdout)이 터미널이 아니라 파일이나 파이프에 연결된 경우 더 뚜렷합니다.)
  • os.write(fd, bytes) 함수
    • 버퍼를 거치지 않고 운영체제에 바로 출력 요청을 합니다.
    • 즉시 바로 출력됩니다.

2. 코드에서 무슨 일이 일어나는가?

  • print('원래상태')
    👉 이건 버퍼링됩니다. 출력이 바로 되지 않을 수도 있습니다.
  • os.write(1, ...)
    👉 이건 즉시 출력됩니다.
  • 그래서 os.write로 출력된 “WBBBBBBBBW” 라인들이 print('원래상태')보다 먼저 보이거나 뒤섞일 수 있습니다.

(※ 특히 프로그램이 짧아서 버퍼를 다 비우지 않고 종료해버리면 print한 내용이 아예 늦게 나오기도 합니다.)


3. 해결 방법

print를 쓰기 전에 버퍼를 강제로 비우면 순서가 정상화됩니다.

  • sys.stdout.flush()를 사용하면 됩니다.

코드를 수정해보면:

import os
import sys

r = list(map(bytearray, (b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')
sys.stdout.flush()  # 버퍼 강제 비움

for c in r:
    os.write(1, c + b'\n')

for i in range(10):
    for j in range(10):
        r[i][j] = 153 - r[i][j]

print('반전 후')
sys.stdout.flush()  # 다시 버퍼 강제 비움

for c in r:
    os.write(1, c + b'\n')

'Tech > Coding' 카테고리의 다른 글

3356번 (라디오 전송)  (0) 2025.05.03
29768-펠린드롬 이름  (0) 2025.05.03
토글 코드 트릭  (0) 2025.04.29
위상 정렬 (Topological Sort)  (0) 2025.04.19
파이썬 heapq.heapreplace 동작 원리  (0) 2025.04.12