2. 숫자들의 가계도 (numbers)
우리가 매일 쓰는 1, 3.14 같은 단순한 숫자들도 파이썬 내부에서는 아주 거대한 족보(추상 클래스 체계)를 가지고 있습니다. 파이썬의 numbers 모듈을 들여다보면 수학의 수 체계가 그대로 코드로 구현되어 있습니다.
2.1 숫자의 가장 큰 조상, Number
모든 숫자의 단군 할아버지(?) 격인 추상 클래스는 Number입니다. 정수(int), 실수(float), 복소수(complex) 등 파이썬 내의 모든 숫자 자료형은 결국 이 Number 소속입니다.
import numbers
# 정수 10은 Number의 후손이 맞을까?
print(isinstance(10, numbers.Number)) # True
# 3.14 (실수)도 Number의 후손일까?
print(isinstance(3.14, numbers.Number)) # True
2.2 구체적인 숫자 계급표
numbers 모듈 안에는 점차 구체화되는 4단계의 숫자 추상 클래스 계급이 있습니다.
Number(수): 가장 큰 범주 (더하기, 빼기 등을 포괄적 정의)Complex(복소수): 내장complex타입과 연관 (실수부, 허수부 등)Real(실수): 내장float타입과 연관Rational(유리수): 분수 표기가 가능한 숫자 (예:fractions.Fraction)Integral(정수): 내장int타입과 연관
(아래로 내려갈수록 상위 클래스의 성질을 물려받아 더 좁은 범위의 숫자가 됩니다.)
import numbers
import fractions
# int(정수)는 Integral(정수 추상 클래스)의 자식입니다.
print(issubclass(int, numbers.Integral)) # True
# 분수(Fraction)는 실수(Real)의 자식입니다.
print(issubclass(fractions.Fraction, numbers.Real)) # True
파이썬의 내장 함수나 연산자들은 내부적으로 숫자가 들어올 때 “아, 이 녀석이 Real 추상 클래스의 규격을 만족하는 (즉, 더하고 뺄 수 있는) 진짜 숫자가 맞구나!”라고 판단하여 똑똑하게 계산을 처리합니다.
서브목차