3주차 · 조건문
- Boolean과 비교 연산자의 차이를 예제로 설명할 수 있다.
if/elif/else기본 문법과 들여쓰기 규칙을 설명할 수 있다.if/elif/else분기 순서를 조건 우선순위와 함께 설계할 수 있다.- C의 조건문과 Python 조건문의 차이를 예제로 설명할 수 있다.
- 경계값(예: 69/70/71) 테스트 케이스를 스스로 만들 수 있다.
- 중첩 조건문을 읽고 논리 오류를 추적할 수 있다.
- 분기 결과를 코드 출력 + 해석 문장으로 정리할 수 있다.
조건문을 왜 배우나요?
Section titled “조건문을 왜 배우나요?”조건문은 컴퓨터에게 상황에 따라 다른 행동을 시키는 도구입니다.
- 온도가 높으면 팬 켜기
- 점수가 90점 이상이면 A
- 신호가 약하면 경고
즉, 조건문은 현실의 판단 규칙을 코드로 옮기는 과정입니다.
1) 불리언(Boolean): True 또는 False
Section titled “1) 불리언(Boolean): True 또는 False”Boolean은 딱 두 값만 가집니다.
True: 조건이 참False: 조건이 거짓
is_hot = Trueis_raining = Falseprint(is_hot, is_raining)왜 중요할까?
Section titled “왜 중요할까?”- 조건문, 반복문, 예외 처리의 핵심 재료가 Boolean입니다.
- 공학 시스템에서 알람/정상/정지 같은 상태 판정은 대부분 Boolean 조합으로 작성됩니다.
2) 비교 연산자
Section titled “2) 비교 연산자”| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
> | 크다 | 10 > 3 | True |
< | 작다 | 10 < 3 | False |
== | 같다 | 5 == 5 | True |
!= | 다르다 | 5 != 5 | False |
>= | 크거나 같다 | 70 >= 70 | True |
<= | 작거나 같다 | 69 <= 70 | True |
잘못된 예와 올바른 예: 비교 연산
Section titled “잘못된 예와 올바른 예: 비교 연산”Good
score = 90print(score >= 90) # TrueBad
score = 90print(score = 90) # 문법 오류 (대입과 비교를 혼동)설명: =는 값 저장, ==는 값 비교입니다.
실수(float) 비교 시 주의점
Section titled “실수(float) 비교 시 주의점”float 값을 ==로 비교하면 예상치 못한 결과가 나올 수 있습니다.
print(0.1 + 0.2 == 0.3) # False0.1 + 0.2는 내부적으로 0.30000000000000004가 됩니다. IEEE 754 부동소수점 표현 방식 때문에 10진수 소수를 2진수로 정확히 나타낼 수 없어 미세한 오차가 생깁니다.
실수 비교에는 허용 오차(tolerance) 패턴을 사용하세요.
measured_v = 3.299999999expected_v = 3.3tolerance = 0.001if abs(measured_v - expected_v) < tolerance: print("정상 범위")abs(a - b): 두 값의 차이의 절댓값을 구합니다.< tolerance: 차이가 허용 범위 안에 있으면 “같다”고 판단합니다.
조건문 기본 문법: 어떻게 쓰나요?
Section titled “조건문 기본 문법: 어떻게 쓰나요?”처음 배우는 학생이 가장 많이 헷갈리는 부분은 “어디까지가 조건문 안쪽인가?” 입니다.
Python은 C처럼 중괄호 {}를 쓰지 않고, 콜론(:) + 들여쓰기(indentation) 로 블록을 구분합니다.
if condition_1: # condition_1 이 True일 때 실행 statement_1 statement_2elif condition_2: # 앞 조건이 False이고 condition_2 가 True일 때 실행 statement_3else: # 위 조건이 모두 False일 때 실행 statement_4
# 들여쓰기가 끝나면 조건문 바깥 코드statement_5if뒤에 조건식을 적는다.- 조건식 끝에 반드시
:를 붙인다. - 다음 줄부터 같은 칸 수(처음에는 4칸 추천) 만큼 들여쓴다.
- 같은 블록에 있는 코드는 같은 깊이로 맞춘다.
elif,else는if와 같은 깊이에 둔다.
dust = 82
if dust >= 80: print("환기 필요") print("마스크 착용 권장")else: print("실내 공기 양호")
print("판정 종료")if dust >= 80:줄 끝의:가 블록 시작을 알립니다.- 들여쓴 두 줄은
if블록 안에서 함께 실행됩니다. - 마지막
print("판정 종료")는 들여쓰기가 없으므로 조건문 밖에서 항상 실행됩니다.
잘못된 예와 올바른 예: 들여쓰기
Section titled “잘못된 예와 올바른 예: 들여쓰기”Bad
if dust >= 80:print("환기 필요")Good
if dust >= 80: print("환기 필요")3) if / elif / else: 순서가 논리다
Section titled “3) if / elif / else: 순서가 논리다”temperature = 37
if temperature >= 38: print("fever")elif temperature >= 35: print("normal")else: print("low")if: 첫 조건 검사elif: 앞 조건이 거짓일 때 추가 검사else: 위 조건이 모두 거짓일 때 실행
- 위에서 아래로 검사한다.
- 먼저 참이 된 블록 하나만 실행한다.
- 따라서 조건 순서 자체가 설계 품질이다.
의사결정 흐름도
Section titled “의사결정 흐름도”flowchart TD
A[입력값 score] --> B{score >= 90?}
B -- Yes --> G[A]
B -- No --> C{score >= 80?}
C -- Yes --> H[B]
C -- No --> D{score >= 70?}
D -- Yes --> I[C]
D -- No --> J[D/F 등 다음 규칙] 조건 평가 추적 테이블 (Trace Table)
Section titled “조건 평가 추적 테이블 (Trace Table)”score = 75일 때 조건문이 어떻게 실행되는지 한 줄씩 따라가 봅니다.
| 단계 | 검사하는 조건 | 결과 | 동작 |
|---|---|---|---|
| 1 | score >= 90 → 75 >= 90 | False | 이 블록 건너뜀 |
| 2 | score >= 80 → 75 >= 80 | False | 이 블록 건너뜀 |
| 3 | score >= 70 → 75 >= 70 | True | grade = "C" 실행 후 종료 |
조건이 True가 되는 순간, 나머지 elif/else는 검사하지 않고 빠져나옵니다.
다른 값으로도 손으로 직접 추적해 보세요:
| score 값 | 1단계 >=90 | 2단계 >=80 | 3단계 >=70 | 4단계 >=60 | 결과 |
|---|---|---|---|---|---|
| 95 | True | (건너뜀) | (건너뜀) | (건너뜀) | A |
| 83 | False | True | (건너뜀) | (건너뜀) | B |
| 75 | False | False | True | (건너뜀) | C |
| 62 | False | False | False | True | D |
| 55 | False | False | False | False | F |
4) 논리 연산자: and, or, not
Section titled “4) 논리 연산자: and, or, not”and: 둘 다 참이어야 참or: 하나라도 참이면 참not: 참/거짓 반전
temp = 52current = 1.9fan_ok = True
print(temp > 50 and current > 1.8) # Trueprint(temp > 60 or current > 1.8) # Trueprint(not fan_ok) # False논리식 해석 요령
Section titled “논리식 해석 요령”- 길어지면 괄호로 의미 단위를 먼저 나눈다.
- 중간 결과를 변수로 분리하면 실수가 줄어든다.
is_overheat = temp > 50is_overcurrent = current > 1.8is_fan_fail = not fan_ok
if (is_overheat and is_overcurrent) or is_fan_fail: print("STOP")5) 중첩 조건문
Section titled “5) 중첩 조건문”조건문 안에 또 조건문을 넣는 방식입니다.
Good (의도 분명)
battery = 18charging = False
if battery < 20: if charging: print("충전 중: 사용 가능") else: print("배터리 부족: 충전 필요")else: print("배터리 정상")Bad (과도한 중첩, 읽기 어려움)
# 깊은 중첩은 초보자에게 디버깅 난이도를 크게 올립니다.# 조건이 많아지면 elif 분기로 단순화하세요.6) 경계값 테스트
Section titled “6) 경계값 테스트”경계값은 규칙이 바뀌는 지점입니다.
예: if rssi < -70이면 경고
반드시 테스트할 값:
- 경계 바로 아래:
-71 - 경계 정확히:
-70 - 경계 바로 위:
-69
7) C와 비교: 조건문 문법이 이렇게 다릅니다
Section titled “7) C와 비교: 조건문 문법이 이렇게 다릅니다”C를 먼저 본 학생이라면, Python 조건문에서 아래 차이를 가장 먼저 기억하면 됩니다.
| 항목 | C | Python | 기억할 점 |
|---|---|---|---|
| 블록 구분 | { ... } | 들여쓰기 | Python에서는 공백이 문법이다 |
| 분기 연결 | else if | elif | Python은 한 단어로 쓴다 |
| 조건 괄호 | if (x > 0) | if x > 0: | 괄호는 보통 생략, :는 필수 |
| 문장 끝 | ; | 없음 | 줄바꿈으로 문장을 구분 |
| 논리 연산 | &&, ||, ! | and, or, not | 기호 대신 영어 단어 사용 |
int score = 85;
if (score >= 90) { printf("A\n");} else if (score >= 80) { printf("B\n");} else { printf("C or below\n");}score = 85
if score >= 90: print("A")elif score >= 80: print("B")else: print("C or below")C 문법을 그대로 가져오면 생기는 실수
Section titled “C 문법을 그대로 가져오면 생기는 실수”Bad (C 습관을 그대로 쓴 경우)
score = 85
if (score >= 90) { print("A");} elif (score >= 80) { print("B");}Good (Python 문법으로 다시 쓰기)
score = 85
if score >= 90: print("A")elif score >= 80: print("B")else: print("C or below") 핵심은 중괄호 대신 들여쓰기, else if 대신 elif, && 대신 and 를 먼저 떠올리는 것입니다.
- 조건문 코드를 보기 전에 입력값 후보를 표로 만든다.
- 각 조건이 True/False가 될지 손으로 먼저 예측한다.
- 실행 후 실제 분기 결과와 예측을 비교한다.
- 틀린 경우 조건 순서와 연산자(
and/or/not)를 먼저 점검한다. - 경계값 3점(아래/같음/위)을 추가 실행해 규칙을 확정한다.
예제 1 · 성적 분류기
Section titled “예제 1 · 성적 분류기”점수 하나를 변수에 담고 if/elif/else로 등급을 판정합니다. 값을 직접 바꿔가며 여러 경우를 확인하세요.
예제 1 줄별 해설
Section titled “예제 1 줄별 해설”score = 75: 판정할 점수를 변수 하나에 담습니다. 값을 바꾸면 다른 등급을 확인할 수 있습니다.if score >= 90:: 가장 높은 등급 조건을 먼저 검사합니다. 참이면 즉시 “A”로 결정되고 아래 조건은 검사하지 않습니다.elif score >= 80:: 앞 조건(90 이상)이 거짓일 때만 도달합니다. 즉 이 줄에 왔다는 것 자체가score < 90임을 보장합니다.elif score >= 70:/elif score >= 60:: 같은 방식으로 범위를 좁혀 갑니다.else:: 어떤 범위에도 속하지 않으면(60 미만) “F”로 처리합니다.print("score:", score)/print("grade:", grade): 입력과 결과를 함께 출력해 판정이 맞는지 바로 확인합니다.
시도해 볼 값: 59, 60, 69, 70, 79, 80, 89, 90 — 경계 근처 값을 하나씩 바꿔 보세요.
예제 2 · 안전 상태 판정 (복합 조건)
Section titled “예제 2 · 안전 상태 판정 (복합 조건)”온도, 전류, 팬 상태 세 변수를 조합해 장비 상태를 판정합니다. 변수 값을 직접 바꿔가며 어떤 조합이 STOP/CHECK/RUN을 만드는지 확인하세요.
예제 2 줄별 해설
Section titled “예제 2 줄별 해설”temp = 52/current = 2.0/fan_ok = True: 세 변수가 하나의 케이스를 나타냅니다. 값을 바꾸면 다른 케이스를 시뮬레이션할 수 있습니다.if (temp > 50 and current > 1.8) or (not fan_ok):: 가장 위험한 조건을 최우선으로 배치합니다. 과열+과전류이거나 팬이 고장나면 즉시 STOP입니다.elif temp >= 42 or current >= 1.5:: 즉시 정지는 아니지만 점검이 필요한 상태를 분리합니다.else:: 위 조건이 모두 아니면 정상 운전입니다.print(...): 입력 값 세 개와 판정 결과를 함께 출력해 판정 근거를 추적합니다.
시도해 볼 케이스:
temp=39, current=1.1, fan_ok=True→ RUN 예상temp=52, current=2.0, fan_ok=True→ STOP 예상temp=45, current=1.6, fan_ok=False→ STOP 예상 (팬 고장)temp=42, current=1.4, fan_ok=True→ CHECK 예상
흔한 실수: 잘못된 예와 올바른 예
Section titled “흔한 실수: 잘못된 예와 올바른 예”1) 조건 순서 실수
Section titled “1) 조건 순서 실수”Bad
if score >= 80: grade = "B"elif score >= 90: grade = "A" # 도달 불가Good
if score >= 90: grade = "A"elif score >= 80: grade = "B"설명: 넓은 범위를 먼저 검사하면 더 엄격한 조건이 가려집니다.
2) 논리식 괄호 생략
Section titled “2) 논리식 괄호 생략”Bad
if temp > 50 and current > 1.8 or not fan_ok: status = "STOP"Good
if (temp > 50 and current > 1.8) or (not fan_ok): status = "STOP"설명: 결과는 같을 수 있어도, Good 코드는 읽는 사람이 즉시 의도를 파악할 수 있습니다.
3) 경계값 미검증
Section titled “3) 경계값 미검증”Bad
# 70 근처 값을 전혀 테스트하지 않고 넘어감score = 85Good
# score 값을 직접 바꿔가며 69, 70, 71 같은 경계값을 테스트하세요.score = 70 # 경계 정확히# 다음에는 69, 71로 바꿔서 각각 실행해 보세요.설명: 조건문 오류의 대부분은 경계값에서 드러납니다. 경계 아래/같음/위 세 값을 반드시 직접 실행해 확인하세요.
상세 실수 테이블
Section titled “상세 실수 테이블”| 실수 | 증상 | 원인 | 해결 |
|---|---|---|---|
=와 == 혼동 | 문법 오류/오동작 | 대입/비교 개념 혼동 | 저장은 =, 비교는 ==로 구분 |
| 조건 순서 역전 | 높은 등급이 안 나옴 | 큰 범위를 먼저 검사 | 가장 엄격한 조건부터 배치 |
<, <= 경계 실수 | 특정 값에서 오판정 | 경계 정의 불명확 | 경계값 표 + 3점 테스트 |
and/or 오해 | 예상과 다른 분기 | 논리식을 추측으로 작성 | 괄호 + 중간 불리언 변수 사용 |
| 들여쓰기 오류 | 블록 실행 누락 | 파이썬 블록 구조 미숙 | 같은 블록 4칸 규칙 유지 |
| 중첩 과다 | 읽기/디버깅 어려움 | 한 함수에 규칙 과도 | elif 단순화 또는 함수 분리 |
| 테스트 생략 | 과제/실험에서 실패 | 정상 케이스만 확인 | 경계 포함 최소 3점(아래/같음/위) 검증 |
실습 문제 · 직접 코딩
Section titled “실습 문제 · 직접 코딩”문제 (기초): 점수(0~100) 하나를 변수에 담아 A/B/C/D/F 등급을 출력하세요.
값을 바꿔가며 90, 80, 70, 60 경계 근처도 확인해 보세요.
문제 (기초): 온도와 배터리 값을 보고 장비 상태를 OK/WARN/ALERT로 분류하세요.
규칙 예시: temperature_c > 80이면 ALERT, battery_percent < 20이면 WARN, 그 외는 OK.
문제 (응용): 아래 코드에서 score 값을 직접 바꿔가며 경계값 동작을 확인하세요.
69 → 70 → 71 순서로 실행했을 때 결과가 어떻게 달라지는지 관찰하고, 주석 표를 채워 보세요.
문제 (응용): 배터리 잔량과 충전 여부를 조합해 장비 상태를 판정하세요.
중첩 조건문(if 안에 if)을 사용하고, battery와 charging 값을 바꿔가며 4가지 조합을 모두 테스트하세요.
문제 (도전): 키(cm)와 몸무게(kg)로 BMI를 계산한 뒤 범위를 분류하세요.
BMI = 몸무게 / (키/100) ** 2 로 계산합니다. 값을 바꿔가며 각 범위가 제대로 나오는지 확인하세요.