파이썬 if문·for문을 콜론·들여쓰기 규칙부터 비교·논리 연산자, 중첩 반복문, break/continue까지 실제 실행 결과와 함께 정리했습니다. 짝수 출력·구구단·FizzBuzz 등 코드로 직접 검증한 미니 예제로 제어문 감각을 잡을 수 있습니다.
💻 코딩 입문자가 'if문·for문'에서 멈추는 이유
파이썬을 처음 배울 때 가장 먼저 벽을 느끼는 지점이 바로 제어문(파이썬 if문·for문)입니다. 변수를 만들고 print()로 출력하는 것까지는 누구나 따라 하지만, "내 프로그램이 조건에 따라 스스로 판단하고, 필요한 만큼 반복하게" 만드는 순간부터 감이 오지 않죠. 문법을 외웠는데도 막상 코드를 짜려고 하면 손이 멈추는 이유는, 제어문이 단순 암기가 아니라 프로그램의 실행 흐름을 설계하는 사고방식이기 때문입니다.
이 글은 그 흐름의 원리를 처음 코딩을 접하는 분도 직관적으로 이해할 수 있도록, 기초 문법부터 실전 미니 예제까지 하나씩 짚어드립니다. 모든 코드는 실제로 실행한 결과를 그대로 표기했으니, 직접 따라 치면서 결과를 비교해보시길 권합니다.
📌 if문 기초 — 조건에 따라 다르게 동작하기
if문은 "조건이 참(True)이면 이 코드를 실행하라"는 뜻입니다. 파이썬 if문에서 가장 중요한 규칙은 두 가지입니다.
- 콜론(:) — 조건식 뒤에는 반드시 콜론을 붙입니다.
- 들여쓰기(indentation) — 콜론 다음 줄부터는 스페이스 4칸(또는 탭 1개)을 들여써야 "이 코드가 if문에 속한다"는 뜻이 됩니다. 다른 언어처럼 중괄호 {}를 쓰지 않고, 들여쓰기 자체가 문법이라는 점이 파이썬의 특징입니다.
가장 단순한 if문 예제를 보겠습니다.
age = 20
if age >= 18:
print("성인입니다")
실행 결과:
성인입니다
age가 20이므로 age >= 18이 참이 되어 들여쓰기된 print문이 실행됩니다. 만약 조건이 거짓이면 아무 일도 일어나지 않습니다 — 이때 "조건이 거짓일 때는 무엇을 할지"를 정하는 것이 else입니다.
score = 65
if score >= 80:
print("합격")
else:
print("불합격")
실행 결과:
불합격
score가 65이므로 score >= 80이 거짓이 되어 else 블록의 "불합격"이 출력됩니다. if와 else는 항상 한 쌍이며, 두 블록 모두 콜론과 들여쓰기 규칙을 따라야 합니다.
📌 if-elif-else — 여러 조건을 순서대로 검사하기
조건이 두 가지보다 많을 때는 elif(else if의 줄임말)를 사용합니다. 파이썬은 if부터 시작해 elif를 순서대로 검사하다가, 처음으로 참이 되는 조건의 블록만 실행하고 나머지는 건너뜁니다.
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(f"학점: {grade}")
실행 결과:
학점: B
score가 85이므로 첫 번째 조건 score >= 90은 거짓이지만, 두 번째 조건 score >= 80이 참이 되어 grade가 "B"로 정해집니다. 이후의 elif·else는 검사조차 하지 않고 바로 print문으로 넘어갑니다. 이것이 if-elif-else의 핵심 — "위에서부터 순서대로, 하나만 실행"입니다.
📊 비교 연산자·논리 연산자 한눈에 보기
조건식을 만들 때 쓰는 연산자들을 표로 정리했습니다.
| 연산자 | 의미 | 예시 |
|---|---|---|
| == | 같다 | x == 3 |
| != | 다르다 | x != 3 |
| > | 크다 | x > 3 |
| < | 작다 | x < 3 |
| >= | 크거나 같다 | x >= 3 |
| <= | 작거나 같다 | x <= 3 |
| 연산자 | 의미 | 예시 |
|---|---|---|
| and | 둘 다 참이어야 참 | a and b |
| or | 둘 중 하나만 참이어도 참 | a or b |
| not | 참·거짓을 뒤집음 | not a |
여러 조건을 동시에 검사할 때 and·or·not을 씁니다. 아이디와 비밀번호를 함께 확인하는 예제로 살펴보겠습니다.
username = "user01"
password = "1234"
input_id = "user01"
input_pw = "1234"
if input_id == username and input_pw == password:
print("로그인 성공")
else:
print("로그인 실패")
실행 결과:
로그인 성공
여기서 ==는 "같은지 비교"하는 연산자이고, and는 "아이디도 맞고, 비밀번호도 맞아야" 로그인이 성공하도록 두 조건을 묶어줍니다. 둘 중 하나라도 틀리면 전체 조건이 거짓이 되어 else 블록이 실행됩니다.
🔁 for문 기초 — 정해진 횟수만큼 반복하기
for문은 "정해진 범위나 목록을 하나씩 꺼내며 반복"할 때 씁니다. 가장 많이 쓰는 형태가 range()와 함께 쓰는 방식입니다.
for i in range(5):
print(i)
실행 결과:
0
1
2
3
4
range(5)는 0부터 시작해 5 미만까지, 즉 0, 1, 2, 3, 4를 만들어냅니다. "5개를 반복하되 5는 포함하지 않는다"는 점을 헷갈리지 않는 것이 중요합니다. 시작 숫자를 지정하고 싶다면 range(시작, 끝) 형태를 씁니다.
for i in range(1, 6):
print(i)
실행 결과:
1
2
3
4
5
for문은 숫자 범위뿐 아니라 리스트 같은 자료구조도 그대로 순회할 수 있습니다.
fruits = ["사과", "바나나", "포도"]
for fruit in fruits:
print(fruit)
실행 결과:
사과
바나나
포도
변수 fruit에는 리스트의 원소가 순서대로 하나씩 담기고, 반복할 때마다 그 값을 그대로 사용할 수 있습니다. range()로 인덱스를 돌리는 것보다 이 방식이 더 직관적입니다.
🔁 while문과의 차이 — "몇 번"이냐 "언제까지"냐
for문이 "정해진 횟수만큼" 반복하는 데 적합하다면, while문은 "조건이 참인 동안 계속" 반복합니다. 반복 횟수를 미리 알 수 없을 때 while문을 씁니다.
count = 0
while count < 3:
print(count)
count += 1
실행 결과:
0
1
2
while문은 조건(count < 3)을 매번 확인하다가 거짓이 되는 순간 멈춥니다. 이때 count += 1처럼 조건에 영향을 주는 값을 반드시 바꿔줘야 하며, 그렇지 않으면 조건이 영원히 참으로 남아 무한 루프에 빠집니다. 반복 횟수가 명확하면 for문, 조건에 따라 반복이 끝나는 시점이 유동적이면 while문 — 이렇게 구분하면 됩니다.
🔁 중첩 반복문(Nested Loop) — 반복 안에 반복 넣기
for문 안에 또 다른 for문을 넣을 수 있습니다. 바깥 반복이 한 번 돌 때마다 안쪽 반복이 전부 실행되는 구조입니다.
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} x {j} = {i*j}")
실행 결과:
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
바깥쪽 i가 1일 때 안쪽 j가 1, 2, 3을 모두 거치고, i가 2로 바뀌면 다시 j가 1, 2, 3을 처음부터 반복합니다. 들여쓰기 단계가 한 단계 더 깊어진다는 점(안쪽 for문의 print는 8칸 들여쓰기)을 놓치지 않도록 주의해야 합니다.
⛔ break와 continue — 반복 흐름을 직접 제어하기
반복문 안에서 특정 조건일 때 반복을 완전히 멈추거나(break), 그 회차만 건너뛰고 다음으로 넘어가고(continue) 싶을 때 씁니다.
break — 조건을 만나는 즉시 반복문 자체를 빠져나갑니다.
for num in range(1, 11):
if num == 6:
break
print(num)
실행 결과:
1
2
3
4
5
num이 6이 되는 순간 break가 실행되어 반복문을 즉시 종료하므로, 6은 물론 그 이후 숫자도 출력되지 않습니다.
continue — 그 회차의 나머지 코드만 건너뛰고, 반복 자체는 계속됩니다.
for num in range(1, 11):
if num % 2 == 0:
continue
print(num)
실행 결과:
1
3
5
7
9
num % 2 == 0은 "num을 2로 나눈 나머지가 0", 즉 짝수인지 확인하는 조건입니다. 짝수일 때 continue가 실행되어 print를 건너뛰고 바로 다음 num으로 넘어가기 때문에, 홀수만 출력됩니다. break는 "멈춤", continue는 "건너뛰기"라는 차이를 기억해두면 헷갈리지 않습니다.
⚠️ 초보자가 자주 하는 실수 3가지
- 들여쓰기 오류 — 같은 블록 안에서 스페이스와 탭을 섞어 쓰거나, 들여쓰기 칸 수를 맞추지 않으면
IndentationError가 발생합니다. 한 파일 안에서는 반드시 같은 방식(보통 스페이스 4칸)으로 통일해야 합니다. - =와 ==의 혼동 —
=는 "값을 대입"하는 연산자이고,==는 "값이 같은지 비교"하는 연산자입니다.if x = 3:처럼 쓰면 문법 오류가 나므로, 조건문에서는 반드시==를 써야 합니다. - 콜론(:) 빠뜨림 —
if age >= 18처럼 콜론 없이 줄을 끝내면SyntaxError가 발생합니다. if, elif, else, for, while 모두 줄 끝에 콜론이 있어야 한다는 규칙을 반드시 지켜야 합니다.
🎯 실전 미니 예제로 감 잡기
지금까지 배운 문법을 조합해 실제로 쓰이는 짧은 프로그램 세 가지를 만들어보겠습니다.
예제 1 — 1~20 중 짝수만 출력하기
for num in range(1, 21):
if num % 2 == 0:
print(num, end=" ")
실행 결과:
2 4 6 8 10 12 14 16 18 20
range(1, 21)로 1부터 20까지 돌면서, num % 2 == 0으로 짝수만 골라냅니다. print(num, end=" ")는 줄바꿈 대신 공백으로 이어 붙이라는 뜻입니다.
예제 2 — 구구단 2단 출력하기
dan = 2
for i in range(1, 10):
print(f"{dan} x {i} = {dan*i}")
실행 결과:
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
dan 값만 3, 4로 바꾸면 다른 단도 그대로 출력할 수 있고, 여기에 바깥쪽 for문을 하나 더 씌우면 앞서 배운 중첩 반복문으로 2단부터 9단까지 한 번에 출력하는 것도 가능합니다.
예제 3 — FizzBuzz (1~15)
3의 배수면 "Fizz", 5의 배수면 "Buzz", 둘 다의 배수면 "FizzBuzz", 아니면 숫자 그대로 출력하는 유명한 코딩 연습 문제입니다.
for num in range(1, 16):
if num % 3 == 0 and num % 5 == 0:
print("FizzBuzz")
elif num % 3 == 0:
print("Fizz")
elif num % 5 == 0:
print("Buzz")
else:
print(num)
실행 결과:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
15는 3의 배수이면서 동시에 5의 배수이므로, if-elif 순서상 가장 먼저 검사하는 num % 3 == 0 and num % 5 == 0이 참이 되어 "FizzBuzz"가 출력됩니다. 만약 이 조건을 맨 위에 두지 않았다면 15에서 엉뚱하게 "Fizz"만 출력되는 버그가 생겼을 것입니다 — if-elif 순서가 결과를 바꾼다는 사실을 보여주는 좋은 예입니다.
💡 자주 묻는 질문
프로그래밍이 처음인데 따라갈 수 있나요?
네. 변수·출력 정도만 알면 충분하며, 이 글에 나온 코드는 모두 파이썬을 설치한 환경이나 온라인 코드 실행기(예: 파이썬 공식 사이트의 IDLE, 또는 웹 기반 에디터)에 그대로 입력해 바로 결과를 확인할 수 있습니다.
왜 제 코드는 실행 결과가 예제와 다르게 나오나요?
대부분 들여쓰기 칸 수가 맞지 않거나, 콜론을 빠뜨리거나, =와 ==를 혼동한 경우입니다. 에러 메시지에 표시되는 줄 번호를 먼저 확인하고, 위의 "초보자가 자주 하는 실수" 항목과 비교해보세요.
if문과 for문만 익히면 다음엔 뭘 배워야 하나요?
조건문과 반복문을 조합할 수 있게 되면, 리스트·딕셔너리 같은 자료구조와 함수(def) 정의로 자연스럽게 넘어가는 것이 좋습니다. 이 강의에서도 로그인 예제처럼 실전 흐름 중심으로 이어서 다룹니다.
💡 지금 시작하기
제어문은 모든 프로그래밍의 토대입니다. if문으로 조건에 따라 갈라지고, for문으로 반복을 자동화하는 감각을 한 번 제대로 잡아두면, 이후 어떤 언어를 배우든 학습 속도가 완전히 달라집니다. 직접 코드를 따라 치고 실행 결과를 눈으로 확인하면서 익혀보세요.
댓글
불러오는 중...
