모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

13강 / 전체 32강

while 루프 — 반복의 본질과 루프 설계

7분 읽기 조회 4

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
  • 누구나

📚 시리즈 전체 공유

파이썬 기초 40강 — 처음 배우는 프로그래밍

이 강의가 속한 시리즈는 총 32강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...