3.1.5.1 수의 체계와 기수법: 인간 10진법 vs 컴퓨터 2진법
학습목표
원시시대 뼛조각부터 시작된 인류의 수 체계를 이해하고, 우리가 사용하는 10진수 자연수가 어떻게 파이썬 내부에서 컴퓨터의 2진수 전기 신호로 번역되는지 파악합니다. 수의 확장 개념을 통해 파이썬이 데이터를 다루는 그릇(Data Types)의 본질을 깨닫습니다.
📥 수의 체계 실습용 노트북 다운로드 및 실행:
- 로컬 환경용 다운로드 (VS Code 등에서 실행)
(웹 브라우저에서 바로 실습)
1. 수(Number)의 확장과 파이썬의 데이터 타입
수학에서 수의 체계는 자연수 $\rightarrow$ 정수 $\rightarrow$ 유리수 $\rightarrow$ 실수 $\rightarrow$ 복소수로 확장되어 왔습니다. 인류가 세상을 더 정밀하게 표현하기 위해 새로운 종류의 숫자를 ‘발명’할 때마다, 수직선의 빈틈이 메워지고 나아가 2차원 평면으로 차원이 확장되었습니다.
파이썬 역시 현실의 수학적 모델링을 완벽히 모방하기 위해 이 수의 체계를 각각의 전용 데이터 타입(Data Type) 클래스로 구현해 두었습니다.
(다이어그램: 자연수에서 출발하여 복소수까지 이어지는 수 체계의 확장 과정과, 이를 파이썬에서
int, float, complex라는 그릇에 담아내는 일대일 맵핑 관계를 보여줍니다.)
2. 기수법 (Numeral Systems): 인류의 언어에서 컴퓨터의 언어로
(웹툰 비유: 손가락 10개로 10진법 기수법을 만든 원시 인류와, 스위치의 켜짐(1)/꺼짐(0) 2진법으로 우주를 시뮬레이션하는 현대 컴퓨터 두뇌의 극적인 대비)
우리는 어릴 때부터 양손의 손가락 10개를 접어가며 $1, 2, 3…$ 을 세었습니다. 숫자 10개가 꽉 차면 다음 자릿수로 하나 올려주는 이 방식을 10진법 위치 기수법 (Base 10 Positional Notation)이라고 합니다. 이것은 인류 역사상 최고의 발명 중 하나입니다.
하지만 스마트폰과 AI 서버를 구성하는 실리콘 반도체 칩은 인간의 수학을 전혀 모릅니다. 컴퓨터의 세상에는 단지 전기가 흐른다(1, On)와 흐르지 않는다(0, Off)라는 2개의 기호만이 존재합니다. 이를 2진법 (Binary System, Base 2)이라고 합니다.
파이썬은 우리가 입력한 10진수 텍스트를 내부적으로 즉시 컴퓨터가 이해할 수 있는 2진법 메모리 스위치 신호로 치환하여 처리합니다.
💡 스토리텔링: 0과 1은 물리적으로 어떻게 저장될까?
눈에 보이지 않는 숫자인 0과 1 쪼가리들이 모여 어떻게 우리가 보는 유튜브 영상이나 거대한 파이썬 인공지능 모델이 될 지 상상해 봅시다. 컴퓨터가 사용하는 2진법은 역사적으로 인간의 노동에서 시작하여 다음과 같은 4단계의 눈부신 하드웨어적 진화를 거치며 세상을 지배했습니다.
1단계: 최초의 기억, 거대한 물리적 스위치 (Switch)
(웹툰 비유: 땀을 뻘뻘 흘리며 거대한 기계식 스위치 손잡이를 당겨서 간신히 전구에 불을 켜는 초기 프로그래머의 고된 모습)
인류 최초의 컴퓨터라 불리는 에니악(ENIAC) 시절, 프로그래머들은 모니터나 키보드 없이 일했습니다. 그들은 1 더하기 1을 계산하기 위해 벽면 가득 채워진 수만 개의 물리적인 진공 튜브 스위치들을 직접 손으로 끄고(0) 켜며(1) 계산을 지시했습니다. 계산이 끝난 후 방에서 나오면 땀범벅이 되었고 불도 자주 났습니다. 인간의 노동으로 컴퓨터의 2진법 스위치가 구동되던 가장 원초적인 시대였습니다.
2단계: 전기가 조종하는 스위치, 트랜지스터 (Transistor)
(웹툰 비유: 사람 손 없이, 번쩍 하는 전기 자극만 주어지면 마법처럼 다리가 스스로 이어지며 전류가 흐르는 차세대 마법 스위치의 등장)
손으로 스위치를 누르다 못해 지친 천재들은 획기적인 발명품을 내놓습니다. 물리적인 힘(손) 없이, 그저 한쪽으로 전기가 흐르면(자극) 알아서 다른 쪽 스위치 문을 열어버리는 마법의 부품, 트랜지스터입니다. 모래(규소)에서 깎아 만든 이 미세한 반도체 조각 하나하나가 사람 손가락을 완벽히 대체하여, 눈에 보이지 않게 스스로 전기를 켜고 끄며 $1$비트(Bit)를 물리적으로 표기하는 컴퓨터의 새로운 심장이 되었습니다.
3단계: 시간의 모래시계 회로, 플립플롭 (Flip-Flop)
(웹툰 비유: 숫자 ‘1’이 무한히 맴도는 트랙(회로)에 갇혀, 영원히 ‘1’이라는 형태를 유지하며 빛을 내뿜는 기억의 다람쥐 쳇바퀴)
스위치를 자동으로 켜고 끄는 기술만으로는 데이터를 ‘저장’할 수 없었습니다. 전원이 꺼지면 모든 게 사라지니까요. 과학자들은 트랜지스터들을 비비 꼬아서 미로(논리 회로 게이트)를 만들었습니다. 전기가 들어와 빙글빙글 무한히 돌면서 나가지 못하는 쳇바퀴 구조를 만들면, 그 전기는 계속 살아있는 채로 그 자리에 머뭅니다. 이것이 바로 플립플롭(Flip-Flop) 회로입니다. 전기가 끊기지 않는 이상 스스로 $0$과 $1$의 상태를 일정 시간 머금고 ‘기억’할 수 있게 된 혁명적인 발명이자, 우리가 컴퓨터를 켤 때 사용하는 메모리(RAM) 반도체의 진짜 근간입니다.
4단계: 8개의 꼬마전구가 뭉쳤다, 바이트 (Byte)의 완성
(웹툰 비유: 8마리의 1비트 전구 요정들이 한 줄 횡대로 도열하여 어깨동무를 하자, 마침내 $2^8 = 256$가지를 표현할 수 있는 거대한 1바이트 팩토리가 건설되는 장면)
하지만 플립플롭 하나(1비트)가 내는 $0$ 아니면 $1$이라는 두 가지 목소리로는 십진수 $3$조차도 표현할 수 없었습니다. 그래서 컴퓨터 과학자들은 마치 보따리 장수처럼 이 $1$비트(Bit) 전구 8개를 한 줄로 묶어 포장하기로 약속했습니다. 스위치($0$과 $1$)가 8배로 뻥튀기 된 이 거대한 다발이 바로 $1$바이트(Byte)입니다.
\[2^8 = 256\]1바이트는 무려 256가지의 고유한 그림자(상태)를 표현할 수 있게 되었습니다. 비로소 이 바이트 보따리들을 수십, 수천 개씩 위로 착착 쌓아 올리자 영어 알파벳(아스키코드)을 표현하고 파이썬의 무한대 정수(Integers)와 우주 공간을 가로지르는 실수(Floats) 같은 모든 복잡한 고차원 데이터 타입 객체들을 화려하게 빚어낼 수 있게 된 것입니다.
파이썬에서의 진법 치환 실습
파이썬은 데이터 과학자와 프로그래머가 진법 시스템을 자유자재로 넘나들 수 있도록 내장형 함수들을 강력하게 지원합니다. 가장 대표적으로 사용되는 4가지 진범(10진수, 2진수, 8진수, 16진수)을 완벽하게 변환하고 다시 복원하는 과정을 실습해 봅시다.
(다이어그램:
255라는 물리적 전구 크기는 동일하지만, 각 진법 그릇(10, 2, 8, 16)에 담을 때마다 0b, 0o, 0x 등 고유의 파이썬 접두사가 붙으며 모양이 변하는 원리)
1) 10진수 $\rightarrow$ 다른 진수로 변환 (문자열 반환)
컴퓨터가 사용하는 진법의 형태를 시각적으로 확인하기 위해 파이썬은 변환 결과를 문자열(str)로 돌려줍니다. 이때 어떤 진법인지 구분하기 위해 숫자 앞에 특별한 접두사(Prefix)가 붙습니다.
bin(): 2진수 (Binary). 접두사0boct(): 8진수 (Octal). 접두사0ohex(): 16진수 (Hexadecimal). 접두사0x(16진수는 0~9까지 숫자를 쓰고 10~15는 A~F 알파벳을 씁니다. 메모리 주소나 색상 코드 표기에 가장 널리 쓰입니다.)
# 기준이 되는 인간의 숫자(10진법)
human_number = 255
print(f"--- 10진수 {human_number} 변환 ---")
# 컴퓨터 물리적 전기 신호 (2진법)
computer_binary = bin(human_number)
print(f"2진수 변환 (bin): {computer_binary} # 11111111")
# 유닉스 권한 설정에 많이 쓰이는 8진법
computer_octal = oct(human_number)
print(f"8진수 변환 (oct): {computer_octal} # 377")
# 컴퓨터 메모리 주소와 웹 색상코드(RGB)에 쓰이는 16진법
computer_hex = hex(human_number)
print(f"16진수 변환 (hex): {computer_hex} # ff")
2) 다른 진법의 문자열 $\rightarrow$ 10진수로 완벽 복원
서버나 외부 장치에서 ‘0b1010’ 같은 텍스트 형태의 진수 데이터를 전달받았을 때, 파이썬의 int(문자열, 진법종류) 함수를 사용하면 우리가 계산할 수 있는 깔끔한 10진수 고유 모델(정수 객체)로 복원됩니다.
print("\n--- 파이썬 객체로 완벽 복원 (int) ---")
# 첫번째 인자는 텍스트, 두번째 인자는 '현재 데이터의 진법'
val_2 = int('1010', 2)
val_8 = int('12', 8)
val_16 = int('A', 16)
print(f"2진수 '1010'의 10진수 정체: {val_2}")
print(f"8진수 '12'의 10진수 정체: {val_8}")
print(f"16진수 'A'의 10진수 정체: {val_16}")
전체 출력 결과:
--- 10진수 255 변환 ---
2진수 변환 (bin): 0b11111111 # 11111111
8진수 변환 (oct): 0o377 # 377
16진수 변환 (hex): 0xff # ff
--- 파이썬 객체로 완벽 복원 (int) ---
2진수 '1010'의 10진수 정체: 10
8진수 '12'의 10진수 정체: 10
16진수 'A'의 10진수 정체: 10
3. 요약: 데이터 분석에서의 숫자형 분류
파이썬 데이터 분석 생태계(Pandas, Numpy 등)에서는 크게 세 가지의 숫자 파트가 존재함을 명심해야 합니다.
| 분류명 | 파이썬 타입 | 수학적 의미 | 프로그래밍 용도 |
|---|---|---|---|
| 정수형 | int |
$Z$ (자연수, 0, 음수) | 개수 세기, 인덱스 추적, 오차가 없어야 하는 금융 원장 |
| 실수형 | float |
$R$ (유리수, 무리수) | 비율, 평균, 기하학적 길이, 머신러닝의 가중치(Weights) |
| 복소수형 | complex |
$C$ (실수부 + 허수부) | 푸리에 변환, 양자 시뮬레이션, 전자기파 모델링 |
다음 장에서는 가장 기본이 되며, 오차가 존재하지 않는 무한한 팽창력을 가진 파이썬의 정수(int) 체계에 대해 깊게 들어갑니다.