본문 바로가기
Python/기초

[파이썬/Python] 정수(Integer) 1탄: 임의 정밀도

by 모두의 케빈 2023. 7. 3.

정수(Integer)의 정의와 임의 정밀도


 

파이썬에는 여러 데이터 유형(Type)이 있습니다. 그중, 정수(Integer) 형이란 소수점이 없는 0, 음수, 양수를 의미합니다. 파이썬은 객체 지향 언어이므로, 모든 개념을 객체로서 구현합니다. 따라서 파이썬에서 정수도 int라는 객체이자 class입니다. 

a = 5
print(type(a)) # <classs 'int'>

 

파이썬에서 정수는 C언어와 같은 고급 프로그래밍 언어와 다른 점이 있습니다. 그건 바로 크기의 제한입니다. 파이썬에서 정수는 크기의 제한이 없습니다. 메모리 공간이 허용하는 한도까지의 정수를 표현할 수 있습니다. 이게 무슨 말이냐, C언어와 비교하여 설명드리겠습니다.

 

C언어에서 int형은 [-2,147,483,648, 2,147,483,648] 사이의 정수를 표현할 수 있습니다. 그 이상 또는 이하의 값이 들어오면 값이 거꾸로 초기화됩니다. 이러한 현상을 오버 플로우(Over-Flow)라고 합니다.

그 이유는 int의 크기가 32비트(4바이트)이기 때문입니다. 그 이상의 값을 표현하려면 long int 자료형을 활용해야 합니다. long int는 64비트(8바이트)이기 때문에 더 큰 값의 정수를 표현할 수 있습니다. 이렇게 하면 작은 숫자에는 적은 메모리 공간을, 큰 숫자에는 큰 메모리 공간을 할당할 수 있다는 장점이 있습니다. 반면, 오버 플로우 발생 가능성과 코딩이 복잡해진다는 단점이 있습니다.

 

반면 파이썬에서 정수는 int형만 있을 뿐, long int형은 없습니다. (버전이 업그레이드되면서 변경됨) 다시 말해, 입력받는 정수가 아무리 크다고 하더라도 int형으로 모두 커버가 가능합니다. 이는 파이썬에서 정수가 임의 정밀도 방식을 채택하고 있기 때문입니다.

임의 정밀도정수를 숫자의 배열로 간주하고 자릿수 단위로 쪼개어 배열 형태로 표현함으로써 무제한 자릿수의 정수를 담을 수 있는 방식을 말합니다. 파이썬에서는 10진법을 2의 30승 진수로 변경하여 정수를 저장합니다. 진법 변환의 원리와 동일한데요. 10진법을 2진법으로 변환할 때 10 = 1*(2**3) + 1*(2**1)으로 표현하는 것처럼 10진법의 수를 (2**30)을 기준으로 표현한다는 의미입니다.

2의 30승 단위를 기준으로, 값이 커질 때마다 4비트씩 메모리를 더 할당하여 더해줌으로써 메모리가 허용하는 최대한의 정수를 표현할 수 있게 됩니다. 아래 코드는 변수의 크기를 값에 따라 확인해 보는 코드인데요. 2*30을 기준으로 4비트씩 크기가 커지는 것을 확인할 수 있습니다.

 

from sys import getsizeof

a = 2**29
print(getsizeof(a)) # 28bit

b = 2**30
print(getsizeof(b)) # 32bit

c = 2**59
print(getsizeof(c)) # 32bit

d = 2**60
print(getsizeof(d)) # 36bit

 

임의 정밀도 방식은 값이 일정 크기가 넘어가면 자동으로 메모리 공간을 더 할당해 주기 때문에 오버 플로우를 방지할 수 있고 사용자 편의성 위주의 코딩이 가능하다는 장점이 있습니다. 반면 변환 과정이 있기 때문에 속도 측면에서 굉장히 불리하다고 할 수 있습니다.

 

다음 시간에는 파이썬 정수형의 메모리 할당 방식에 대해 이어서 공부해 보도록 하겠습니다.

댓글