[파이썬 100강] 05강. while문과 break/continue 제어하기

[파이썬 100강] 05강. while문과 break/continue 제어하기

while문은 조건이 참인 동안 코드를 반복 실행합니다. for문이 "정해진 횟수/목록"에 강하다면, while은 "언제 끝날지 실행 중에 결정되는 작업"에 강합니다.
로그인 재시도, 사용자 입력 검증, 센서/큐 폴링, 네트워크 재시도 같은 실무 시나리오에서 가장 자주 만나는 반복문입니다.


핵심 개념

while의 동작은 단순합니다.

  • 조건식이 True면 블록 실행
  • 블록 실행 후 다시 조건 검사
  • 조건이 False가 되면 종료
>>> count = 1
>>> while count <= 3:
...     print(f"반복 {count}회")
...     count += 1
...
반복 1회
반복 2회
반복 3회

핵심은 조건이 언젠가 반드시 False가 되도록 상태를 갱신하는 것입니다. 상태 갱신이 빠지면 무한 루프가 됩니다.

breakcontinue는 흐름 제어의 정밀 도구입니다.

  • break: 현재 반복문 즉시 종료
  • continue: 현재 회차 나머지는 건너뛰고 다음 회차로 진행

기본 사용

1) 사용자 입력 검증 루프

>>> valid_commands = {"start", "stop", "status"}
>>> command = ""
>>> while command not in valid_commands:
...     command = input("명령 입력(start/stop/status): ").strip().lower()
...     if command not in valid_commands:
...         print("지원하지 않는 명령입니다. 다시 입력하세요.")
...
명령 입력(start/stop/status): run
지원하지 않는 명령입니다. 다시 입력하세요.
명령 입력(start/stop/status): START

사용자 입력처럼 예측 불가능한 데이터는 while로 안정적으로 감싸는 습관이 중요합니다.

2) break로 조기 종료

>>> attempts = 0
>>> while True:
...     attempts += 1
...     print(f"서버 헬스체크 시도 {attempts}회")
...     if attempts == 3:
...         print("정상 응답 확인, 루프 종료")
...         break
...
서버 헬스체크 시도 1회
서버 헬스체크 시도 2회
서버 헬스체크 시도 3회
정상 응답 확인, 루프 종료

while True는 위험해 보이지만, 종료 조건을 break로 명확히 두면 오히려 로직이 선명해질 때가 많습니다.

3) continue로 불필요한 처리 건너뛰기

>>> logs = ["INFO:ok", "DEBUG:trace", "INFO:done", "DEBUG:cache"]
>>> i = 0
>>> while i < len(logs):
...     line = logs[i]
...     i += 1
...     if line.startswith("DEBUG"):
...         continue
...     print("처리 대상:", line)
...
처리 대상: INFO:ok
처리 대상: INFO:done

필요 없는 데이터를 빨리 스킵하면 코드의 의도가 분명해지고, 실제 처리량이 큰 경우 성능에도 도움이 됩니다.

4) 실무형 예제: 비밀번호 재시도 제한

>>> correct = "devlab123"
>>> max_try = 5
>>> tries = 0
>>> authenticated = False
>>>
>>> while tries < max_try and not authenticated:
...     entered = input("비밀번호: ").strip()
...     tries += 1
...     if entered == correct:
...         authenticated = True
...         print("로그인 성공")
...     else:
...         remain = max_try - tries
...         if remain > 0:
...             print(f"실패. 남은 시도: {remain}회")
...         else:
...             print("시도 횟수 초과. 계정 잠금")
...
비밀번호: 1111
실패. 남은 시도: 4회
비밀번호: devlab123
로그인 성공

조건을 여러 개(tries < max_try, not authenticated)로 조합하면 보안/운영 조건을 코드에 명시적으로 반영할 수 있습니다.


자주 하는 실수

실수 1) 증가/감소 누락으로 무한 루프

>>> n = 1
>>> while n <= 3:
...     print(n)
...     # n += 1 누락
...

이 코드는 종료 조건이 절대 바뀌지 않습니다. 카운터, 인덱스, 상태값 갱신이 있는지 반드시 확인하세요.

실수 2) continue 전에 상태 갱신을 안 함

>>> i = 0
>>> while i < 5:
...     if i == 2:
...         continue
...     i += 1
...

i == 2인 순간 continue로 점프하면서 i += 1이 실행되지 않아 2에서 영원히 멈춥니다. continue를 쓰는 분기에서는 상태 갱신 위치가 특히 중요합니다.

실수 3) while True 남발 + 종료 조건 불명확

while True는 편하지만, 팀 코드에서는 종료 경로가 보이지 않으면 유지보수가 급격히 어려워집니다. 최소한 다음을 지키세요.

  • break가 언제 실행되는지 주석/조건으로 명확히 표현
  • 타임아웃, 최대 시도 횟수 같은 안전장치 포함

오늘의 결론

while은 "끝나는 시점을 미리 모르는 반복"을 안전하게 다루는 핵심 도구입니다. 오늘의 핵심을 정리하면 다음과 같습니다.

  1. while은 조건 기반 반복이며, 상태 갱신이 생명이다.
  2. break는 조기 종료, continue는 이번 회차 스킵이다.
  3. 무한 루프를 막으려면 카운터/인덱스/플래그 갱신을 먼저 점검한다.
  4. 실무에서는 입력 검증, 재시도, 폴링, 잠금 로직에서 while이 자주 등장한다.

forwhile을 목적에 맞게 구분해 쓰면, 코드가 더 읽기 쉽고 장애 상황에서도 훨씬 견고해집니다.


연습문제

  1. 숫자 1부터 시작해서 10까지 출력하되, 7은 건너뛰고 출력해보세요. (continue 사용)
  2. 비밀번호를 최대 3번 입력받아, 맞으면 "성공"을 출력하고 즉시 종료(break), 모두 틀리면 "실패"를 출력해보세요.
  3. 리스트 temps = [18, 21, 19, 25, 30, 22]while로 순회하면서 25도 이상인 값만 출력해보세요.

이전 강의 정답 (04강 연습문제)

  1. 1~20 중 짝수 출력
>>> for n in range(1, 21):
...     if n % 2 == 0:
...         print(n)
...
2
4
6
8
10
12
14
16
18
20
  1. 총합/평균 계산
>>> prices = [1500, 3200, 7800, 2100]
>>> total = 0
>>> for p in prices:
...     total += p
...
>>> avg = total / len(prices)
>>> print("총합:", total)
>>> print("평균:", avg)
총합: 14600
평균: 3650.0
  1. 구구단 3단 출력
>>> for i in range(1, 10):
...     print(f"3 x {i} = {3 * i}")
...
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

실습 환경/재현 정보

  • 실행 환경: conda env python100 (Python 3.11.14)