for 반복문은 반복 횟수가 정해져 있을 때 유용했습니다. 하지만 "사용자가 특정 명령을 입력할 때까지", "목표 값에 도달할 때까지"처럼 반복 횟수를 미리 알 수 없는 경우도 많습니다. 이럴 때 사용하는 것이 바로 while 반복문입니다.
| 특징 | for 반복문 | while 반복문 |
|---|---|---|
| 사용 시기 | 반복 횟수가 정해진 경우 | 조건이 참인 동안 반복 |
| 제어 방식 | 시퀀스나 range로 자동 제어 | 조건식으로 제어 |
| 종료 조건 | 시퀀스가 끝나면 자동 종료 | 조건이 거짓이 되면 종료 |
| 예시 | "10번 반복", "리스트 순회" | "사용자가 quit 입력할 때까지" |
# for 반복문: 5번 반복
for i in range(5):
print(i)
# while 반복문: 5번 반복
i = 0
while i < 5:
print(i)
i += 1
두 코드 모두 0부터 4까지 출력하지만, while은 조건식과 변화식을 직접 관리해야 합니다.
while 조건식:
반복할_코드
변화식
핵심 요소:
1. 조건식: 참/거짓을 판단하는 표현식
2. 반복할 코드: 조건이 참일 때 실행할 코드
3. 변화식: 조건식에 영향을 주는 코드 (무한 루프 방지)
초기식
while 조건식:
반복할_코드
변화식
예시:
# 초기식: i를 0으로 설정
i = 0
# 조건식: i가 5보다 작을 때
while i < 5:
# 반복할 코드
print(i)
# 변화식: i를 1씩 증가
i += 1
실행 결과:
0
1
2
3
4
i = 0
while i < 5:
print(i)
i += 1
단계별 흐름:
1. i = 0 (초기식)
2. i < 5 조건 확인 → 0 < 5 → True → 코드 실행
- print(0)
- i += 1 → i는 1
3. i < 5 조건 확인 → 1 < 5 → True → 코드 실행
- print(1)
- i += 1 → i는 2
4. i < 5 조건 확인 → 2 < 5 → True → 코드 실행
- print(2)
- i += 1 → i는 3
5. i < 5 조건 확인 → 3 < 5 → True → 코드 실행
- print(3)
- i += 1 → i는 4
6. i < 5 조건 확인 → 4 < 5 → True → 코드 실행
- print(4)
- i += 1 → i는 5
7. i < 5 조건 확인 → 5 < 5 → False → 반복 종료
조건식 → 반복할 코드 및 변화식 → 조건식으로 순환하는 부분이 루프입니다.
┌─────────────────┐
│ 조건식 확인 │
└────┬────────────┘
│ True
↓
┌─────────────────┐
│ 반복할 코드 │
└────┬────────────┘
│
↓
┌─────────────────┐
│ 변화식 │
└────┬────────────┘
│
└──→ (다시 조건식으로)
조건식 끝에 콜론(:) 필수입니다.
# 올바른 예
while i < 5:
print(i)
# 잘못된 예
while i < 5 # SyntaxError: 콜론 누락
print(i)
while 다음 줄은 반드시 들여쓰기 4칸입니다.
# 올바른 예
i = 0
while i < 3:
print(i)
i += 1
# 잘못된 예
i = 0
while i < 3:
print(i) # IndentationError
i += 1
while은 조건식이 참(True)일 때 반복하고, 거짓(False)일 때 종료합니다.
i = 0
while i < 3: # i가 3보다 작을 때만 반복
print(i)
i += 1
# i가 3이 되면 조건이 거짓 → 종료
print('반복 종료')
실행 결과:
0
1
2
반복 종료
# 위험! 무한 루프
i = 0
while i < 5:
print(i)
# i += 1 없음 → i가 항상 0 → 조건이 항상 참 → 무한 반복!
결과: 프로그램이 멈추지 않고 0을 계속 출력합니다. Ctrl + C로 강제 종료해야 합니다.
변화식은 보통 반복 코드 끝에 위치합니다.
i = 0
while i < 5:
print(i) # 먼저 출력
i += 1 # 그 다음 증가
하지만 상황에 따라 앞에 올 수도 있습니다.
i = 0
while i < 5:
i += 1 # 먼저 증가
print(i) # 그 다음 출력
실행 결과 (1부터 5까지):
1
2
3
4
5
# <, >, <=, >=, ==, !=
count = 10
while count > 0:
print(count)
count -= 1
print('발사! 🚀')
실행 결과:
10
9
8
7
6
5
4
3
2
1
발사! 🚀
x = 0
y = 10
while x < 5 and y > 0:
print(f'x={x}, y={y}')
x += 1
y -= 2
실행 결과:
x=0, y=10
x=1, y=8
x=2, y=6
x=3, y=4
x=4, y=2
is_running = True
count = 0
while is_running:
print(count)
count += 1
if count >= 3:
is_running = False
print('종료')
실행 결과:
0
1
2
종료
password = ''
while password != 'python':
password = input('비밀번호를 입력하세요: ')
print('로그인 성공!')
실행 과정:
비밀번호를 입력하세요: 123
비밀번호를 입력하세요: abc
비밀번호를 입력하세요: python
로그인 성공!
# 1부터 100까지의 합
total = 0
i = 1
while i <= 100:
total += i
i += 1
print(f'1부터 100까지의 합: {total}')
# 1부터 100까지의 합: 5050
choice = ''
while choice != 'q':
print('\n=== 메뉴 ===')
print('1. 조회')
print('2. 추가')
print('3. 삭제')
print('q. 종료')
choice = input('선택: ')
if choice == '1':
print('조회 기능')
elif choice == '2':
print('추가 기능')
elif choice == '3':
print('삭제 기능')
elif choice == 'q':
print('프로그램을 종료합니다')
else:
print('잘못된 입력입니다')
import random
answer = random.randint(1, 100)
guess = 0
print('1부터 100 사이의 숫자를 맞춰보세요!')
while guess != answer:
guess = int(input('숫자 입력: '))
if guess < answer:
print('더 큰 숫자입니다')
elif guess > answer:
print('더 작은 숫자입니다')
else:
print('정답입니다!')
balance = 10000
while True:
print(f'\n현재 잔액: {balance}원')
print('1. 입금 2. 출금 3. 종료')
choice = input('선택: ')
if choice == '1':
amount = int(input('입금액: '))
balance += amount
print(f'{amount}원 입금되었습니다')
elif choice == '2':
amount = int(input('출금액: '))
if amount <= balance:
balance -= amount
print(f'{amount}원 출금되었습니다')
else:
print('잔액이 부족합니다')
elif choice == '3':
print('프로그램을 종료합니다')
break
else:
print('잘못된 입력입니다')
break는 반복문을 즉시 종료하고 빠져나갑니다.
i = 0
while True: # 무한 루프
print(i)
i += 1
if i >= 5:
break # i가 5가 되면 종료
print('반복 종료')
실행 결과:
0
1
2
3
4
반복 종료
numbers = [10, 20, 30, 40, 50]
target = 30
found = False
i = 0
while i < len(numbers):
if numbers[i] == target:
print(f'{target}을(를) 인덱스 {i}에서 찾았습니다')
found = True
break # 찾았으면 더 이상 검색 불필요
i += 1
if not found:
print(f'{target}을(를) 찾지 못했습니다')
continue는 현재 반복을 건너뛰고 다음 반복으로 이동합니다.
i = 0
while i < 5:
i += 1 # 주의: continue 전에 증가!
if i == 3:
continue # i가 3이면 아래 코드 건너뛰기
print(i)
실행 결과:
1
2
4
5
3이 출력되지 않았습니다!
continue 사용 시 변화식을 continue 전에 두어야 무한 루프를 방지할 수 있습니다.
# 잘못된 예 - 무한 루프!
i = 0
while i < 5:
if i == 3:
continue # i가 3일 때 아래 i += 1을 건너뛰어 무한 루프
print(i)
i += 1
# 올바른 예
i = 0
while i < 5:
i += 1 # continue 전에 증가
if i == 3:
continue
print(i)
i = 0
while i < 10:
i += 1
if i % 2 != 0: # 홀수면
continue # 건너뛰기
print(i) # 짝수만 출력
실행 결과:
2
4
6
8
10
while True는 의도적인 무한 루프를 만들 때 사용합니다. break로 빠져나옵니다.
while True:
command = input('명령어 입력 (quit=종료): ')
if command == 'quit':
print('프로그램을 종료합니다')
break
print(f'입력한 명령어: {command}')
# 서버는 계속 실행되어야 함
while True:
# 클라이언트 요청 대기
request = wait_for_request()
# 요청 처리
process_request(request)
# 종료 신호가 오면 break
if shutdown_signal:
break
while 안에 또 다른 while을 넣을 수 있습니다.
i = 0
while i < 3:
print(f'i = {i}')
j = 0
while j < 2:
print(f' j = {j}')
j += 1
i += 1
실행 결과:
i = 0
j = 0
j = 1
i = 1
j = 0
j = 1
i = 2
j = 0
j = 1
# ✅ 횟수가 정해진 경우
for i in range(10):
print(i)
# ✅ 시퀀스 순회
for item in items:
process(item)
# ✅ 명확한 시작과 끝
for i in range(1, 101):
total += i
# ✅ 조건 기반 반복
while not found:
search_next()
# ✅ 사용자 입력 반복
while password != correct:
password = input()
# ✅ 무한 루프 (서버, 게임 등)
while True:
handle_event()
# 잘못된 코드
i = 0
while i < 5:
print(i)
# i += 1 누락 → 무한 루프!
# 올바른 코드
i = 0
while i < 5:
print(i)
i += 1
# 잘못된 코드 (실행되지 않음)
i = 10
while i < 5: # 처음부터 거짓
print(i)
i += 1
# 올바른 코드
i = 0
while i < 5:
print(i)
i += 1
# 잘못된 코드 (무한 루프)
i = 0
while i < 5:
if i == 3:
continue # i += 1을 건너뛰어 무한 루프
print(i)
i += 1
# 올바른 코드
i = 0
while i < 5:
i += 1 # continue 전에 증가
if i == 3:
continue
print(i)