본문 바로가기
Python

09. 반복문 (2) - while문과 반복 제어

by 샤나엘 2026. 2. 21.
반응형

반복문 (2) - while문과 반복 제어

09. 반복문 (2) - while문과 반복 제어

for문이 "정해진 횟수만큼" 반복했다면, while문은 "조건이 참인 동안" 반복한다. 언제 끝날지 미리 알 수 없는 상황에서 진가를 발휘하는 while문을 알아보자.


while문의 기본 구조

while 조건식:
    실행할 코드
  • 조건식True인 동안 코드 블록을 반복 실행한다
  • 조건식이 False가 되면 반복을 멈추고 빠져나온다
  • for문과 마찬가지로 콜론(:)들여쓰기가 필수
count = 1

while count <= 5:
    print(f"{count}번 실행")
    count += 1    # 이걸 빼먹으면 무한루프!

print("반복 끝!")

출력:

1번 실행
2번 실행
3번 실행
4번 실행
5번 실행
반복 끝!

while문의 동작 원리

⚠️ 주의: while문에서는 조건을 False로 만들 장치가 반드시 있어야 한다. 그렇지 않으면 프로그램이 영원히 멈추지 않는 무한루프에 빠진다.


for문 vs while문

둘 다 반복문이지만, 사용하는 상황이 다르다.

# for문: 5번 반복 (횟수가 정해져 있다)
for i in range(5):
    print(i)

# while문: 5번 반복 (같은 결과)
i = 0
while i < 5:
    print(i)
    i += 1

결과는 같지만 for문이 더 간결하다. 그럼 while문은 언제 쓸까?

for문 vs while문 비교

 

구분 for문 while문
언제? 반복 횟수를 미리 알 때 반복 횟수를 모를 때
예시 리스트 순회, 1~100 합계 사용자 입력 대기, 게임 루프
특징 대상을 하나씩 꺼내서 처리 조건이 참인 동안 계속 실행

while문 활용 패턴

카운트다운

count = 5

while count > 0:
    print(count)
    count -= 1

print("발사! 🚀")
5
4
3
2
1
발사! 🚀

누적 합산

total = 0
num = 1

while num <= 100:
    total += num
    num += 1

print(f"1~100의 합: {total}")   # 5050

사용자 입력 반복 받기

# 올바른 입력이 올 때까지 반복
age = -1

while age < 0 or age > 150:
    age = int(input("나이를 입력하세요 (0~150): "))
    if age < 0 or age > 150:
        print("잘못된 입력입니다. 다시 입력하세요.")

print(f"입력한 나이: {age}살")

이런 경우 for문으로는 깔끔하게 처리하기 어렵다. 언제 올바른 입력이 올지 모르기 때문이다.


무한루프와 break

무한루프란?

조건이 항상 True인 반복문을 무한루프라고 한다. 의도하지 않으면 위험하지만, 의도적으로 사용하면 매우 유용하다.

# 무한루프의 기본 형태
while True:
    # 이 안의 코드가 영원히 반복된다
    # break로 탈출해야 한다!
    pass

무한루프 + break 패턴

실전에서 가장 많이 쓰는 조합이다.

while True:
    command = input("명령어 입력 (q: 종료): ")

    if command == "q":
        print("프로그램을 종료합니다.")
        break

    print(f"'{command}' 실행 중...")
명령어 입력 (q: 종료): hello
'hello' 실행 중...
명령어 입력 (q: 종료): test
'test' 실행 중...
명령어 입력 (q: 종료): q
프로그램을 종료합니다.

계산기 예제

print("간단 계산기 (종료: quit)")
print("-" * 30)

while True:
    expression = input("계산식: ")

    if expression == "quit":
        break

    try:
        result = eval(expression)
        print(f"결과: {result}")
    except:
        print("잘못된 수식입니다")

⚠️ 참고: eval()은 문자열을 코드로 실행하는 함수다. 학습용으로는 편리하지만, 실제 서비스에서는 보안 위험이 있어 사용하지 않는다.


while문에서 continue

8편에서 배운 continue는 while문에서도 동일하게 동작한다. 이번 회차만 건너뛰고 조건식 검사로 돌아간다.

num = 0

while num < 10:
    num += 1
    if num % 2 == 0:
        continue       # 짝수면 건너뛰기
    print(num, end=" ")

# 1 3 5 7 9

⚠️ 주의: while문에서 continue를 쓸 때는 카운터 증가 위치에 주의해야 한다. continue 뒤에 증가 코드가 있으면 실행되지 않아 무한루프에 빠질 수 있다.

# 잘못된 예 - 무한루프!
num = 0
while num < 10:
    if num % 2 == 0:
        continue    # num += 1에 도달하지 못함!
    print(num)
    num += 1        # continue가 이 줄을 건너뛴다

# 올바른 예
num = 0
while num < 10:
    num += 1        # continue 전에 증가!
    if num % 2 == 0:
        continue
    print(num, end=" ")

while-else

for문과 마찬가지로, while문에도 else를 붙일 수 있다. break 없이 정상 종료되면 else 블록이 실행된다.

attempts = 0
password = ""

while attempts < 3:
    password = input("비밀번호: ")
    if password == "python123":
        print("로그인 성공!")
        break
    attempts += 1
    print(f"틀렸습니다. ({attempts}/3)")
else:
    print("3회 실패! 계정이 잠겼습니다.")
  • 비밀번호를 맞추면 break로 빠져나가므로 else는 실행되지 않는다
  • 3번 다 틀리면 while 조건이 False가 되어 else가 실행된다

실전 예시: 숫자 야구 (간단 버전)

import random

answer = random.randint(1, 100)
attempts = 0

print("=" * 35)
print("   숫자 맞추기 게임 (1~100)")
print("=" * 35)

while True:
    guess = int(input("\n숫자를 입력하세요: "))
    attempts += 1

    if guess == answer:
        print(f"\n🎉 정답! {attempts}번 만에 맞추셨습니다!")
        break
    elif guess < answer:
        print("⬆️ 더 큰 수입니다")
    else:
        print("⬇️ 더 작은 수입니다")

# 시도 횟수에 따른 평가
if attempts <= 3:
    print("천재!")
elif attempts <= 7:
    print("잘했어요!")
else:
    print("다음엔 더 잘할 수 있을 거예요!")

실행 예:

===================================
   숫자 맞추기 게임 (1~100)
===================================

숫자를 입력하세요: 50
⬆️ 더 큰 수입니다

숫자를 입력하세요: 75
⬇️ 더 작은 수입니다

숫자를 입력하세요: 62
⬆️ 더 큰 수입니다

숫자를 입력하세요: 68
🎉 정답! 4번 만에 맞추셨습니다!
잘했어요!

💡 random.randint(1, 100)은 1부터 100 사이의 랜덤 정수를 만든다. random 모듈은 11편에서 더 자세히 다룬다.


직접 해보기

문제 1. 사용자가 "exit"를 입력할 때까지 입력한 문자를 메아리(echo)처럼 출력하는 프로그램을 만들어보자.

> 안녕하세요
→ 안녕하세요
> 파이썬 재밌다
→ 파이썬 재밌다
> exit
프로그램을 종료합니다.

문제 2. 1부터 시작해서 숫자를 더해갈 때, 합이 처음으로 1000을 넘는 순간의 숫자를 구해보자.

1 + 2 + 3 + ... + ? > 1000
결과: ?번째 숫자에서 처음으로 1000을 넘음 (합: ???)

문제 3. 비밀번호 검증 프로그램을 만들어보자.

조건: 비밀번호는 "python"
3번까지 시도 가능
맞추면 "환영합니다", 3번 다 틀리면 "접근 차단"

문제 4. 사용자에게 숫자를 계속 입력받아 평균을 구하는 프로그램을 만들어보자.

숫자 입력 (0 입력시 종료): 85
숫자 입력 (0 입력시 종료): 90
숫자 입력 (0 입력시 종료): 78
숫자 입력 (0 입력시 종료): 0
입력한 3개의 평균: 84.3
정답 보기
# 문제 1
while True:
    text = input("> ")
    if text == "exit":
        print("프로그램을 종료합니다.")
        break
    print(f"→ {text}")
‍
# 문제 2
total = 0
num = 0
while total <= 1000:
    num += 1
    total += num
print(f"{num}번째 숫자에서 처음으로 1000을 넘음 (합: {total})")
# 결과: 45번째 숫자에서 처음으로 1000을 넘음 (합: 1035)
‍
# 문제 3
attempts = 0
while attempts < 3:
    pw = input("비밀번호: ")
    if pw == "python":
        print("환영합니다!")
        break
    attempts += 1
    print(f"틀렸습니다. (남은 기회: {3 - attempts}회)")
else:
    print("접근 차단!")
‍
# 문제 4
total = 0
count = 0
while True:
    num = int(input("숫자 입력 (0 입력시 종료): "))
    if num == 0:
        break
    total += num
    count += 1
‍
if count > 0:
    print(f"입력한 {count}개의 평균: {total / count:.1f}")
else:
    print("입력한 숫자가 없습니다.")

오늘의 정리

항목 내용
while문 while 조건: - 조건이 True인 동안 반복
무한루프 while True: + break로 탈출하는 패턴
for문 vs while문 횟수가 정해져 있으면 for, 조건 기반이면 while
continue 주의 while에서 카운터 증가는 continue 앞에 위치해야!
while-else break 없이 정상 종료 시 else 실행

다음 편 예고: 중첩 반복문 - 별 찍기로 연습하기

반복문 안에 반복문을 넣으면 어떤 일이 일어날까? 다양한 별(★) 패턴을 찍으면서 이중 for문을 완벽하게 익혀보자.


태그: 파이썬 Python 파이썬독학 반복문 while문 break continue 무한루프 파이썬기초 IT교육

반응형

댓글