이번 편의 목표: while·break·continue를 사용해 입력을 반복합니다.

`for`는 정해진 목록을 처리할 때 자연스럽습니다. 하지만 사용자가 몇 개의 항목을 입력할지는 미리 모릅니다. 이럴 때는 조건이 유지되는 동안 반복하는 `while`을 사용할 수 있습니다. 중요한 것은 반복을 시작하는 조건뿐 아니라 끝내는 방법입니다.

종료 명령을 먼저 정하자

아래 예제는 항목 이름을 계속 입력받고, `끝`을 입력하면 종료합니다. 빈 줄은 건너뜁니다. 아직 금액 입력은 받지 않아 입력 검증 문제를 작게 유지했습니다.

Python
count = 0
while True:
    item = input("항목 이름(종료: 끝): ").strip()
    if item == "끝":
        break
    if item == "":
        print("빈 항목은 기록하지 않습니다.")
        continue
    count += 1
    print(f"{count}번째 항목: {item}")
print(f"총 {count}개를 입력했습니다.")

`커피`, 빈 줄, `점심`, `끝`을 순서대로 입력하면 총 2개를 기록합니다. `while True`는 조건이 항상 참인 반복입니다. 여기서는 `break`가 종료를 담당합니다.

`break`는 가장 가까운 반복문 하나를 빠져나갑니다. 프로그램 전체를 반드시 끝내는 명령은 아닙니다. 따라서 마지막 총개수 출력은 실행됩니다. `continue`는 현재 회차의 남은 본문을 건너뛰고 다음 조건 검사로 넘어갑니다. 빈 입력에서는 `count += 1`이 실행되지 않습니다.

조건 자체로 끝나는 반복

횟수를 직접 늘리면서 종료할 수도 있습니다. 다만 정해진 횟수라면 대체로 `for`와 `range`가 더 간단합니다. `while`은 실행 도중 상태가 바뀌어 종료 여부가 정해질 때 특히 유용합니다.

무한 반복이 생기는 대표적인 이유는 조건에 사용한 값을 갱신하지 않는 것입니다. `remaining > 0`을 조건으로 썼다면 반복 중 `remaining`이 실제로 줄어드는지 확인해야 합니다. `continue` 때문에 감소시키는 줄을 건너뛰는 경우도 있습니다.

터미널에서 의도하지 않은 반복이 계속되면 일반적으로 Ctrl+C로 중단할 수 있습니다. 이것은 정상 종료 기능의 대체가 아닙니다. 사용자가 이해할 수 있는 종료 경로를 코드에 두어야 합니다.

반복문을 고르는 작은 기준

목록의 모든 항목을 처리한다면 `for`, 종료 시점을 사용자가 정한다면 `while`을 먼저 생각하면 됩니다. 둘 중 무엇이 더 고급 문법인지는 중요하지 않습니다. 읽는 사람이 종료 조건을 쉽게 찾을 수 있는지가 중요합니다.

이번 예제의 입력값은 숫자로 변환하지 않기 때문에 빈 줄이나 한글을 받아도 변환 오류가 나지 않습니다. 금액을 입력받으려면 `int()` 변환 실패도 다뤄야 합니다. 그 부분은 16편에서 연결합니다.

직접 해 보기

`remaining = 3`에서 시작해 `3`, `2`, `1`을 출력하고, 마지막에 `출발`을 한 번 출력하세요.

해설

Python
remaining = 3
while remaining > 0:
    print(remaining)
    remaining -= 1
print("출발")

`remaining -= 1`이 빠지면 값이 계속 3이므로 끝나지 않습니다. 출력 줄을 반복 밖으로 옮기면 어떤 결과가 되는지도 실행 전에 예측해 보세요.