[파이썬 일기] #4.2.2 Numeric 자료형
Python 2009/04/22 23:12 |변수가 데이터를 담는 그릇이라면, 자료형은 이 그릇의 모양을 결정하는 거푸집과 같다고 할 수 있다. 오늘은 수치형 변수를 만드는 파이썬의 거푸집, Numeric 형에 대해 살펴보려 한다. 파이썬은 수치 자료형으로 정수(int), 부동소수형(float), 그리고 복소수형(complex)를 지원한다.
IDLE을 켜고 쉘에 아무 수나 입력해보자.
>>> 7
7
7을 입력했더니 7을 출력한다. 그럼 7을 변수에 담아보자. 그런데 변수는 어떻게 만들고, 어떻게 담을까?
먼저 변수에는 변수를 구분할 수 있는 이름이 있어야 한다. 파이썬 인터프리터는 각 변수(객체)를 identity로 구분하지만, 이것은 파이썬 인터프리터가 정하는 것이기 때문에 프로그래머는 이것으로 변수를 코드 내에서 구분할 수 있는 도리가 없다. identity는 프로그램을 실행할 때마다 달라질 것이기 때문이다. 변수의 이름은 프로그래머가 붙여야 한다. 알파벳, 밑줄(_), 그리고 숫자의 조합이면 아무것이나 괜찮다. 단, 숫자가 변수 이름의 첫 글자여서는 안 된다. 가령 abc123_과 _abc123은 정상적인 변수 이름이지만, 123abc_는 변수 이름으로는 사용할 수 없다.
다시 우리가 하던 얘기로 돌아와서, 7을 변수에 담아보자. 변수의 이름은 a로 하자.
>>> a = 7
>>> a
7
7을 a에 담았고, a를 다시 쉘에 입력했더니 IDLE이 a에 담겨져 있던 7을 출력했다. 파이썬에서는 변수를 선언할 때 프로그래머가 직접 자료형을 명시하지 않는다. 대신 파이썬 인터프리터가 값을 보고 필요한 자료형을 스스로 결정한다. 7은 양의 정수이기 때문에 파이썬 인터프리터는 마땅히 a를 int형으로 간주해야 한다. 정말 그렇게 할까? 내장 함수 type()을 이용해서 확인해보자.
>>> type(a)
<class 'int'>
A는 정수형이 맞는단다. 그런데 'int' 앞의 class는 무슨 의미일까? 아까 변수를 그릇, 자료형은 그릇을 만들 때 사용하는 거푸집이라고 했는데, 객체는 변수이고 클래스는 자료형이다. 이건 비유가 아니고 사실이 그렇다. 따라서 class 'int'라는 메시지는 말그대로 a의 자료형이 int 클래스라는 이야기다. 아, 그러고보니 파이썬의 객체를 처음 공부할 때 각 객체는 자료형, 값, 그리고 identity로 이루어진다고 했던 게 생각난다. 그럼 우리의 a도 identity가 있을 터, 한번 확인해보자. Identity를 알아내는 것은 id() 함수를 이용하면 된다.
>>> id(a)
505300216
희한한 숫자 값이 나왔다. 이 값에는 특별한 의미가 없다. 단지 파이썬 인터프리터가 a에게 붙여준 또 다른 이름일 뿐이다.
이번에는 몇 가지 계산을 해보자. 간단한 사칙 연산을 해보는 게 좋겠다. 뺄셈을 해보자. (혹시나 싶어서 한글로 변수 이름을 만들어 봤는데, 정상적으로 동작한다. 파이썬 매뉴얼을 다시 찾아보니 파이썬 3.0부터는 변수 이름에 알파벳 뿐 아니라 유니코드까지 사용할 수 있도록 한다고 되어 있다.)
>>> 형의나이=11
>>> 동생나이=8
>>> 형과_동생의_나이차 = 형의나이 – 동생나이
>>> 형과_동생의_나이차
3
뺄셈이 잘 동작한다. 이번엔 사칙연산을 한번에 해보자.
>>> a=3
>>> b=7
>>> c=(111-a)*b/11+2
>>> c
70.727272727272734
사칙 연산도 무리 없이 잘되는 것으로 보인다. 어, 그런데 c가 소수다. 혹시? 타입을 확인해보자.
>>> type(c)
<class 'float'>
c를 파이썬 인터프리터가 알아서 부동 소수형으로 만들었다. 정수끼리의 덧셈, 뺄셈, 곱셈은 계산 결과를 소수로 만들 일이 없다. c가 저 지경이 된 것은 나눗셈의 책임이다. 깨끗하게 나눗셈의 몫만 구할 수는 없을까? 또는 나머지만 구할 수는 없을까? 나눗셈의 몫을 구하는 것은 // 연산자, 나머지를 구하는 것은 % 연산자를 사용하면 된다. 다음은 그 예다.
>>> d = 3/7
>>> d
0.42857142857142855
>>> e = 3 // 7
>>> e
0
>>> f = 3 % 7
>>> f
3
파이썬은 친절하게 divmod()라는 함수를 지원해서 몫과 나머지를 동시에 구할 수 있도록 하고 있다. divmod() 함수는 몫과 나머지를 차례대로 튜플(tuple)에 넣는다. 튜플은 불변 객체로, 객체의 목록을 다룬다. 이 함수가 반환하는 튜플은 몫과 나머지를 원소로 가진다. 튜플은 나중에 차차 볼 기회가 있을 것 같으니 지금은 대충 이렇게 넘어가는 게 낫겠다. 지금은 Numerics에만 집중하자. 그래도 divmod() 함수는 한번 써보자.
>>> g = divmod(3, 7)
>>> type(g)
<class 'tuple'>
>>> g
(0, 3)
>>> g[0]
0
>>> g[1]
3
부동 소수형은 거의 대부분의 연산을 정수형과 공유한다. 그래서 특별히 노트해둘 것도 없다.
그런데 갑자기 궁금한게 생겼다. 부동소수형 3.00을 정수로 바꿀 수 있을까? 거푸집(자료형)의 모양에 따라 변수가 갖는 값이 한정되는 정적 형 언어(Static Typed Language)와는 달리 파이썬은 변수가 갖고 있는 값에 따라 거푸집의 모양을 결정짓는다. 그렇다면 아무리 3.00은 아무리 그릇을 바꿔 옮겨 담아도 영원히 부동 소수형으로 남을 수밖에 없다. 이런 상황을 위해 파이썬은 int() 함수를 제공한다. int() 함수 안에 매개 변수를 입력하면 그 결과로 정수를 얻을 수 있다. 이 때 주의할 점은 부동 소수형의 소수점 이하는 버려진다는 사실이다. 파이썬 쉘에서 테스트를 해보자.
>>> a = 3.00
>>> type(a)
<class 'float'>
>>> a = int(3.00)
>>> a
3
>>> type(a)
<class 'int'>
>>> a = int(3.7)
>>> a
3
복소수형은 별로 쓸 일이 없을 것 같지만, 지금 정리를 안 해두면 어쩌면 영원히 다시 만날 일이 없을 것 같다. 복소수는 실수와 허수로 이루어지는 수이며, 실수처럼 사칙 연산에 대해 닫혀 있다("닫혀 있다"라는 표현, 정말 오랜만에 써본다.). 따라서 파이썬의 정수와 부동 소수형에 대해 사용했던 사칙 연산들을 복소수형에 대해서도 그대로 사용할 수 있다. 복소수는 complex() 함수를 이용하여 만들며, 사용 예는 다음과 같다.
>>> a = complex(1, 3)
>>> a
(1+3j)
>>> type(a)
<class 'complex'>
>>> a.real
1.0
>>> a.imag
3.0
복소수도 Numeric의 하위 자료형임을 기억해야 한다. 실수부와 허수부로 이루어져 있다고 해서 실수부만 변경하거나 허수부만 변경하는 짓은 허용되지 않는다.
>>> a.real = 3
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
a.real = 3
AttributeError: readonly attribute
마지막 메시지를 보니 Attribute Error : readonly attribute란다. 파이썬에서 객체의 멤버 필드를 attribute라고 부르는 모양이다. 이렇게 해서 오늘은 정수형, 부동 소수형 그리고 잘 안 쓸 것 같은 복소수형까지 정리했다. 이제 수치 자료형만 공부했을 뿐인데 파이썬하고 벌써 많이 친해진 느낌이다(아마 이런 걸 두고 설레발이라고 하지?).
'Python' 카테고리의 다른 글
| [파이썬 일기] #4.2.3.1 문자열 (0) | 2009/04/30 |
|---|---|
| [파이썬 일기] #4.2.3 순서열(Sequence) (0) | 2009/04/28 |
| [파이썬 일기] #4.2.2 Numeric 자료형 (0) | 2009/04/22 |
| [파이썬 일기] #4.2.1 파이썬에는 상수가 없다! (0) | 2009/04/21 |
| [파이썬 일기] #4.2. 파이썬에서 데이터 다루기 (0) | 2009/04/20 |
| [파이썬 일기] #4.1. 파이썬에서 데이터 다루기 (0) | 2009/04/16 |

댓글을 달아 주세요