본문 바로가기
TIL (Today I Learned)/Python

[Python] Numeric types

by 둥굴프 2023. 4. 13.
파이썬에 대한 기본적인 이해를 위해 작성했습니다

 

c언어로 pintOS프로젝트를 할 당시를 떠올리면 변수를 선언할 때 자료형을 명시해야 했다.

하지만, 파이썬은 다르다.

심지어 이미 선언한 변수에 다른 자료형을 참조할 수 있다.

 

이번 포스팅에서는 파이썬이 어떻게 숫자를 다루는지 포스팅한다.

 

 

#1 int 객체?

c언어에서 우리는 숫자에 대한 자료형을 명시하기 위해서 해당 수를 표현하기 위한 바이트의 개수에 기준하여 자료형을 명시했다.

파이썬은 어떻게 작동하기에 이런 과정이 필요 없을까?

 

출처 : 라인 이모티콘

 

파이썬에서 모든 것은 '객체'라고 했다.

다른 언어에서는 해당 값 만을 저장하지만, 파이썬은 해당 값을 상태로 가지는 객체를 메모리에 저장한다.

이 과정에서 객체를 저장하기 위한 메모리 오버헤드가 발생한다.

 

int 객체는 가변 비트 수를 사용하고, 숫자가 커지면 정수 저장에 필요한 비트 수를 증가시킨다.

4 bytes (32 bits), 8 bytes (64 bits), 12 bytes (96 bits), 등 수가 증가해도 우리가 보기에는 똑같이 보인다.

 

이는 이론적으로 모든 정수 크기를 처리할 수 있는 가변 길이 데이터 유형이다.

이것은 정수의 특정 크기에 따라 가변적인 메모리 양을 차지한다.

import sys

sys.getsizeof(0) # Out : 24
# int 객체를 만들려면 24바이트의 오버헤드가 필요

sys.getsizeof(1) # Out : 28
# 여기에서 숫자 1을 저장하려면 24바이트 오버헤드 외에 4바이트(32비트)가 필요

sys.getsizeof(2**1000) # Out : 160
# 숫자가 클수록 더 많은 저장 공간이 필요

int 객체를 저장하기 위해서 최소 24바이트가 필요하다는 것을 확인할 수 있다.

 

파이썬의 int 객체는 기본적인 숫자 연산을 처리할 수 있다.

addition + , subtraction - , multiplication * , division / , exponents **

 

유의할 점은 연산 결과의 자료형이다.

division을 제외한 보든 연산 결과의 자료형은 int 객체이다.

하지만, division 연산 결과의 자료형은 float 객체이다.

 

3 / 4의 결과는 0.75 이기 때문에 명백히 부동 소수점 유형으로 반환될 것이다.

하지만, 10 / 2의 결과는 5인데 정수로 반환되나? 이 경우에도 부동 소수점 유형으로 반환된다.

# 정수의 더하기, 빼기, 곱하기 및 거듭제곱은 항상 정수
type(2 + 3) # int
type(3 - 10) # int
type(3 * 5) # int
type(3 ** 4) # int

# 그러나 표준 나눗셈 연산자 `/`는 항상 결과가 float
type(2 / 3) # float
type(10 / 2) # float

 

추가로 int 객체는 다음의 두 연산이 있다.

floor division (div) // , modulo (mod) %

몫과 나머지를 구하기 위한 연산이다.

n = d * (n // d) + (n % d)

n : 분자, d : 분모

 

floor division이 정확히 무엇인지 알기 위해서는 어떤 실수의 floor가 무엇인지에 대한 정의를 알아야 한다.

실수 a의 floor란 a보다 작거나 같은 가장 큰 수를 의미한다.

import math

# 음수가 아닌 값(>= 0)의 경우 값의 floor는 값의 정수 부분과 동일(잘림)
math.floor(3.15) # 3
math.floor(3.9999999) # 3

# 그러나 음수 값의 경우에는 그렇지 않다
math.floor(-3.15) # -4
math.floor(-3.0000001) # -4

floor division이란 a/b의 정수 부분이 아니라, a/b의 floor이다.

양수인 경우 정수 부분과 동일하지만, 음수의 경우 작거나 같은 가장 큰 수는 정수 부분이 아닐 수 있기 때문이다.

 

 

'TIL (Today I Learned) > Python' 카테고리의 다른 글

[Python] 변수와 메모리 (파이썬 최적화) #4  (0) 2023.04.11
[Python] 변수와 메모리 #3  (0) 2023.04.05
[Python] 변수와 메모리 #2  (0) 2023.04.03
[Python] 변수와 메모리 #1  (0) 2023.04.03
[Python] Classes  (0) 2023.04.02

댓글