math
CHAPTER 11 / 15
읽기 약 2분
FUNCTION
드모르간 법칙: 조건문 리팩토링
핵심 개념
!(A && B) === !A || !B — 부정 조건을 읽기 쉽게 변환하는 수학 법칙.
본문
드모르간 법칙 (De Morgan's Laws)
1. ¬(A ∧ B) = ¬A ∨ ¬B — AND의 부정 = 각각의 부정의 OR
2. ¬(A ∨ B) = ¬A ∧ ¬B — OR의 부정 = 각각의 부정의 AND진리표로 증명
import itertools
print("증명: ¬(A ∧ B) === ¬A ∨ ¬B")
print(f"{'A':^3} {'B':^3} {'A∧B':^4} {'¬(A∧B)':^7} {'¬A':^3} {'¬B':^3} {'¬A∨¬B':^7}")
print("-" * 40)
for a, b in itertools.product([True, False], repeat=2):
p1 = not (a and b)
p2 = (not a) or (not b)
print(f"{str(a)[0]:^3} {str(b)[0]:^3} {str(a and b)[0]:^4} {str(p1)[0]:^7} {str(not a)[0]:^3} {str(not b)[0]:^3} {str(p2)[0]:^7}")
assert p1 == p2 # 모든 케이스에서 동일
print("\n✅ 모든 행에서 동일 — 법칙 성립")실전 — 가독성 개선 5가지 사례
# 사례 1: 사용자 입력 검증
# Before
def is_invalid(email, password):
return not (email and password and '@' in email and len(password) >= 8)
# After (드모르간 적용)
def is_invalid(email, password):
return not email or not password or '@' not in email or len(password) < 8
# 더 좋게: 긍정문으로 (조기 반환)
def is_valid(email, password):
if not email:
return False
if not password:
return False
if '@' not in email:
return False
if len(password) < 8:
return False
return True
# 사례 2: 권한 체크
# Before — "관리자가 아니고 비공개 게시물도 아니면 표시"
if not is_admin and not is_private:
show_post()
# After — 드모르간으로 같은 의미
if not (is_admin or is_private):
show_post()
# 또는 긍정형으로
if can_show_to_public:
show_post()
# 사례 3: 조건 짧은 거 우선 평가 (성능)
# Before
if not is_cached(url) or not is_recent(url): # 두 번 모두 평가될 수 있음
# After — 드모르간 + 단축 평가 활용
if not (is_cached(url) and is_recent(url)): # is_cached 빠르면 미리 종료JavaScript — Lint가 추천하는 형태
// ESLint no-extra-parens, no-implicit-coercion 등이 자동으로 권장
// Before
if (!(user && user.isActive && user.role === 'admin')) {
return;
}
// After (드모르간 적용)
if (!user || !user.isActive || user.role !== 'admin') {
return;
}
// 더 좋게 — 옵셔널 체이닝 + nullish
if (user?.isActive !== true || user?.role !== 'admin') {
return;
}복잡한 조건의 단계별 변환
# 원본: 환불 거절 조건
# "주문 확인됨이 아니거나(예: 취소됨), 30일 초과거나, 환불 가능 상품이 아닌 경우 거절"
def cannot_refund_v1(order):
return not order.is_confirmed or order.days_since > 30 or not order.is_refundable
# 단계 1 — 드모르간으로 환불 가능 조건 도출 (긍정형)
def can_refund_v1(order):
return order.is_confirmed and order.days_since <= 30 and order.is_refundable
# 단계 2 — 더 명시적
def can_refund_v2(order):
if not order.is_confirmed:
return False, '주문 미확인'
if order.days_since > 30:
return False, '30일 초과'
if not order.is_refundable:
return False, '환불 불가 상품'
return True, '환불 가능'
# 호출
ok, reason = can_refund_v2(order)
if not ok:
print(f"환불 거절: {reason}")자동 변환 도구
// ESLint rule: no-negated-condition
// 부정 조건이 있을 때 긍정형으로 변환 권장
// ❌ no-negated-condition
if (!a) { return 1; } else { return 2; }
// ✅ 권장
if (a) { return 2; } else { return 1; }
// Prettier + ESLint 자동 수정
// .eslintrc.json:
// {
// "rules": {
// "no-negated-condition": "warn"
// }
// }다음 챕터
CH.12 "비트 연산" — 0과 1의 비트 단위 논리 연산 + 권한 플래그·색상 추출.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드의 부정형 조건문을 모두 찾아서 드모르간 적용 + 긍정형 변환 + 가독성 개선안을 만들어줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
한국 인기 오픈소스 코드의 드모르간 법칙 활용 사례 10개를 PR 단위로 분석해서 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스 전체에서 부정형 조건의 사용 패턴을 분석하고 ESLint no-negated-condition 적용 효과를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 모던 JavaScript에서 드모르간 법칙을 모르는 개발자가 자주 만드는 버그 사례를 솔직히 알려줘.
⭐ 이것만 기억하세요
드모르간 법칙: 조건문 리팩토링은 이 3가지만 확실히 잡으세요
1.드모르간 법칙은 부정과 AND/OR의 관계를 정의 — 복잡한 ¬(A∧B) 같은 표현을 단순한 ¬A∨¬B로 변환
2.실전에서는 부정형보다 긍정형 + 조기 반환 패턴이 가독성 최고 — 드모르간으로 시작점 제공
3.다음 챕터 CH.12에서 비트 연산 — 0과 1 단위의 AND/OR/XOR + 권한 플래그·색상 처리
공유하기
진행도 11 / 15