04. 네 번째 수업: 실수 수직선, 빈틈을 메우다 (Real Number Line)

유리수들($1/2$, $1/3$, $1/10000$ 등)만 있으면 수직선 위를 촘촘하게 뒤덮어 어떠한 빈 구멍도 없을 것이라 착각하기 쉽습니다. 하지만 놀랍게도 확대경을 대고 수직선을 들여다보면 무수히 많은, 눈에 보이지 않는 작은 바늘구멍들이 뚫려 있었습니다. 그 구멍의 원래 주인이 바로 $\sqrt{2}$나 $\pi$ 같은 무리수들이었습니다.


1. 유리수의 구멍

“어떤 두 개의 분수(유리수)를 가져오든 그 사이에는 항상 또 다른 분수가 무한히 존재한다.” 수학자들은 이 성질을 유리수의 조밀성(밀도가 높음)이라고 불렀습니다. 예를 들어 $0$ 과 $1$ 사이에는 무한한 개수의 분수들이 존재합니다. 그래서 얼핏 보면 수직선은 유리수들만으로 검게 칠해진 완벽한 직선 같아 보였습니다.

하지만, 히파소스가 증명했듯 대각선의 길이인 $\sqrt{2}$ (약 $1.414…$) 의 지점에는 어떠한 유리수 점도 찍을 수 없는 미지의 ‘구멍’이 존재했습니다! 오직 이 무리수(Irrational)를 그 자리에 박아 넣어야만 수직선의 그 미세한 틈이 메워지는 것이었습니다.

숭숭 구멍이 뚫려있는 빈약한 유리수의 수직선(1차원)에 무리수들이 스며들어와 마침내 완전하고 연속적인 실수의 황금빛 선형 우주를 완성하는 애니메이션 다이어그램

2. 드디어 등장한 진짜 우주: 실수 (Real Numbers)

수학자들은 몹시 불편하게 느껴졌던 그 무리수들을 마침내 수학의 가족으로 정식 포용하기로 결심합니다.

유리수와 무리수를 모두 한데 모아 우주의 점을 하나도 빠짐없이 완벽하게 덮는 수의 집합

이러한 수의 체계를 ‘실수(Real Numbers, 기호 $R$)’라고 명명했습니다. 진짜로 우리 현실 눈앞에 존재하는 모든 아날로그 1차원 선분을 한 치의 오차와 끊어짐 없이 나타내는 유일한 도구라는 뜻의 ‘Real’이 붙은 것이죠.

이제 실수라는 거대한 대륙이 탄생함으로써, 우리는 좌표평면($X$축, $Y$축) 위에 마음껏 부드러운 아날로그 곡선을 지연 없이 그릴 수 있는 완벽한 캔버스를 얻게 되었습니다.

3. 집합 관계로 보는 우주의 확장

인류의 숫자 깨달음은 우주의 팽창 과정과 같았습니다.

  1. 자연수 (Counting): 손가락으로 가리킬 수 있는 한정된 자원. ($1, 2, 3…$)
  2. 정수 (Whole): 0의 발견과 통장의 빚(-) 개념 등장. ($\dots -2, -1, 0, 1, 2\dots$)
  3. 유리수 (Rational): 강물을 공평하게 분배하고 물건을 나누는 비율 등장. ($a/b$)
  4. 무리수 (Irrational): 대각선, 원주율, 황금비율 같은 기하학적 난수 등장. ($\sqrt{2}, e, \pi$)
  5. 실수 (Real): 유리수($3$번)와 무리수($4$번)가 영혼 스왑을 하며 똘똘 뭉쳐 차원의 구멍을 완벽히 메워낸 완전체!

4. 파이썬과 타입 체계의 대응 (컴퓨터는 과연 Real할까?)

우리가 Python에서 데이터를 다룰 때 숫자의 타입을 검사하게 되는데, 재밌게도 컴퓨터 세계(메모리)에는 무한을 감당할 완벽한 ‘실수(Real)’ 타입은 존재하지 않습니다. 컴퓨터가 대신 제공하는 것은 앞서 배운 부동소수점(float)이라는 현실 타협형 도구입니다.

# [Python] 파이썬 메모리에 존재하는 숫자의 한계 (Real 흉내내기)
import math

item_counts = 5        # 자연수/정수 (int)
fraction_val = 1.0 / 3 # 유리수 기반 (float - 한계 도달)
root_val = math.sqrt(2)# 무리수 기반 (float - 한계 도달)

print(f"개수(정수): {item_counts} -> 파이썬 타입: {type(item_counts)}")
print(f"유리수(소수): {fraction_val} -> 파이썬 타입: {type(fraction_val)}")
print(f"무리수(소수): {root_val} -> 파이썬 타입: {type(root_val)}\n")

if type(fraction_val) == type(root_val):
    print("-> 파이썬은 유리수와 무리수 모두 'float' (부동소수점)이라는 하나의 바구니에 담아버립니다.")
    print("-> 컴퓨터에게 진정한 무리수(무한한 정확도)는 불가능하며, 모두 64비트 크기로 강제 반올림 된 유한 소수로 취급합니다!")

[실행 결과]

개수(정수): 5 -> 파이썬 타입: <class 'int'>
유리수(소수): 0.3333333333333333 -> 파이썬 타입: <class 'float'>
무리수(소수): 1.4142135623730951 -> 파이썬 타입: <class 'float'>

-> 파이썬은 유리수와 무리수 모두 'float' (부동소수점)이라는 하나의 바구니에 담아버립니다.
-> 컴퓨터에게 진정한 무리수(무한한 정확도)는 불가능하며, 모두 64비트 크기로 강제 반올림 된 유한 소수로 취급합니다!

이렇듯 실수의 세계는 수학이라는 완벽한 논리 우주에서만 존재하며, 코딩 기술이 그 이상향을 구현하려 노력하고 있다는 점을 프로그래머는 항상 가슴속에 새겨야 합니다!

서브목차