while 루프의 정확한 실행 모델을 이해하고 올바른 루프 설계와 탈출 전략을 배운다.
🎯 이 강의에서 배우는 것
while 루프는 파이썬에서 가장 기본적인 반복 구조입니다. 단순해 보이지만, 올바른 루프를 설계하는 것은 논리적 사고를 필요로 합니다. 이 강의에서는 while 루프의 정확한 실행 모델을 이해하고, 루프 불변식(loop invariant)이라는 강력한 설계 도구를 배웁니다.
🔁 while 루프의 정확한 실행 모델
count = 0
while count < 5: # 1단계: 조건 평가
print(count) # 2단계: True면 본문 실행
count += 1 # 3단계: 다시 1단계로
# 4단계: False면 루프 종료
# 조건이 처음부터 False: 본문 한 번도 실행 안 됨
x = 10
while x < 5:
print("실행됨") # 절대 출력 안 됨
print("루프 건너뜀") # 바로 실행
# 반복 횟수 카운팅
count = 0
n = 100
while n > 1:
n //= 2 # n을 2로 나눔
count += 1
print(f"100을 2로 {count}번 나누면 1 이하가 됨") # 약 7번
📐 루프 불변식 (Loop Invariant)
루프 불변식이란 루프의 각 반복 시작 시 항상 참이어야 하는 조건입니다:
# 1부터 N까지의 합 — 루프 불변식 분석
n = 10
total = 0
i = 1
# 불변식: "루프 시작 시 total = 1 + 2 + ... + (i-1)"
while i <= n:
# 이 시점: 불변식 성립 — total = sum(1..i-1)
total += i # total = sum(1..i)
i += 1 # i 증가
# 이 시점: total = sum(1..i-1) (새 i 기준) → 불변식 유지
# 루프 종료 조건: i > n → i == n+1
# 따라서 total = sum(1..n) = n*(n+1)/2 = 55
print(total) # 55
# 이진 탐색 — 루프 불변식 활용
def binary_search(lst, target):
low, high = 0, len(lst) - 1
# 불변식: target이 있다면 lst[low..high] 안에 있다
while low <= high:
mid = (low + high) // 2 # 정수 오버플로우 없음 (파이썬 임의 정밀도)
if lst[mid] == target:
return mid
elif lst[mid] < target:
low = mid + 1 # 왼쪽 절반 제외 → 불변식 유지
else:
high = mid - 1 # 오른쪽 절반 제외 → 불변식 유지
return -1
nums = [1, 3, 5, 7, 9, 11, 13, 15]
print(binary_search(nums, 7)) # 3
print(binary_search(nums, 6)) # -1
♾️ 무한 루프와 while True 패턴
# 유효 입력을 받을 때까지 반복
while True:
user_input = input("양수를 입력하세요: ")
try:
n = int(user_input)
if n > 0:
break # 유효한 입력 → 루프 탈출
print("0보다 큰 수를 입력해야 합니다.")
except ValueError:
print("숫자가 아닙니다. 다시 입력해주세요.")
print(f"입력받은 양수: {n}")
# 게임 메인 루프 패턴
game_running = True
score = 0
while game_running:
action = input("행동 (a=공격, d=방어, q=종료): ")
if action == "q":
game_running = False
elif action == "a":
score += 10
print(f"공격! 점수: {score}")
elif action == "d":
print("방어 자세")
print(f"게임 종료. 최종 점수: {score}")
🧮 루프 상태 관리 패턴
# 카운터 패턴
primes = []
n = 2
while len(primes) < 10: # 소수 10개 찾기
is_prime = True
for d in range(2, int(n**0.5) + 1):
if n % d == 0:
is_prime = False
break
if is_prime:
primes.append(n)
n += 1
print(primes) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
# 누산기 패턴
total = 0
count = 0
while True:
val = input("숫자 입력 (엔터만 누르면 종료): ")
if not val:
break
try:
total += float(val)
count += 1
except ValueError:
print("숫자가 아닙니다")
if count > 0:
print(f"평균: {total / count:.2f}")
# 오프-바이-원 오류 예방
n = 5
# n번 반복하고 싶을 때
i = 0
while i < n: # 0,1,2,3,4 → n번 실행 (권장: 0부터 시작)
i += 1
i = 1
while i <= n: # 1,2,3,4,5 → n번 실행 (1부터 시작할 때)
i += 1
🔄 언제 while을 쓰는가 — for vs while
# for: 반복 횟수를 미리 알 때, 이터러블을 순회할 때
for i in range(10): # 10번 반복
print(i)
for item in my_list: # 리스트 순회
process(item)
# while: 반복 횟수를 미리 모를 때, 외부 상태 변화를 기다릴 때
import time
timeout = 10
start = time.time()
while time.time() - start < timeout: # 타임아웃까지 대기
if check_condition():
break
time.sleep(0.1)
# 콘텐츠 스트리밍
buffer = ""
while True:
chunk = stream.read(1024)
if not chunk: # EOF
break
buffer += chunk
⚠️ 자주 하는 실수
- 루프 변수를 수정 안 함:
while i < 10:에서 본문에i += 1이 없으면 무한 루프. 반드시 조건 변수를 수정하세요. - 오프-바이-원 오류: n번 반복을 원할 때
while i <= n(n+1번 실행될 수 있음)과while i < n의 차이를 명확히 하세요. - 무한 루프를 의도했는데 탈출 조건 빠뜨림:
while True에는 반드시break또는return으로 탈출 경로를 명시하세요.
📝 정리 및 다음 강의 예고
- while 루프: 조건 평가 → True면 실행 → 반복. False면 종료.
- 루프 불변식: 각 반복에서 항상 참인 조건. 올바른 루프 설계의 논리적 기반.
- while vs for: 반복 횟수를 모를 때는 while, 이터러블 순회는 for.
다음 강의: for 루프의 내부 동작인 이터레이터 프로토콜을 완전히 이해합니다.
for x in lst가 내부에서 어떻게 작동하는지, enumerate와 zip의 원리를 배웁니다.
관련 주제
- while 루프 실행모델
- 루프 불변식
- 무한루프와 break 탈출
- 오프바이원 오류
- 카운터·누산기 변수
- for vs while 선택기준
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 파이썬 기초 40강 — 처음 배우는 프로그래밍
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
댓글
0/1000
불러오는 중...
