파이썬 숫자 타입 – 파이썬 컴플리트 7

파이썬 숫자 타입

이 포스팅에서는 파이썬 숫자 타입에 대해서 알아보겠습니다.

프로그래밍에서 숫자는 가장 기본적이고 직관적인 요소입니다. 파이썬도 직관적인 언어이므로 숫자를 사용하는데 큰 어려움은 없을 것 입니다.

파이썬은 일반적인 숫자 타입과 숫자 리터럴과 표현식, 그리고 객체를 제공합니다. 파이썬에서 모든 것은 객체입니다. 숫자도 객체입니다.

숫자 리터럴 (literal)

숫자 객체를 생성하는 것은 숫자 리터럴입니다.

숫자형 객체에는 int, float, complex 타입 등이 있습니다. 정수와 부동소수점 수를 생성해보겠습니다.

1

print(1)

0.99

print(0.99)

숫자 리터럴이란 객체를 생성하는 표현식입니다. 스크립트에는 그냥 숫자를 쓰는 것 같지만 실제로는 객체가 생성됩니다.

# 리터럴로 숫자형 객체 생성
# 문법적으로 틀린 것이 아니다
1
0.99

print("[-------- int --------]")

print("정수 리터럴: (1)", 1)
print("정수 객체 타입: ", type(1))
print("정수 메소드 (1).__add__(1) : ", (1).__add__(1))

# 1 + 1 표현식은 (1).__add__(1) 를 호출
print("1 + 1 = ", 1 + 1)


print("[-------- float --------]")

print("부동소수점 리터럴: (0.99)", 0.99)
print("부동소수점 객체 타입: ", type(0.99))
print("부동소수점 메소드 (0.99).__add__(0.01) : ", (0.99).__add__(0.01))
# 0.99 + 0.01 표현식은 (0.99).__add__(0.01) 를 호출
print("0.99 + 0.01 = ", 0.99 + 0.01)

실행값은 다음과 같습니다. 숫자 리터럴이 객체이기 때문에 __add__() 와 같은 메소드를 사용할 수 있습니다. 파이썬의 정수는 크기제한이 없습니다. 큰 숫자도 메모리가 허락하는 한 사용할 수 있습니다.

[-------- int --------]
정수 리터럴: (1) 1
정수 객체 타입:  <class 'int'>
정수 메소드 (1).__add__(1) :  2
1 + 1 =  2
[-------- float --------]
부동소수점 리터럴: (0.99) 0.99
부동소수점 객체 타입:  <class 'float'>
부동소수점 메소드 (0.99).__add__(0.01) :  1.0
0.99 + 0.01 =  1.0

부동소수점 수는 아래와 같이 e를 사용해서 큰 숫자를 나타낼 수 있습니다.

print(3.14e-2)
print(4.0e+5)

[결과값]
0.0314
400000.0

복소수 객체도 j를 사용하여 나타낼 수 있습니다.

print(1 + 2j)
print(1.0 + 2.0j)
print(2j)

2진수는 0b 접두어로 8진수는 0o, 16진수는 0x 로 표현할 수 있습니다.

print(0b1000)
print(0o70)
print(0xFFFF)
[결과값]
8
56
65535

반대로 십진수를 2진수, 8진수, 16진수로 변환하는 내장함수도 있습니다.

print(bin(8))
print(oct(56))
print(hex(65535))
[결과값]
0b1000
0o70
0xffff

소수 처리의 문제

파이썬에서 소수(부동소수점 수)를 다루는 것은 값을 저장하는데 제한이 있습니다. 파이썬에서 소수를 다루는 근본적인 문제라고 볼 수 있습니다.

예를 들어 다음의 예제는 부정확한 연산 결과를 보여줍니다.

num = 0.1 + 0.1 + 0.1 - 0.2
print(num)

[실행결과]
0.10000000000000003

정확도를 요하는 프로그램에서는 decimal.Decimal 클래스를 사용할 수 있습니다.

from decimal import Decimal
num = Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
print(num)
print(type(num))

[실행결과]
0.0
<class 'decimal.Decimal'>

요약

파이썬의 핵심 타입은 정수, 부동 소수점 수, 복소수 정도 입니다. 그외에 정밀한 소수를 다루는 Decimal 타입, 분수의 Fraction 타입 등이 있고 Numpy 같은 숫자 클래스를 확장시키는 오픈소스 서드 파티의 도구도 사용할 수 있습니다. (pip 프로그램으로 설치할 수 있다)

파이썬은 동적 타이핑 언어입니다. C 계열의 변수의 타입을 선언하는 정적 타이핑 언어보다 빠르게 자신이 원하는 숫자 타입을 사용해서 프로그래밍 할 수 있기 때문에 컴퓨터 공학도는 물론 과학 분야에서 많이 사용되고 있습니다. 과학자들이 저술한 파이썬 책들도 많이 나와있습니다.

숫자를 사용하는 입장에서 특별한 것은 없고 파이썬에서 숫자는 객체라는 것에 주의합니다.

참고문서

numbers — Numeric abstract base classes — Python 3.10.0 documentation

Leave a Comment