[Python 재입문] 5. Python if문 완전 정복 - Truthy Falsy 개념부터 AI 운세 앱 실전 구현까지

AgentKim·2026년 3월 13일

try-except만으로는 제어 구문(분기)이 부족합니다.
다음은 AI 운세 앱을 만들면서, if문을 제대로 익혀봅시다.


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문만큼 중요한 기본 문법은 없습니다.
간단한 주사위 운세 앱을 만들면서 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문의 구문 구조

if 조건식:
    # True일 때의 처리
elif 조건식:
    # 이전 조건식이 False이고 이 조건식이 True일 때의 처리
else:
    # 모든 조건식이 False일 때의 처리
키워드역할
if첫 번째 조건을 검사한다. True이면 이 블록을 실행
elifelse 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보다 크지 않다)

학습 전략: 모든 연산자를 한 번에 외울 필요는 없습니다.
먼저 ==(같다), !=(같지 않다), >=(이상), <=(이하)부터 익히고,
샘플 코드에 나오는 것을 하나씩 추가해나가세요.


Truthy(트루시)와 Falsy(폴시)

TrueFalse는 Python의 불리언(Boolean) 기본값이지만,
Python에서는 다른 값들도 조건식에서 참/거짓처럼 평가됩니다.

  • Truthy: 조건식에서 참(True)으로 간주되는 값
  • Falsy: 조건식에서 거짓(False)으로 간주되는 값

Falsy로 간주되는 값 목록

설명
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

AI 운세 앱 샘플 코드 (llm_fortune.py)

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

코드 해설 (llm_fortune.py)

코드는 크게 두 부분으로 나뉩니다.

부분내용if문의 유형
전반부주사위 눈 → 운세 결과 분기True / False 기반의 고전적인 if-elif-else
후반부API 키 존재 여부 체크Truthy / Falsy 를 활용한 실전 패턴

전반부: True/False 기반의 if-elif-else

if dice_result == 1:
    fortune = "대길"
elif dice_result == 2:
    fortune = "중길"
...
else:
    fortune = "대흉"

dice_result == 1True 또는 False를 반환하는 조건식입니다.
처음으로 True가 되는 분기의 블록만 실행되고, 나머지는 건너뜁니다.


후반부: Truthy/Falsy를 활용한 API 키 체크

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 NoneTrue가 됩니다.
따라서 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 vs if not — 어떻게 구분해서 쓰는가

패턴언제 사용하는가예시
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 코드의 기본입니다.


Truthy/Falsy 실전 활용 패턴 모음

# 패턴 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("데이터가 없습니다.")

정리 (제4부)

개념한 줄 요약
if조건이 True일 때 실행되는 블록
elif이전 조건이 False이고 이 조건이 True일 때 실행
else모든 조건이 False일 때 실행되는 기본 블록
True / FalsePython 불리언의 기본값. 조건식의 판정 결과
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로 나눠 처리하자
profile
AI-fluent liberal arts engineer | AX Consulting | AI Workflow Architect | LLM Engineer | Claude Code | AI강의/개발/기술자문 | AI 업무 자동화 컨설팅

0개의 댓글