OPEN HYPER STEP
← 목록으로 (math)
MATH · 11 / 15
math
CHAPTER 11 / 15
읽기 약 2
FUNCTION

드모르간 법칙: 조건문 리팩토링


핵심 개념

!(A && B) === !A || !B — 부정 조건을 읽기 쉽게 변환하는 수학 법칙.

본문

드모르간 법칙 (De Morgan's Laws)

📋 코드 (2줄)
1. ¬(A ∧ B) = ¬A ∨ ¬B    — AND의 부정 = 각각의 부정의 OR
2. ¬(A ∨ B) = ¬A ∧ ¬B    — OR의 부정 = 각각의 부정의 AND

진리표로 증명

PYTHON📋 코드 (11줄)
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가지 사례

PYTHON📋 코드 (43줄)
# 사례 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가 추천하는 형태

JAVASCRIPT📋 코드 (16줄)
// 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;
}

복잡한 조건의 단계별 변환

PYTHON📋 코드 (27줄)
# 원본: 환불 거절 조건
# "주문 확인됨이 아니거나(예: 취소됨), 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}")

자동 변환 도구

JAVASCRIPT📋 코드 (17줄)
// 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