2. 치명적인 버그의 흔적: 불연속점의 3가지 유형

[도입부] 학습 목표 (Learning Objectives)

  • 완벽하게 세팅된 수학 모듈 안에서 함수가 갑작스럽게 붕괴(Crash)하는 원인인 불연속(Discontinuity) 버그의 3대 대장(제거 가능, 도약, 무한) 패턴을 시각적으로 체화합니다.
  • 점 하나가 빠진 단순 ‘빈 구멍(Hole)’과, 지각 변동이 일어난 듯한 ‘단층(Jump)’이 물리 엔진과 데이터 처리에서 어떤 치명적인 오류를 반환하는지 차이점을 분석합니다.
  • 파이썬(Python)의 matplotlib 렌더링 툴로, 수식으로는 안 보이는 이 3가지 끔찍한 절단면들을 2D 그래픽 캔버스 위에 강제로 띄워 스캐닝합니다.

1. 매트릭스 붕괴의 3가지 버그 패턴

앞장에서는 $\lim_{x \to a} f(x) = f(a)$ 라는 완벽한 스킨십(연속)에 대해 배웠습니다. 그렇다면 함수가 끊어지는 에러(불연속)가 터졌다면, 대체 저 3개의 부품 중 어디가 폭발한 것일까요? 수학계는 이 폭발물들을 크게 3가지 랭크로 분류합니다.

제거 가능 불연속(구멍), 도약 불연속(단층), 무한 불연속(폭주) 등 3가지 버그 형태를 보여주는 SVG


🚨 1번 버그: 구멍 뚫림 (제거 가능 불연속, Removable)

  • 증상: $\lim f(x)$ 좌우 레일은 예쁘게 한 점을 향해 만납니다. 그런데 정작 도착 지점에 나사(함숫값)가 빠져 텅 빈 ‘구멍(Hole)’이 나 있거나, 나사가 저기 엉뚱한 하늘 위에 박혀있는 경우입니다.
  • 해결책 (패치): 구멍 자리에 스멘트(올바른 함숫값)만 딱 부어 넣어주면 바로 정상(연속) 으로 복구되므로 ‘제거 가능한 불연속’ 이라고 부릅니다.

🚨 2번 버그: 지진 단층 (도약 불연속, Jump)

  • 증상: x좌표 하나를 기준으로, 왼쪽에서 달려오는 레일 높이(좌극한)와 오른쪽에서 달려오는 레일 높이(우극한)가 아예 다릅니다. 지진이 나서 땅이 완전히 엇갈려버린 격입니다.
  • 원인 판독: 애초에 왼쪽, 오른쪽 함의점이 다르므로 통합 ‘극한값($\lim$)’ 자체가 폭발(존재하지 않음)해버린 치명적인 버그입니다. 절댓값 그래프나 가우스(버림) 함수에서 자주 창궐합니다.

🚨 3번 버그: 우주 폭주 (무한 불연속, Infinite)

  • 증상: 함수가 가다가 갑자기 블랙홀을 만난 듯 분모가 0이 되어버려 +무한대($\infty$)나 -무한대($-\infty$)로 천장을 뚫고 가버리는 최악의 크래시 상태입니다.
  • 예시: $y = \frac{1}{x}$ 에서 $x=0$ 일 때의 상태입니다.

2. 💻 파이썬(Python) 불연속 지진 감지 시뮬레이터

위에서 설명한 3대 버그 몬스터가 파이썬 코드로 실제 좌표평면 그래프 상에서 어떻게 소름 돋게 그려지는지 수치를 대입하여 콘솔로 확인합니다.

🐍 파이썬 예제: 좌극한과 우극한의 단층(Jump) 에러 스캔 프로토콜

파이썬의 수학 엔진을 켜서 유명한 도약 불연속 함수인 $y = \frac{ x }{x}$ (명칭: Signum 함수)가 $x=0$ 에서 어떤 극악무도한 짓을 벌이는지 털어봅시다!
import sympy as sp

print("--- ⚡️ 불연속체 붕괴 지점 단층 스캐너 가동 ---")

x = sp.symbols('x')
# 절댓값이 씌워진 괴랄한 함수 (x=0 에서 터질 운명)
bug_function = sp.Abs(x) / x

print(f"[SYSTEM] 타겟 함수가 도마 위에 올라왔습니다: f(x) = |x| / x")
print(f"[SYSTEM] 의심되는 크래시 좌표: x = 0 (분모가 0이 되는 지점)")

# 1. 오른쪽 레일(우극한) 진단: 우측(+)에서 x=0으로 접근
right_limit = sp.limit(bug_function, x, 0, dir='+')

# 2. 왼쪽 레일(좌극한) 진단: 좌측(-)에서 x=0으로 접근
left_limit = sp.limit(bug_function, x, 0, dir='-')

print("-" * 50)
print("📡 [단층 분석 결과 렌더링]")
print(f" 👉 우측 방어 레일의 접근 높이(좌표): y = {right_limit}")
print(f" 👉 좌측 방어 레일의 접근 높이(좌표): y = {left_limit}")

if right_limit != left_limit:
    gap = abs(right_limit - left_limit)
    print(f"\n🚨 [CRITICAL ERROR] 두 레일이 물리적으로 연결되지 않습니다!!")
    print(f" 👉 도약(Jump) 불연속 확정! 지진 단층 격차 크기: {gap} 픽셀")
    print(" 👉 따라서 이 맵에서는 캐릭터가 x=0 지점을 걸어서 통과할 수 없습니다.")

# 결과창:
# --- ⚡️ 불연속체 붕괴 지점 단층 스캐너 가동 ---
# [SYSTEM] 타겟 함수가 도마 위에 올라왔습니다: f(x) = |x| / x
# [SYSTEM] 의심되는 크래시 좌표: x = 0 (분모가 0이 되는 지점)
# --------------------------------------------------
# 📡 [단층 분석 결과 렌더링]
#  👉 우측 방어 레일의 접근 높이(좌표): y = 1
#  👉 좌측 방어 레일의 접근 높이(좌표): y = -1
# 
# 🚨 [CRITICAL ERROR] 두 레일이 물리적으로 연결되지 않습니다!!
#  👉 도약(Jump) 불연속 확정! 지진 단층 격차 크기: 2 픽셀
#  👉 따라서 이 맵에서는 캐릭터가 x=0 지점을 걸어서 통과할 수 없습니다.

오른쪽 극한은 $y=1$ 로 매끄럽게 오다가, 갑자기 x=0 지점을 기점으로 왼쪽극한은 $y=-1$ 이 튀어나와 버립니다. 높이 2픽셀의 건널 수 없는 낭떠러지(Jump Discontinuity)가 발생한 것입니다. 컴퓨터 공학에서는 분모 분기점 에러를 항상 이렇게 좌극한과 우극한 분리 스캔(if-else 문)으로 방어해야 합니다.


[결론] 학습 정리 (Summary)

  1. 버그의 3대장: 단순히 “함수가 끊어졌다” 로 끝나지 않고, 나사가 빠진 ‘구멍 뚫림’, 지진이 난 ‘도약 단층’, 천장을 찢고 올라간 ‘무한 폭주’ 이렇게 3가지 질병 원인으로 분쇄해 분석할 수 있어야 합니다.
  2. 복구 가능성 (구멍 뚫림): 좌우 극한 높이가 완벽히 밸런스를 이룬 채 구멍만 뚫려있다면, 프로그래머(수학자)가 그 구멍 좌표에만 강제로 함숫값을 코딩(if x==a: y=...)해 줌으로써 연속 함수로 부활 시킬 수 있습니다.
  3. 극한 폭발 (단층과 폭주): 좌우 레일이 엇갈리거나(Jump) 분모가 0으로 폭주(Infinite)하는 경우는 애초에 극한값($\lim$) 자체가 부정/불능이 떠버리므로, 단 한 점을 수정하는 패치로는 절대 연결시킬 수 없는 강력한 불연속의 상태입니다.
서브목차