
for와 while 반복문으로 코드를 반복 실행할 수 있게 되었습니다. 하지만 때로는 특정 조건에서 반복을 즉시 중단하거나, 특정 경우만 건너뛰고 계속 진행해야 할 때가 있습니다. 이럴 때 사용하는 것이 바로 break와 continue입니다.
| 키워드 | 기능 | 제어 흐름 | 사용 시기 |
|---|---|---|---|
| break | 반복문 즉시 종료 | 중단 | 목표를 달성했거나 오류 발생 시 |
| continue | 현재 반복만 건너뛰기 | 유지 (다음 반복으로) | 특정 조건의 항목만 건너뛸 때 |
핵심 차이:
break: 제어 흐름 중단 → 반복문 완전 종료continue: 제어 흐름 유지, 코드 실행만 건너뜀 → 다음 반복 계속break는 반복문을 즉시 종료하고 반복문 다음 코드로 이동합니다.
for i in range(10):
if i == 5:
break # i가 5일 때 반복문 종료
print(i)
print('반복문 종료')
실행 결과:
0
1
2
3
4
반복문 종료
흐름:
1. i = 0, 1, 2, 3, 4 → 출력
2. i = 5 → break 실행 → 반복문 즉시 종료
3. "반복문 종료" 출력
# 특정 값을 찾으면 종료
numbers = [10, 20, 30, 40, 50]
for num in numbers:
print(f'현재 숫자: {num}')
if num == 30:
print('30을 찾았습니다!')
break
print('다음 숫자로...')
print('검색 종료')
실행 결과:
현재 숫자: 10
다음 숫자로...
현재 숫자: 20
다음 숫자로...
현재 숫자: 30
30을 찾았습니다!
검색 종료
# 비밀번호 3번 틀리면 종료
attempts = 0
correct_password = 'python123'
while attempts < 5:
password = input('비밀번호 입력: ')
attempts += 1
if password == correct_password:
print('로그인 성공!')
break
else:
print(f'틀렸습니다. 남은 횟수: {5 - attempts}')
if attempts == 5:
print('로그인 실패. 계정이 잠겼습니다.')
실행 예시 (2번째에 성공):
비밀번호 입력: wrong1
틀렸습니다. 남은 횟수: 4
비밀번호 입력: python123
로그인 성공!
while True와 함께 사용하여 조건에 따라 탈출합니다.
while True:
command = input('명령어 입력 (quit=종료): ')
if command == 'quit':
print('프로그램을 종료합니다')
break
print(f'입력한 명령어: {command}')
실행 예시:
명령어 입력 (quit=종료): hello
입력한 명령어: hello
명령어 입력 (quit=종료): test
입력한 명령어: test
명령어 입력 (quit=종료): quit
프로그램을 종료합니다
continue는 현재 반복의 나머지 코드를 건너뛰고 다음 반복으로 이동합니다.
for i in range(5):
if i == 2:
continue # i가 2일 때 아래 코드 건너뛰기
print(i)
print('반복문 종료')
실행 결과:
0
1
3
4
반복문 종료
흐름:
1. i = 0 → 출력
2. i = 1 → 출력
3. i = 2 → continue 실행 → print(i) 건너뛰기 → 다음 반복으로
4. i = 3 → 출력
5. i = 4 → 출력
6. 반복문 정상 종료
# 홀수만 출력
for i in range(10):
if i % 2 == 0: # 짝수면
continue # 건너뛰기
print(i) # 홀수만 출력됨
실행 결과:
1
3
5
7
9
numbers = [10, -5, 20, 0, 30, -10, 40]
for num in numbers:
if num <= 0:
print(f'{num}은(는) 유효하지 않아 건너뜁니다')
continue
# 양수만 처리
result = 100 / num
print(f'100 / {num} = {result:.2f}')
실행 결과:
100 / 10 = 10.00
-5은(는) 유효하지 않아 건너뜁니다
100 / 20 = 5.00
0은(는) 유효하지 않아 건너뜁니다
100 / 30 = 3.33
-10은(는) 유효하지 않아 건너뜁니다
100 / 40 = 2.50
for i in range(5):
print(f'시작: i={i}')
if i == 2:
print('break 실행!')
break # 반복문 완전 종료
print(f'끝: i={i}')
print('--- 반복문 밖 ---')
실행 결과:
시작: i=0
끝: i=0
시작: i=1
끝: i=1
시작: i=2
break 실행!
--- 반복문 밖 ---
흐름도:
i=0 → 시작 → 끝
i=1 → 시작 → 끝
i=2 → 시작 → break → [반복문 종료]
--- 반복문 밖 ---
for i in range(5):
print(f'시작: i={i}')
if i == 2:
print('continue 실행!')
continue # 현재 반복만 건너뛰기
print(f'끝: i={i}')
print('--- 반복문 밖 ---')
실행 결과:
시작: i=0
끝: i=0
시작: i=1
끝: i=1
시작: i=2
continue 실행!
시작: i=3
끝: i=3
시작: i=4
끝: i=4
--- 반복문 밖 ---
흐름도:
i=0 → 시작 → 끝
i=1 → 시작 → 끝
i=2 → 시작 → continue → [다음 반복으로]
i=3 → 시작 → 끝
i=4 → 시작 → 끝
--- 반복문 밖 ---
while에서 continue 사용 시 변화식을 continue 전에 두어야 합니다.
# 잘못된 코드 - 무한 루프!
i = 0
while i < 5:
if i == 2:
continue # i += 1을 건너뛰어 i가 영원히 2
print(i)
i += 1 # 실행되지 않음!
올바른 코드:
# 방법 1: continue 전에 증가
i = 0
while i < 5:
i += 1 # continue 전에 증가!
if i == 2:
continue
print(i)
# 방법 2: 조건을 바꾸기
i = 0
while i < 5:
if i != 2: # continue 대신 조건 반전
print(i)
i += 1
for i in range(3):
print(f'바깥 루프: i={i}')
for j in range(3):
print(f' 안쪽 루프: j={j}')
if j == 1:
break # 안쪽 for문만 종료
print(f'바깥 루프 계속: i={i}')
실행 결과:
바깥 루프: i=0
안쪽 루프: j=0
안쪽 루프: j=1
바깥 루프 계속: i=0
바깥 루프: i=1
안쪽 루프: j=0
안쪽 루프: j=1
바깥 루프 계속: i=1
바깥 루프: i=2
안쪽 루프: j=0
안쪽 루프: j=1
바깥 루프 계속: i=2
플래그 변수를 사용합니다.
found = False
for i in range(3):
for j in range(3):
print(f'i={i}, j={j}')
if i == 1 and j == 1:
found = True
break # 안쪽 루프 종료
if found:
break # 바깥 루프 종료
print('검색 완료')
실행 결과:
i=0, j=0
i=0, j=1
i=0, j=2
i=1, j=0
i=1, j=1
검색 완료
numbers = [10, 25, 30, 45, 60, 75]
target = 45
found = False
for i, num in enumerate(numbers):
if num == target:
print(f'{target}을(를) 인덱스 {i}에서 찾았습니다')
found = True
break
if not found:
print(f'{target}을(를) 찾지 못했습니다')
실행 결과:
45을(를) 인덱스 3에서 찾았습니다
number = int(input('숫자를 입력하세요: '))
if number < 2:
print(f'{number}은(는) 소수가 아닙니다')
else:
is_prime = True
for i in range(2, number):
if number % i == 0:
print(f'{number}은(는) {i}로 나누어떨어집니다')
is_prime = False
break # 나누어떨어지면 소수 아님 → 종료
if is_prime:
print(f'{number}은(는) 소수입니다')
else:
print(f'{number}은(는) 소수가 아닙니다')
실행 예시 (입력: 17):
숫자를 입력하세요: 17
17은(는) 소수입니다
실행 예시 (입력: 15):
숫자를 입력하세요: 15
15은(는) 3로 나누어떨어집니다
15은(는) 소수가 아닙니다
numbers = [10, -5, 20, -10, 30, 0, -3, 40]
total = 0
for num in numbers:
if num <= 0:
continue # 음수와 0은 건너뛰기
total += num
print(f'양수의 합: {total}')
# 양수의 합: 100
while True:
age = input('나이를 입력하세요 (1-120): ')
if not age.isdigit():
print('숫자를 입력해주세요')
continue
age = int(age)
if age < 1 or age > 120:
print('올바른 범위의 나이를 입력해주세요')
continue
# 유효한 입력
print(f'입력된 나이: {age}세')
break
lines = [
'Python is awesome',
'I love programming',
'Python is easy to learn',
'JavaScript is also good'
]
keyword = 'Python'
for line_num, line in enumerate(lines, start=1):
if keyword not in line:
continue # keyword가 없으면 건너뛰기
print(f'{line_num}번째 줄: {line}')
실행 결과:
1번째 줄: Python is awesome
3번째 줄: Python is easy to learn
while True:
print('\n=== 계산기 ===')
print('1. 덧셈')
print('2. 뺄셈')
print('3. 곱셈')
print('4. 나눗셈')
print('q. 종료')
choice = input('선택: ')
if choice == 'q':
print('프로그램을 종료합니다')
break
if choice not in ['1', '2', '3', '4']:
print('잘못된 선택입니다')
continue # 메뉴 다시 표시
# 숫자 입력
a = float(input('첫 번째 숫자: '))
b = float(input('두 번째 숫자: '))
if choice == '1':
print(f'결과: {a + b}')
elif choice == '2':
print(f'결과: {a - b}')
elif choice == '3':
print(f'결과: {a * b}')
elif choice == '4':
if b == 0:
print('0으로 나눌 수 없습니다')
continue
print(f'결과: {a / b}')
skip_dan = [3, 6]
for dan in range(2, 10):
if dan in skip_dan:
print(f'{dan}단은 건너뜁니다')
continue
print(f'\n[{dan}단]')
for i in range(1, 10):
print(f'{dan} x {i} = {dan * i}')
numbers = [10, 50, 30, 100, 20, 40]
max_threshold = 80
max_num = numbers[0]
for num in numbers:
if num > max_num:
max_num = num
# 임계값 초과 시 조기 종료
if max_num > max_threshold:
print(f'임계값({max_threshold})을 초과했습니다')
break
print(f'최댓값: {max_num}')
실행 결과:
임계값(80)을 초과했습니다
최댓값: 100
너무 많은 break/continue는 코드 흐름을 복잡하게 만듭니다.
# 나쁜 예 (break/continue 남용)
for i in range(10):
if i == 2:
continue
if i == 5:
continue
if i == 8:
break
print(i)
# 좋은 예 (조건을 명확하게)
for i in range(8):
if i not in [2, 5]:
print(i)
break/continue가 어느 반복문에 속하는지 명확히 해야 합니다.
for i in range(3):
for j in range(3):
if j == 1:
break # 안쪽 for문만 종료
# break는 여기로 이동
복잡한 조건은 변수로 분리하여 가독성을 높입니다.
# 나쁜 예
for item in items:
if item.price > 1000 and item.category == 'book' and item.stock > 0:
continue
process(item)
# 좋은 예
for item in items:
is_expensive_book_in_stock = (
item.price > 1000 and
item.category == 'book' and
item.stock > 0
)
if is_expensive_book_in_stock:
continue
process(item)
반복문의 else 절은 break 없이 정상 종료되었을 때만 실행됩니다.
# break 없이 정상 종료
for i in range(5):
print(i)
else:
print('정상 종료')
# 0 1 2 3 4 정상 종료
# break로 종료
for i in range(5):
if i == 3:
break
print(i)
else:
print('정상 종료') # 실행 안 됨
# 0 1 2
# break 없이 정상 종료
count = 0
while count < 3:
print(count)
count += 1
else:
print('정상 종료')
# 0 1 2 정상 종료
# break로 종료
count = 0
while count < 5:
if count == 3:
break
print(count)
count += 1
else:
print('정상 종료') # 실행 안 됨
# 0 1 2
numbers = [10, 20, 30, 40, 50]
target = 35
for num in numbers:
if num == target:
print(f'{target}을(를) 찾았습니다')
break
else:
print(f'{target}을(를) 찾지 못했습니다')
# 35을(를) 찾지 못했습니다