📋 목차
파이썬 반복문 for문과 while문 차이를 모르겠다면, 무한 루프에 빠져서 Ctrl+C를 연타한 경험이 있다면, 이 글 하나로 반복문 기초부터 탈출법까지 한 번에 정리할 수 있어요.
솔직히 말하면 저도 파이썬 처음 시작했을 때 반복문이 제일 헷갈렸거든요. for문이랑 while문이 뭐가 다른 건지, 둘 다 반복하는 거 아닌가 싶었어요. 게다가 while True라는 걸 처음 봤을 때는 “이걸 왜 일부러 무한으로 돌리지?” 하는 생각밖에 안 들었고요.
근데 코드를 직접 짜보면서 깨달은 게 있어요. 반복문은 결국 “몇 번 돌릴지 아느냐, 모르느냐”가 핵심이더라고요. 이 기준 하나만 잡히면 for문과 while문 선택이 자연스러워지고, 무한 루프도 무섭지 않아져요. 3개월 동안 반복문 가지고 삽질한 경험을 바탕으로, 진짜 필요한 것만 정리해봤어요.
for문은 왜 먼저 배워야 할까
파이썬에서 for문은 “정해진 범위를 순서대로 돌리는” 반복문이에요. 리스트, 튜플, 문자열처럼 순회 가능한(iterable) 객체를 하나씩 꺼내면서 실행하는 구조죠. 다른 언어와 달리 파이썬 for문은 for 변수 in 순회객체 형태로만 쓸 수 있어요.
가장 많이 보는 패턴이 range() 함수와의 조합인데요. for i in range(5)라고 쓰면 i가 0, 1, 2, 3, 4를 차례로 받으면서 5번 반복해요. range(1, 11)이면 1부터 10까지. 이게 직관적이라 입문자가 제일 먼저 익히기 좋거든요.
근데 여기서 한 단계 올라가면 enumerate()가 나와요. 리스트를 돌리면서 인덱스 번호도 동시에 필요할 때 쓰는 건데, 처음에 저는 이걸 몰라서 카운터 변수를 따로 만들었거든요. count = 0 선언하고, 루프 안에서 count += 1 해주고. enumerate()를 알고 나서 허탈했어요. for idx, value in enumerate(my_list) 한 줄이면 끝나는 걸 왜 그렇게 돌아갔나 싶었죠.
for문의 장점은 명확해요. 반복 횟수가 눈에 보인다는 거예요. range(100)이면 100번, len(data)면 데이터 개수만큼. 끝이 정해져 있으니 무한 루프에 빠질 위험도 거의 없고요. 입문 단계에서는 for문만으로도 웬만한 반복 작업을 전부 처리할 수 있어요.
참고로 for문 안에서 리스트를 직접 순회하면서 값을 수정하면 예상 밖의 결과가 나올 수 있어요. 이건 뒤에서 초보 실수 파트에서 따로 다룰게요.
while문이 진짜 필요한 순간
while문은 조건이 참인 동안 계속 반복하는 구조예요. for문이 “몇 번 돌릴지” 정하는 거라면, while문은 “언제 멈출지” 조건을 거는 거예요. 이 차이가 핵심이에요.
기본 형태는 간단해요. while 조건식: 이렇게 쓰고, 조건식이 True인 동안 들여쓰기 블록이 실행돼요. 예를 들어 count = 0으로 시작해서 while count < 10: 안에서 count += 1을 해주면, count가 10이 되는 순간 조건이 False가 되면서 루프가 끝나요.
그럼 while문은 언제 쓰느냐. 사용자 입력을 받을 때가 대표적이에요. “q를 누르면 종료”같은 프로그램을 만들려면 사용자가 언제 q를 입력할지 모르잖아요. 이럴 때 while True로 무한 루프를 돌리고, input()으로 받은 값이 ‘q’이면 break로 빠져나오는 패턴을 써요. 이게 실무에서도 정말 많이 쓰이는 구조거든요.
서버 프로그램이나 게임 메인 루프도 마찬가지예요. 언제 끝날지 모르는 상태에서 계속 돌아가야 하니까 while True가 자연스러운 선택이 되는 거죠. 처음에는 “무한 루프를 왜 일부러 만들지?” 싶었는데, 직접 채팅 프로그램 비슷한 걸 만들어보니까 바로 이해가 됐어요.
📊 실제 데이터
파이썬 공식 문서에 따르면 while문의 조건식은 매 반복 시작 전에 평가돼요. 조건식 자체가 False로 시작하면 루프 본문은 단 한 번도 실행되지 않아요. 반면 while True는 조건이 항상 참이기 때문에 루프 내부에 반드시 break나 return 같은 탈출 장치가 있어야 해요. Stack Overflow 기준으로 파이썬 무한 루프 관련 질문의 약 70% 이상이 while True + break 패턴에 대한 질문이에요.
for문과 while문, 언제 뭘 쓰는 게 맞을까
이 질문을 처음 검색했을 때 대부분의 답변이 “반복 횟수가 정해져 있으면 for, 아니면 while”이었어요. 맞는 말인데, 실제로 코드를 짜다 보면 애매한 경우가 꽤 있거든요. 리스트를 순회하면서 특정 조건에 멈추고 싶을 때, for에 break를 쓸지 while을 쓸지 고민되는 거예요.
제가 나름대로 정리한 기준은 이래요. 데이터를 처음부터 끝까지 한 번씩 보는 거면 for문. 중간에 멈출 수도 있지만 기본적으로 전체를 도는 거라면 역시 for문에 break 조합. 반면에 “조건이 바뀔 때까지 계속”인 상황이면 while문이에요. 사용자 입력 대기, 센서 값 모니터링, 파일 끝까지 읽기 같은 경우요.
| 구분 | for문 | while문 |
|---|---|---|
| 반복 기준 | 순회 객체의 길이 | 조건식의 참/거짓 |
| 무한 루프 위험 | 거의 없음 | 조건 설계 실수 시 발생 |
| 대표 사용처 | 리스트 순회, 횟수 지정 반복 | 입력 대기, 조건부 반복 |
| 자주 쓰는 조합 | range(), enumerate() | while True + break |
하나 더 알아두면 좋은 게 있어요. 파이썬에서는 for문이 C언어의 for(int i=0; i<10; i++) 같은 카운터 기반이 아니에요. 파이썬 for문은 이터레이터 프로토콜을 따르는 구조라서, 순회 객체가 StopIteration을 발생시키면 자동으로 멈춰요. 그래서 파이썬에서는 "횟수 기반 반복도 결국 range라는 객체를 순회하는 것"이라는 개념이 중요하거든요.
결론적으로, 실무 파이썬 코드에서는 for문을 쓰는 비율이 압도적으로 높아요. while문은 특수한 상황에서만 등장한다고 보면 돼요. 초보 단계에서 while문을 과도하게 쓰는 건 C나 Java 스타일에 익숙해서인 경우가 많더라고요.
무한 루프에 빠졌을 때 탈출하는 법
한 번은 while문 연습하다가 조건 변수를 업데이트하는 걸 깜빡한 적이 있어요. 터미널에 숫자가 쏟아지는데 멈출 수가 없는 거예요. 마우스 클릭도 안 먹고, 키보드를 아무리 눌러도 반응이 없어 보이고. 처음 겪으면 진짜 당황하거든요.
일단 긴급 탈출부터. 터미널이나 명령 프롬프트에서 실행 중이라면 Ctrl+C를 누르면 돼요. 이게 KeyboardInterrupt 예외를 발생시켜서 프로그램을 강제 중단해요. Jupyter 노트북에서는 상단 메뉴의 커널 중단(Interrupt Kernel) 버튼을 누르거나, 역시 Ctrl+C가 먹히는 경우가 많아요. VS Code 터미널도 Ctrl+C로 해결되고요.
하지만 진짜 중요한 건 코드 단계에서 무한 루프를 방지하는 거예요. 가장 흔한 방법이 break문이에요. while True로 의도적 무한 루프를 만들되, 특정 조건에서 break로 빠져나오는 패턴이죠. 예를 들어 사용자에게 숫자를 입력받다가 0을 누르면 종료하는 프로그램이라면, if user_input == 0: break 한 줄이면 돼요.
또 하나는 안전장치로 카운터를 넣는 방법이에요. max_tries = 1000 같은 변수를 선언해놓고, 루프를 돌 때마다 카운터를 증가시켜서 max_tries에 도달하면 break하는 거예요. 디버깅할 때 특히 유용한 습관이에요. 실무에서 API 호출 재시도 로직을 만들 때도 이 패턴을 쓰거든요. 무한정 재시도하면 안 되니까 최대 횟수를 정해놓는 거죠.
💡 꿀팁
while문을 작성할 때 습관적으로 해두면 좋은 게 있어요. 루프 본문 첫 줄에 print()로 조건 변수의 현재 값을 출력하는 거예요. 무한 루프에 빠지면 어떤 값에서 멈췄는지 바로 확인할 수 있거든요. 디버깅 끝나면 지우면 되고요. 이 습관 하나가 삽질 시간을 정말 많이 줄여줘요.
break, continue, 그리고 반복문 else까지
break는 루프를 완전히 끝내는 거예요. 반면 continue는 현재 회차만 건너뛰고 다음 반복으로 넘어가요. 이 둘을 카드 게임에 비유하면, break는 게임 자체를 그만두는 거고 continue는 이번 판만 패스하는 거예요. 파이썬 코딩 도장에서 본 비유인데 정말 딱 맞더라고요.
continue를 실전에서 언제 쓰냐면, 리스트에서 특정 조건에 해당하는 항목만 건너뛰고 싶을 때예요. for item in data_list: 안에서 if item is None: continue라고 쓰면 None인 항목을 만났을 때 아래 코드를 실행하지 않고 바로 다음 항목으로 넘어가요. if-else로 감싸는 것보다 들여쓰기가 깔끔해져서 가독성이 올라가거든요.
그리고 파이썬에는 다른 언어에서 잘 안 보이는 독특한 문법이 있어요. 바로 반복문 else예요. for-else 또는 while-else라고 하는데, 루프가 break 없이 정상적으로 끝까지 돌았을 때 else 블록이 실행돼요. break로 중간에 빠져나오면 else는 실행되지 않고요.
솔직히 이 문법은 처음에 이해가 안 됐어요. “반복문에 else가 왜 붙어?” 싶었거든요. 근데 써보니까 리스트에서 특정 값을 찾는 패턴에 딱이더라고요. for문으로 돌면서 찾으면 break, 끝까지 못 찾으면 else 블록에서 “없음” 처리를 하는 거예요. 다만 이 문법은 파이썬 커뮤니티에서도 호불호가 갈려요. 가독성이 떨어진다는 의견도 있어서, 팀 프로젝트에서는 주석을 꼭 달아두는 게 좋아요.
초보 시절 반복문에서 저지른 실수 모음
첫 번째, while문에서 조건 변수를 안 바꾼 거예요. n = 1이고 while n < 10: 안에서 print(n)만 하고 n += 1을 빼먹었어요. n이 영원히 1이니까 당연히 무한 루프죠. 이게 초보자 무한 루프의 90%라고 해도 과언이 아니에요.
두 번째, for문으로 리스트를 돌면서 리스트 자체를 수정한 거예요. 순회 중인 리스트에서 요소를 remove()하면 인덱스가 밀리면서 일부 항목을 건너뛰거든요. 이걸 몰라서 “왜 다 안 지워지지?” 하고 한참 헤맸어요. 해결법은 리스트 복사본을 만들어서 순회하거나, 리스트 컴프리헨션으로 새 리스트를 만드는 거예요.
⚠️ 주의
while문의 조건식에 = 하나만 쓰는 실수도 흔해요. while x = 5: 이렇게 쓰면 파이썬에서는 SyntaxError가 나요. 비교 연산자는 ==이고 =은 대입 연산자거든요. C언어에서는 이게 에러 없이 통과되면서 무한 루프를 만드는 무서운 버그인데, 파이썬은 문법 에러로 잡아주니까 그나마 다행이에요. 다만 파이썬 3.8부터 도입된 왈러스 연산자(:=)를 while문에서 쓸 때는 헷갈릴 수 있으니 주의하세요.
세 번째는 range()의 범위를 잘못 이해한 거예요. range(1, 10)이면 1부터 10까지라고 생각했는데, 실제로는 1부터 9까지예요. 끝 값은 포함하지 않거든요. 수학에서 말하는 반열린 구간 [1, 10) 개념이에요. 이거 때문에 “왜 10이 안 나오지?” 하는 질문이 초보자 커뮤니티에 정말 많아요.
네 번째, 들여쓰기 실수. 파이썬은 중괄호 대신 들여쓰기로 블록을 구분하잖아요. 루프 안에 있어야 할 코드가 들여쓰기가 안 돼서 루프 바깥에서 한 번만 실행되거나, 반대로 루프 밖에 있어야 할 코드가 안에 들어가서 불필요하게 반복되는 경우가 있어요. 에러가 안 나고 그냥 결과만 이상하게 나와서 찾기 어려운 버그예요.
이런 실수들을 겪고 나서 깨달은 건, 반복문은 결국 “시작 조건, 변화 과정, 종료 조건” 세 가지를 명확히 설계하는 게 전부라는 거예요. 이 세 가지가 코드에 다 보이면 무한 루프에 빠질 일이 없어요.
❓ 자주 묻는 질문
Q. for문 안에서 break를 쓰면 바깥 for문도 같이 끝나나요?
아니요, break는 자신이 속한 가장 가까운 반복문 하나만 끝내요. 중첩 for문에서 바깥 루프까지 한 번에 끝내려면 플래그 변수를 쓰거나, 함수로 감싸서 return을 쓰는 방법이 있어요.
Q. while True 대신 while 1이라고 써도 되나요?
네, 동작은 같아요. 파이썬에서 1은 True로 평가되거든요. 다만 가독성 면에서 while True가 의도를 더 명확하게 드러내기 때문에 대부분의 스타일 가이드에서 while True를 권장해요.
Q. for문에서 range 대신 리스트를 직접 넣어도 되나요?
당연히 돼요. for fruit in [“사과”, “바나나”, “포도”]: 이런 식으로 쓸 수 있어요. 리스트뿐 아니라 튜플, 문자열, 딕셔너리, 세트 등 순회 가능한 객체는 전부 가능해요.
Q. continue를 쓰면 성능이 나빠지나요?
성능 차이는 사실상 없어요. continue는 단순히 제어 흐름을 바꾸는 것뿐이라 오버헤드가 거의 없거든요. 오히려 불필요한 코드 실행을 건너뛰니까 경우에 따라 살짝 빨라질 수도 있어요.
Q. 파이썬에 do-while문은 없나요?
파이썬에는 do-while 문법이 공식적으로 없어요. 대신 while True + break 패턴으로 동일한 효과를 낼 수 있어요. 루프 본문을 먼저 실행하고, 끝에서 조건을 검사해서 break하면 do-while과 같은 동작이 되거든요.
본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.
파이썬 반복문, 결국 이 세 가지예요
횟수가 정해져 있으면 for문, 조건이 바뀔 때까지 돌려야 하면 while문, 무한 루프가 필요하면 while True + break. 이 세 가지 패턴만 확실히 잡으면 반복문 때문에 막히는 일은 거의 없어요. 처음 배울 때 가장 효과적인 방법은 직접 작은 프로그램을 만들어보는 거예요. 구구단 출력, 숫자 맞추기 게임, 리스트에서 특정 값 찾기 같은 간단한 과제부터 시작해보세요.
반복문 관련해서 더 궁금한 점이 있으면 댓글로 남겨주세요. 도움이 됐다면 공유도 부탁드려요.