2. 숫자 자료형의 특징과 형 변환
파이썬에서 숫자(Number)는 단일한 값을 유지하는 원자형(Atomic) 데이터 구조이며, 한 번 메모리에 적재되면 그 값이 절대로 변하지 않는 ‘불변(Immutable)’ 객체이기도 합니다.
2.1 숫자별 메모리 참조(Reference) 규칙
파이썬이 메모리를 최적화해서 다룰 때 작은 정수들은 매번 객체를 새로 만들지 않고 하나의 동일한 객체 주소를 여러 변수가 돌려씁니다. 이를 확인하기 위해 메모리 위치가 완벽히 동일한지 판별하는 is 연산자와, 단순 ‘값’만 동일한지 비교하는 == 연산자의 차이를 비교해 볼 수 있습니다.
# 1. 작은 정수 (메모리 재사용 O)
a = 10
b = 10
print(a is b) # True (동일한 객체 공간을 가리킴)
# 2. 큰 정수 (메모리 재사용 X -> 별도 객체 생성)
c = 1000
d = 1000
print(c is d) # False (다른 객체 공간)
print(c == d) # True (하지만 값은 동일함)
[!WARNING] 위와 같은 특성 때문에, 단순히 두 정수 데이터가 내부적으로 동일한지를 비교할 목적이라면 절대
is연산자를 쓰지 말고 언제나==연산자를 사용해야 안전합니다.
2.2 숫자 형 변환 (Type Conversion)
데이터 분석이나 연산을 하다 보면 실수(Float)를 정수(Int)로 전환하거나 그 반대의 과정을 거쳐야 할 때가 흔합니다. 이 형 변환 규칙 속에도 “불변 객체”라는 비밀이 숨어있습니다. 파이썬은 기존 숫자의 형태를 뜯어고치는 것이 아니라, 변환된 값을 가진 온전히 새로운 숫자 객체를 창조해 반환합니다.
정수, 실수, 복소수 변환
단순히 원하는 자료형의 클래스 이름(int(), float(), complex())으로 다른 데이터를 감싸주기만 하면 됩니다.
# 실수 -> 정수 (소수점 이하 버림 발생)
f_val = 100.99
i_val = int(f_val)
print(i_val) # 100
# 정수 -> 복소수
c_val = complex(i_val)
print(c_val) # (100+0j)
문자열(String)을 숫자로 치환
웹 폼에서 입력된 나이(Age) 데이터나 파일에서 읽어 들인 텍스트 수치는 기본적으로 ‘문자열’ 포맷을 갖습니다. 연산을 하려면 이를 정수로 전환해야 하는데, 만약 문자열 안에 소수점이 포함되어 있다면 반드시 실수를 먼저 거쳐야만 에러를 피할 수 있습니다.
# 1. 문자열을 즉시 정수로 (성공)
print(int("100"))
# 2. 소수점이 찍힌 문자열을 즉시 정수로 (실패)
# print(int("100.11")) -> ValueError 예외 발생!
# 3. 소수점 문자열 -> 실수 -> 정수 (성공)
print(int(float("100.11"))) # 100
2.3 진법 변환 함수 (기수 변환)
파이썬의 가장 강력한 장점 중 하나로, 십진수를 즉각적으로 이진수(Binary), 8진수(Octal), 16진수(Hexadecimal)로 자유자재로 다룰 수 있는 내장 함수를 제공합니다. 단, 변환된 결과물은 텍스트(문자열) 타입으로 반환된다는 점을 주의하세요.
x = 100
# 2진 변환 (Binary)
print(bin(x)) # "0b1100100" (문자열 반환)
# 8진 변환 (Octal)
print(oct(x)) # "0o144"
# 16진 변환 (Hexadecimal)
print(hex(x)) # "0x64"
# 다시 10진수로 복귀하려면 base 매개변수 명기
print(int(bin(x), 2)) # 다시 100 정수로 복원
2.4 파이썬 숫자의 무제한 범위 스펙
타 프로그래밍 언어들은 int 의 범위를 32bit나 64bit로 제한하여 이 한계를 넘는 숫자를 계산하면 오버플로(Overflow) 결함이 터집니다. 반면 파이썬의 정수형(int) 자료형은 크기에 제한이 없습니다. (메모리가 부족해질 때까지 확장됩니다).
# 매우 큰 수(10의 3000제곱)도 거뜬히 연산하고 보관합니다.
huge_number = 10 ** 3000
print(type(huge_number)) # <class 'int'>
단, 기하급수적으로 소수점 아래를 표현하는 실수(float)는 물리적인 한계가 정의되어 있으며, 이 상한을 벗어나면 시스템에서 OverflowError: math range error 가 발생합니다.