! 앞에서는 조건에 따라 실행할 코드를 결정하는
if문에 대해서 알아보았다.
while은 조건이 참인 동안 특정 코드를 계속 반복해서 실행한다.while문을 반복문이라고도 한다.while문의 가장 기본적인 형태는 다음과 같다.
while 조건:
실행문1
실행문2
실행문3
조건을 검사한다.True이면 들여쓰기된 코드를 실행한다.True라면 같은 과정을 반복한다.False가 되는 순간 while문이 종료된다.실행 흐름을 간단하게 표현하면 다음과 같다.
조건 검사
│
├─ True
│ ↓
│ 코드 실행
│ ↓
└────┘
│
└─ False
↓
반복 종료
숫자를 1부터 5까지 출력해 보자.
count = 1
while count <= 5:
print(count)
count += 1
1
2
3
4
5
처음
count에는1이 저장되어 있다.
count = 1
조건은 다음과 같다.
count <= 5
처음에는
1 <= 5
↓
True
이므로 while문 안의 코드가 실행된다.
print(count)
으로 1을 출력하고
count += 1
을 실행한다.
따라서
count = 1
↓
count = 2
가 된다.
다시 while문의 조건을 검사한다.
2 <= 5
↓
True
다시 코드를 실행한다.
이러한 과정을 반복하면
1 → 2 → 3 → 4 → 5
가 출력된다.
마지막으로
count = 6
이 되면
6 <= 5
↓
False
가 되어 반복문이 종료된다.
while문에서는 반복 횟수를 제어하기 위해 변수의 값을 증가시키거나 감소시키는 경우가 많다.
다음 두 표현은 같은 의미이다.
count = count + 1
count += 1
예를 들어
count = 3
count += 1
을 실행하면
3 + 1
↓
4
가 된다.
다음과 같은 축약 표현도 사용할 수 있다.
a += 1
a -= 1
a *= 2
a /= 2
각각 다음과 같은 의미이다.
a += 1 → a = a + 1
a -= 1 → a = a - 1
a *= 2 → a = a * 2
a /= 2 → a = a / 2
while문에서는 특히
+= 1형태를 매우 자주 사용한다.
다음 코드를 살펴보자.
number = 0
while number < 3:
number += 1
print(number)
1
2
3
실행 과정을 표로 보면 다음과 같다.
| number | 조건 | 조건 결과 | 실행 후 number |
|---|---|---|---|
| 0 | 0 < 3 | True | 1 |
| 1 | 1 < 3 | True | 2 |
| 2 | 2 < 3 | True | 3 |
| 3 | 3 < 3 | False | 종료 |
while문을 이해할 때는 다음 3가지를 순서대로 확인하면 된다.
1. 현재 변수의 값은 무엇인가?
2. 조건식이 True인가 False인가?
3. 반복문 안에서 변수 값이 어떻게 변하는가?
while문은 사용자가 특정 값을 입력할 때까지 계속 입력을 받는 프로그램에서도 사용할 수 있다.
number = 0
while number != 3:
number = int(input("숫자 3을 입력하세요: "))
print("종료합니다.")
처음
number는0이다.
number = 0
조건은
number != 3
이다.
0 != 3
↓
True
이므로 입력을 받는다.
사용자가 1을 입력하면
1 != 3
↓
True
이므로 다시 반복한다.
사용자가 3을 입력하면
3 != 3
↓
False
가 되면서 while문이 종료된다.
아직
input()을 자세히 배우지 않았다면 다음 정도로 이해하면 된다.
input()
→ 사용자에게 값을 입력받음
int(input())
→ 입력받은 문자열을 정수로 변환
while문의 조건이 아직
True이더라도 반복문을 즉시 종료하고 싶을 때가 있다.
이때 사용하는 것이 break이다.
break
count = 0
while True:
count += 1
print(count)
if count == 5:
break
1
2
3
4
5
먼저
while True:
는 조건이 항상 True이므로 계속 반복한다.
하지만
if count == 5:
break
가 존재한다.
count가 5가 되면
count == 5
↓
True
가 되어
break
가 실행된다.
따라서 while문이 즉시 종료된다.
실행 흐름은 다음과 같다.
count = 1 → 계속
count = 2 → 계속
count = 3 → 계속
count = 4 → 계속
count = 5
↓
break
↓
반복 종료
커피가 3잔 남아 있다고 생각해 보자.
coffee = 3
while True:
print("커피를 판매합니다.")
coffee -= 1
print(f"남은 커피: {coffee}잔")
if coffee == 0:
print("커피가 모두 소진되었습니다.")
break
커피를 판매합니다.
남은 커피: 2잔
커피를 판매합니다.
남은 커피: 1잔
커피를 판매합니다.
남은 커피: 0잔
커피가 모두 소진되었습니다.
처음 커피는 3잔이다.
coffee = 3
커피를 한 잔 판매할 때마다
coffee -= 1
을 실행한다.
따라서
3 → 2 → 1 → 0
으로 감소한다.
coffee가 0이 되면
if coffee == 0:
이 참이 되어
break
가 실행된다.
즉,
break는 반복문 자체를 종료한다.
break가 반복문을 완전히 종료한다면continue는 조금 다르다.
continue는 현재 반복에서 아래 코드를 실행하지 않고 while문의 처음으로 돌아간다.
continue
1부터 10까지의 숫자 중 홀수만 출력해 보자.
number = 0
while number < 10:
number += 1
if number % 2 == 0:
continue
print(number)
1
3
5
7
9
다음 조건을 확인한다.
number % 2 == 0
숫자를 2로 나누었을 때 나머지가 0이면 짝수이다.
2 % 2 = 0
4 % 2 = 0
6 % 2 = 0
따라서 짝수일 경우
continue
가 실행된다.
그러면 아래에 있는
print(number)
를 실행하지 않고 바로 while문의 처음으로 돌아간다.
예를 들어
number = 2라면
2 % 2 == 0
↓
True
↓
continue
↓
print(number) 실행 X
↓
while 조건으로 이동
따라서 홀수만 출력된다.
두 문장은 반복문의 흐름을 변경한다는 공통점이 있지만 역할은 완전히 다르다.
| 명령어 | 역할 |
|---|---|
break | 반복문 자체를 종료 |
continue | 현재 반복만 건너뛰고 다음 반복으로 이동 |
간단하게 표현하면 다음과 같다.
break
반복 반복 반복
↓
break
↓
종료
continue
반복
↓
continue
↓
처음으로
↓
다음 반복
! break와 continue
break → while문 밖으로 나감 continue → while문 처음으로 돌아감
조건이 항상
True라면 while문은 끝없이 반복된다.
이를 무한 루프(infinite loop)라고 한다.
기본 형태는 다음과 같다.
while True:
실행할 코드
while True:
print("계속 반복됩니다.")
이 코드는
계속 반복됩니다.
계속 반복됩니다.
계속 반복됩니다.
계속 반복됩니다.
...
처럼 계속 실행된다.
왜냐하면 조건이
True
로 고정되어 있기 때문이다.
True
↓
항상 참
↓
계속 반복
무한 루프 자체가 잘못된 것은 아니다.
실제 프로그램에서도 다음과 같은 상황에서 사용할 수 있다.
사용자 입력 계속 대기
서버 요청 대기
게임 실행
메뉴 프로그램
이벤트 처리
다만 대부분 특정 조건에서 빠져나갈 수 있도록
break를 함께 사용한다.
while True:
command = input("종료하려면 q 입력: ")
if command == "q":
break
즉,
while True:
와
break
는 함께 사용하는 경우가 많다.
while문을 작성할 때 가장 많이 하는 실수 중 하나가 조건에 사용한 변수의 값을 변경하지 않는 것이다.
다음 코드를 보자.
number = 1
while number <= 5:
print(number)
number는 계속 1이다.1 <= 5
↓
True
결국 1이 계속 출력된다.
올바르게 작성하려면 변수의 값을 변경해야 한다.
number = 1
while number <= 5:
print(number)
number += 1
1
2
3
4
5
! while문을 만들 때는 반드시 조건이 언젠가는 False가 될 수 있는지 확인하자.
파이썬에서는 while문 뒤에
else를 붙일 수도 있다.
while 조건:
실행문
else:
실행문
False가 되어 종료되면 else가 실행된다.break로 강제로 종료하면 else는 실행되지 않는다.count = 1
while count <= 3:
print(count)
count += 1
else:
print("반복이 정상적으로 끝났습니다.")
1
2
3
반복이 정상적으로 끝났습니다.
마지막에
count = 4
가 되면서
4 <= 3
↓
False
가 되어 정상적으로 종료되었다.
따라서 else가 실행된다.
이번에는
break를 사용해 보자.
count = 1
while count <= 5:
if count == 3:
break
print(count)
count += 1
else:
print("반복이 정상적으로 끝났습니다.")
1
2
count가 3이 되면 break가 실행된다.else는 실행되지 않는다.정리하면 다음과 같다.
| 종료 방법 | while의 else 실행 |
|---|---|
| 조건이 False가 되어 종료 | O |
break로 종료 | X |
while-else는 자주 사용하는 문법은 아니지만 반복문이 끝까지 정상적으로 수행되었는지 확인할 때 사용할 수 있다.
while문 안에 또 다른 while문을 작성할 수도 있다.
이를 중첩 while문이라고 한다.
while 조건1:
while 조건2:
실행문
2단과 3단을 출력해 보자.
dan = 2
while dan <= 3:
number = 1
while number <= 9:
print(f"{dan} x {number} = {dan * number}")
number += 1
dan += 1
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
...
2 x 9 = 18
3 x 1 = 3
3 x 2 = 6
...
3 x 9 = 27
바깥쪽 while문은
dan을 담당한다.
dan = 2
↓
dan = 3
안쪽 while문은 각각의 단에서
1 ~ 9
까지 반복한다.
따라서 구조는 다음과 같다.
dan = 2
number = 1
number = 2
number = 3
...
number = 9
dan = 3
number = 1
number = 2
number = 3
...
number = 9
즉, 바깥쪽 반복 1번마다 안쪽 반복이 처음부터 끝까지 실행된다.
중첩된 반복문에서
break를 사용하면 가장 가까운 반복문 하나만 종료한다.
i = 1
while i <= 3:
j = 1
while j <= 5:
if j == 3:
break
print(i, j)
j += 1
i += 1
안쪽 while문의
break
는 안쪽 while문만 종료한다.
바깥쪽 while문까지 동시에 종료되는 것은 아니다.
바깥 while
│
└─ 안쪽 while
│
└─ break
↓
안쪽 while 종료
바깥 while은 계속 실행
중첩 반복문에서
continue역시 가장 가까운 반복문에 적용된다고 생각하면 된다.
실제 프로그램에서는 while문과 if문을 함께 사용하는 경우가 많다.
number = 0
while number < 10:
number += 1
if number == 5:
print("5를 찾았습니다.")
break
5를 찾았습니다.
역할을 나누어 생각하면 쉽다.
while
→ 반복할지 결정
if
→ 반복 중 특정 상황인지 판단
break
→ 반복 종료
이처럼 제어문은 서로 조합해서 사용할 수 있다.
while 조건:
if 조건:
break
또는
while 조건:
if 조건:
continue
형태를 매우 자주 사용한다.
count = 1
while count <= 5:
print(count)
❌ count가 계속 1이므로 무한 반복된다.
올바른 코드
count = 1
while count <= 5:
print(count)
count += 1
다음 코드를 보자.
number = 0
while number < 10:
if number == 5:
continue
number += 1
number가 5가 되면 continue가 실행된다.number += 1이 실행되지 않는다.number는 계속 5이다.number = 5
↓
continue
↓
number = 5
↓
continue
↓
무한 반복
다음처럼 증가 작업의 위치를 조절해야 한다.
number = 0
while number < 10:
number += 1
if number == 5:
continue
print(number)
break
→ 반복문 종료
continue
→ 현재 반복 건너뜀
둘의 역할을 확실하게 구분하자.
잘못된 코드
while count < 10
count += 1
올바른 코드
while count < 10:
count += 1
while count < 10:
print(count)
count += 1
❌ 들여쓰기 깊이가 다르다.
다음처럼 맞춰야 한다.
while count < 10:
print(count)
count += 1
다음 코드를 기준으로 전체 실행 흐름을 살펴보자.
number = 0
while number < 5:
number += 1
if number == 3:
continue
if number == 5:
break
print(number)
1 < 5 → True
number == 3 → False
number == 5 → False
1 출력
2 < 5 → True
number == 3 → False
number == 5 → False
2 출력
number == 3
↓
True
↓
continue
↓
print() 건너뜀
4 출력
number == 5
↓
True
↓
break
↓
while문 종료
1
2
4
이 예제를 이해하면
while,if,continue,break의 관계를 한 번에 이해할 수 있다.
이번 장에서 가장 중요한 내용을 정리하면 다음과 같다.
while 조건:
실행문
조건 True
→ 반복
조건 False
→ 종료
count += 1
는
count = count + 1
과 같은 의미이다.
break
→ 반복문을 즉시 종료한다.
continue
→ 현재 반복의 남은 코드를 건너뛰고 다음 반복으로 이동한다.
while True:
실행문
→ 조건이 항상 참이므로 계속 반복한다.
보통
break
와 함께 사용한다.
while 조건:
실행문
else:
실행문
→ 조건이 거짓이 되어 정상적으로 반복을 마치면 else 실행
→ break로 종료하면 else 실행 X
while 조건1:
while 조건2:
실행문
→ 바깥쪽 반복 한 번마다 안쪽 반복이 실행된다.
! while문에서 반드시 기억해야 할 핵심
while문은 조건이 참인 동안 코드를 반복해서 실행한다.
조건 확인 │ ├─ True │ ↓ │ 코드 실행 │ ↓ └─ 다시 조건 확인 └─ False ↓ 종료가장 기본적인 형태는 반드시 기억하자.
while 조건: 실행문그리고 while문에서는 변수의 값이 어떻게 변하는지 확인하는 것이 매우 중요하다.
count += 1와 같은 코드가 없다면 조건이 계속 참이 되어 무한 루프가 발생할 수도 있다.
반복문의 흐름을 제어하는 두 명령어도 확실하게 기억하자.
break → 반복문 종료 continue → 현재 반복을 건너뛰고 다음 반복마지막으로
while True:는 항상 참이므로 무한히 반복되며, 실제 프로그램에서는 특정 조건에서
break를 사용해 종료하는 방식으로 자주 활용한다.while문을 볼 때는 항상 다음 3가지를 순서대로 확인하면 이해하기 쉽다.
1. 반복 조건이 무엇인가? 2. 반복할 때 어떤 값이 변하는가? 3. 언제 조건이 False가 되거나 break가 실행되는가?이 세 가지만 추적하면 대부분의 while문 실행 결과를 직접 계산할 수 있다.