
try-except만으로는 제어 구문(분기)이 부족합니다.
다음은 AI 운세 앱을 만들면서, if문을 제대로 익혀봅시다.
try-except 구문이 "에러인지 아닌지" 로 분기하는 것과 달리,
if문은 "조건이 참(True)인지 아닌지" 로 분기합니다.
score = 85
if score >= 70:
print("합격")
else:
print("불합격")
score가 70 이상(>=은 "이상")이면 "합격"을, 그렇지 않으면 "불합격"을 출력합니다.
이것이 if문의 가장 기본적인 구조입니다.
💡 포인트
score >= 70이라는 조건식은, "score가 70 이상인가?"를 판정합니다.
"같다"는==를 사용합니다.score == 100은 "score가 100과 같은가?"를 판정합니다.
=(대입)과==(비교)은 전혀 다른 연산자입니다. 혼동하기 쉬운 포인트이니 주의하세요.
if문만큼 중요한 기본 문법은 없습니다.
간단한 주사위 운세 앱을 만들면서 if문의 기본을 몸에 익혀봅시다.
아래 코드를 dice_fortune.py라는 이름으로 저장하고 실행해보세요.
import random
# 주사위를 굴린다 (1~6까지 랜덤으로 생성)
dice_result = random.randint(1, 6)
# "대길", "중길", "소길", "말길", "흉", "대흉" 중 하나를 저장
fortune = ""
# dice_result의 값에 따라, fortune에 운세 결과를 저장한다
if dice_result == 1:
fortune = "대길"
elif dice_result == 2:
fortune = "중길"
elif dice_result == 3:
fortune = "소길"
elif dice_result == 4:
fortune = "말길"
elif dice_result == 5:
fortune = "흉"
else:
fortune = "대흉"
print(f"주사위 눈: {dice_result}")
print(f"운세 결과: {fortune}")
실행 결과 예시:
주사위 눈: 3
운세 결과: 소길
random.randint(1, 6)은 1부터 6 사이의 랜덤한 정수를 생성합니다. 이것이 주사위의 눈입니다.
if문이 그 값에 따라 운세 결과를 분기시키고, fortune 변수에 저장합니다.
fortune = ""로 초기화하는 이유
Python에서는 변수를 사용하기 전에 반드시 정의해야 합니다.
if-elif-else 블록에서 어떤 분기를 타든fortune에 값이 들어가지만,
만약 초기화 없이 if 블록 어디서도 조건이 맞지 않으면 변수가 정의되지 않아 에러가 납니다.
= ""로 미리 빈 문자열을 넣어두는 것이 안전한 코딩 습관입니다.
if 조건식:
# True일 때의 처리
elif 조건식:
# 이전 조건식이 False이고 이 조건식이 True일 때의 처리
else:
# 모든 조건식이 False일 때의 처리
| 키워드 | 역할 |
|---|---|
if | 첫 번째 조건을 검사한다. True이면 이 블록을 실행 |
elif | else if의 약자. 이전 조건이 False일 때 다음 조건을 검사 |
else | 모든 조건이 False일 때 실행되는 기본(default) 블록 |
실행 흐름:
if 조건1 → True? → 실행 후 종료
→ False? → elif 조건2 → True? → 실행 후 종료
→ False? → else 블록 실행
True는 참, False는 거짓을 의미합니다.
조건식이 True일 때 해당 블록이 실행되고, False이면 다음 조건으로 넘어갑니다.
| 연산자 | 의미 | 예문 (조건식) |
|---|---|---|
== | 같다 | x == 5 (x는 5와 같다) |
!= | 같지 않다 | x != 5 (x와 5는 같지 않다) |
< | 보다 작다 | x < 5 (x는 5보다 작다) |
> | 보다 크다 | x > 5 (x는 5보다 크다) |
<= | 이하 | x <= 5 (x는 5 이하) |
>= | 이상 | x >= 5 (x는 5 이상) |
and | 논리곱(AND) | x > 0 and x < 10 (0보다 크고 10보다 작다) |
or | 논리합(OR) | x < 0 or x > 10 (0보다 작거나 10보다 크다) |
not | 부정(NOT) | not x > 5 (x는 5보다 크지 않다) |
학습 전략: 모든 연산자를 한 번에 외울 필요는 없습니다.
먼저==(같다),!=(같지 않다),>=(이상),<=(이하)부터 익히고,
샘플 코드에 나오는 것을 하나씩 추가해나가세요.
True와 False는 Python의 불리언(Boolean) 기본값이지만,
Python에서는 다른 값들도 조건식에서 참/거짓처럼 평가됩니다.
| 값 | 설명 |
|---|---|
False | 불리언의 거짓 |
None | 값이 존재하지 않음을 나타내는 특수한 값 |
0 | 정수 제로 |
0.0 | 부동소수점 제로 |
'' | 빈 문자열 |
[] | 빈 리스트 |
{} | 빈 딕셔너리 |
() | 빈 튜플 |
리스트·딕셔너리·튜플은 각각 별도의 섹션에서 자세히 다룹니다.
위 이외의 모든 값은 Truthy로 간주됩니다.
예를 들어 True, 3, "안녕", [1, 2, 3] 등은 모두 Truthy입니다.
직접 확인해보기:
# Falsy 확인
print(bool(None)) # False
print(bool(0)) # False
print(bool("")) # False
print(bool([])) # False
# Truthy 확인
print(bool(1)) # True
print(bool("hello")) # True
print(bool([0])) # True ← 0이 들어있는 리스트는 Truthy
if문의 True/False에 더해, Truthy/Falsy를 실전에서 활용하는 패턴을 살펴봅시다.
import os
import dotenv
import random
from langchain_google_genai import GoogleGenerativeAI
import streamlit as st
# 주사위를 굴린다 (1~6까지 랜덤으로 생성)
dice_result = random.randint(1, 6)
# "대길", "중길", "소길", "말길", "흉", "대흉" 중 하나를 저장
fortune = ""
# dice_result의 값에 따라, fortune에 운세 결과를 저장한다
if dice_result == 1:
fortune = "대길"
elif dice_result == 2:
fortune = "중길"
elif dice_result == 3:
fortune = "소길"
elif dice_result == 4:
fortune = "말길"
elif dice_result == 5:
fortune = "흉"
else:
fortune = "대흉"
# 콘솔에 주사위 눈과 운세 결과를 표시
print(f"주사위 눈: {dice_result}")
print(f"운세 결과: {fortune}")
# AI(Gemini)에 전달할 프롬프트를 생성
prompt = f"오늘의 운세는 {fortune}입니다. 이를 바탕으로, 오늘의 운세를 점쳐주세요."
# .env 파일에서 Google API 키를 읽어들인다
dotenv.load_dotenv()
google_api_key = os.getenv("GOOGLE_API_KEY")
if not google_api_key:
print("GOOGLE_API_KEY 가 설정되어 있지 않습니다.")
print("`.env` 파일에 `GOOGLE_API_KEY=당신의_키` 를 기재해주세요.")
exit(1) # API 키가 없는 경우는 프로그램을 종료한다
# Google Generative AI를 사용하여 운세 내용을 생성
gemini = GoogleGenerativeAI(
model="gemini-2.5-flash",
google_api_key=google_api_key
)
# Gemini의 답변을 가져온다
uranai = gemini.invoke(prompt)
# 운세 결과를 브라우저에 표시
st.markdown(f"## 오늘의 운세: {fortune}") # 제목 (레벨2)
st.markdown(f"### AI 운세:\n{uranai}") # 제목 (레벨3)과 운세 내용을 표시
# 기동 명령어:
# streamlit run llm_fortune.py
# 종료
# Ctrl + C
코드는 크게 두 부분으로 나뉩니다.
| 부분 | 내용 | if문의 유형 |
|---|---|---|
| 전반부 | 주사위 눈 → 운세 결과 분기 | True / False 기반의 고전적인 if-elif-else |
| 후반부 | API 키 존재 여부 체크 | Truthy / Falsy 를 활용한 실전 패턴 |
if dice_result == 1:
fortune = "대길"
elif dice_result == 2:
fortune = "중길"
...
else:
fortune = "대흉"
dice_result == 1은 True 또는 False를 반환하는 조건식입니다.
처음으로 True가 되는 분기의 블록만 실행되고, 나머지는 건너뜁니다.
if not google_api_key:
print("GOOGLE_API_KEY 가 설정되어 있지 않습니다.")
print("`.env` 파일에 `GOOGLE_API_KEY=당신의_키` 를 기재해주세요.")
exit(1)
이 코드가 Truthy/Falsy를 활용한 실전 패턴의 핵심입니다.
동작 원리:
dotenv.load_dotenv() 을 잊었다면
↓
os.getenv("GOOGLE_API_KEY") → None 반환
↓
google_api_key = None
↓
if not google_api_key: → if not None: → if True: → 블록 실행
↓
경고 메시지 출력 후 exit(1)로 종료
None은 Falsy이므로, not None은 True가 됩니다.
따라서 if not google_api_key:는 "API 키가 비어있거나 없으면" 이라는 의미가 됩니다.
같은 의미를 명시적으로 쓰면:
# 아래 세 가지는 모두 같은 의미
if not google_api_key: # ✅ Python다운 간결한 방식 (권장)
if google_api_key is None: # None인지 명시적으로 체크
if google_api_key == None: # == 대신 is 사용을 권장
if not 변수:패턴은 매우 자주 등장합니다.
API 키 체크, 사용자 입력 검증, 파일 경로 확인 등에서 반복적으로 쓰입니다.
패턴으로 외워두세요.
exit(1) — 비정상 종료exit(1) # API 키가 없는 경우는 프로그램을 종료한다
exit(1)은 프로그램을 즉시 종료하는 함수입니다.
인수의 숫자는 종료 코드(Exit Code) 를 나타냅니다.
| 종료 코드 | 의미 |
|---|---|
exit(0) | 정상 종료 |
exit(1) | 비정상 종료 (오류 발생) |
API 키 없이 프로그램을 계속 실행하면 이후 코드에서 반드시 에러가 납니다.
조기에 종료시키고 명확한 안내 메시지를 출력하는 것이 사용자 친화적입니다.
| 패턴 | 언제 사용하는가 | 예시 |
|---|---|---|
try-except | 실행해봐야만 에러 여부를 알 수 있는 경우 | 네트워크 통신, 파일 열기 |
if not | 실행 전에 미리 조건을 검사할 수 있는 경우 | API 키 존재 여부, 입력값 비어있는지 |
# ✅ 패턴 1: 미리 검사 가능 → if로 조기 종료
if not google_api_key:
print("API 키가 없습니다.")
exit(1)
# ✅ 패턴 2: 실행해봐야 알 수 있음 → try-except로 대응
try:
tts = gTTS(text=text_to_read, lang='ko')
tts.save("voice.mp3")
except Exception as e:
st.warning("음성 생성에 실패했습니다.")
두 패턴을 상황에 맞게 조합하는 것이, 견고한(robust) Python 코드의 기본입니다.
# 패턴 1: API 키 / 환경변수 체크
api_key = os.getenv("MY_API_KEY")
if not api_key:
print("API 키가 설정되지 않았습니다.")
exit(1)
# 패턴 2: 사용자 입력 비어있는지 확인 (Streamlit)
user_input = st.text_input("질문을 입력하세요")
if not user_input:
st.warning("질문을 입력해주세요.")
st.stop() # Streamlit에서 실행 중단
# 패턴 3: 리스트가 비어있는지 확인
results = []
if not results:
print("검색 결과가 없습니다.")
# 패턴 4: None 처리
data = some_function() # None을 반환할 수도 있는 함수
if data:
process(data)
else:
print("데이터가 없습니다.")
| 개념 | 한 줄 요약 |
|---|---|
| if | 조건이 True일 때 실행되는 블록 |
| elif | 이전 조건이 False이고 이 조건이 True일 때 실행 |
| else | 모든 조건이 False일 때 실행되는 기본 블록 |
| True / False | Python 불리언의 기본값. 조건식의 판정 결과 |
| Truthy | 조건식에서 True로 간주되는 값 (대부분의 값) |
| Falsy | 조건식에서 False로 간주되는 값 (None, 0, "", [] 등) |
if not 변수: | 변수가 Falsy(비어있거나 None)일 때 실행 — 자주 쓰는 패턴 |
exit(1) | 비정상 종료. 계속 실행이 불가능할 때 조기 종료시킨다 |
| try-except vs if | 미리 검사 가능하면 if, 실행 후에야 알 수 있으면 try-except |
©2024-2026 MDRULES.dev, Hand-crafted & made with Jaewoo Kim.
이메일문의: jaewoo@mdrules.dev
AI강의/개발/기술자문, AI 업무 자동화 컨설팅 문의: https://talk.naver.com/ct/w5umt5
AI 프롬프트 및 워크플로우 설계 대행: https://mdrules.dev
📌 핵심 원칙
=(대입)과==(비교)를 절대 혼동하지 말자if not 변수:는 Falsy 전체를 한 번에 처리하는 Python다운 패턴이다- API 키·사용자 입력·파일 경로 등 사전 검사 가능한 조건은 if로, 실행 중 에러는 try-except로 나눠 처리하자