math
CHAPTER 10 / 15
읽기 약 2분
FUNCTION
진리표: if/else를 표로 정리하기
핵심 개념
진리표로 복잡한 조건문 분석 — 불필요한 분기 발견 + 누락된 케이스 식별.
본문
진리표 작성법
변수 N개 → 행 2^N개
2개 변수: 4행
A | B
T | T
T | F
F | T
F | F
3개 변수: 8행
A | B | C
T | T | T
T | T | F
T | F | T
T | F | F
F | T | T
F | T | F
F | F | T
F | F | F5가지 기본 게이트 진리표
# 코드로 진리표 생성
def truth_table_2var():
print(f"{'A':^3} {'B':^3} {'AND':^4} {'OR':^4} {'XOR':^4} {'NAND':^5} {'NOR':^4}")
print("-" * 35)
for a in [True, False]:
for b in [True, False]:
and_ = a and b
or_ = a or b
xor_ = a != b # XOR
nand_ = not (a and b)
nor_ = not (a or b)
print(f"{str(a)[0]:^3} {str(b)[0]:^3} {str(and_)[0]:^4} {str(or_)[0]:^4} {str(xor_)[0]:^4} {str(nand_)[0]:^5} {str(nor_)[0]:^4}")
truth_table_2var()
# 결과:
# A B AND OR XOR NAND NOR
# -----------------------------------
# T T T T F F F
# T F F T T T F
# F T F T T T F
# F F F F F T T복잡한 if문 → 진리표 분석
# 실전 — 결제 시스템 권한 체크
def can_refund(is_admin, is_owner, days_since_purchase, amount):
"""
환불 가능 조건:
- 관리자이거나
- 본인이고 7일 이내이고 5만원 이하
- 본인이고 30일 이내이고 1만원 이하
"""
if is_admin:
return True
if is_owner and days_since_purchase <= 7 and amount <= 50000:
return True
if is_owner and days_since_purchase <= 30 and amount <= 10000:
return True
return False
# 진리표로 분석 — 변수 4개 = 2^4 = 16 케이스
# (단순화 위해 days를 7이하/8~30/30초과 3등급, amount를 1만이하/1~5만/5만초과 3등급)
import itertools
print(f"{'admin':^6} {'owner':^6} {'days':^10} {'amount':^10} {'결과':^6}")
print("-" * 45)
for admin in [True, False]:
for owner in [True, False]:
for days in [5, 20, 35]:
for amount in [5000, 30000, 100000]:
result = can_refund(admin, owner, days, amount)
print(f"{str(admin):^6} {str(owner):^6} {days:^10} {amount:^10} {str(result):^6}")진리표로 누락 케이스 발견
# 진리표의 모든 행이 의도한 결과인지 확인
# 누락된 케이스가 보이면 코드에 버그 있음
def grade(score, attendance):
"""학점 부여 — 진리표로 누락 분석"""
if score >= 90 and attendance >= 80:
return 'A'
if score >= 80 and attendance >= 70:
return 'B'
if score >= 70:
return 'C'
return 'F'
# 진리표 — 점수와 출석률 모두 등급화
import itertools
print(f"{'score':^7} {'attend':^7} {'grade':^6}")
for score in [95, 85, 75, 65]:
for attend in [85, 75, 65]:
g = grade(score, attend)
print(f"{score:^7} {attend:^7} {g:^6}")
# 발견:
# - score=95 attend=65 → 'C' (A 못 받음, 출석 부족 — 의도? 버그?)
# - score=75 attend=65 → 'C' (출석 무관 — 의도된 동작)
# 진리표를 보면서 "이 조합은 맞나?" 검토JavaScript — 객체 매핑으로 진리표 표현
// 복잡한 if 대신 진리표를 객체로
const ROLE_PERMISSIONS = {
// [admin][read][write][delete]
'admin': { read: true, write: true, delete: true },
'editor': { read: true, write: true, delete: false },
'viewer': { read: true, write: false, delete: false },
'guest': { read: false, write: false, delete: false },
};
function canPerform(role, action) {
return ROLE_PERMISSIONS[role]?.[action] ?? false;
}
console.log(canPerform('editor', 'write')); // true
console.log(canPerform('viewer', 'delete')); // false다음 챕터
CH.11 "드모르간 법칙" — 복잡한 부정 조건을 읽기 쉽게 변환.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 권한 체크 / 조건 분기 함수를 진리표로 분석해서 누락 케이스와 단순화 가능한 패턴을 찾아줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
한국 결제 / 인증 시스템 5개의 조건문 복잡도를 진리표 관점에서 비교하고 베스트 프랙티스를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스의 모든 복잡한 if문(3+조건)을 진리표로 분석해서 룩업 테이블로 전환 가능한 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 TDD에서 진리표 기반 테스트 케이스 자동 생성 도구 사용 비율과 실효성을 솔직히 알려줘.
⭐ 이것만 기억하세요
진리표: if/else를 표로 정리하기는 이 3가지만 확실히 잡으세요
1.진리표는 N개 변수의 모든 가능한 조합(2^N)을 표로 정리 — 누락 케이스 발견과 버그 차단의 표준 도구
2.복잡한 if문을 객체 매핑(룩업 테이블)으로 전환하면 진리표를 코드로 직접 표현 가능
3.다음 챕터 CH.11에서 드모르간 법칙 — 부정 조건의 수학적 변환
공유하기
진행도 10 / 15