파이썬에 대한 기본적인 이해를 위해 작성했습니다
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 |
댓글