Media Log

1. 자료형(Data Type)은 무엇인가?


이번 편에서는 자료형(Data Type)에 대해서 알아보도록 하겠습니다. 자료형은 말 그대로, 데이터의 형식을 말합니다. 파이썬에서는 수치 자료형부터 시작해서 문자 자료형, 튜플, 리스트, 사전 등 여러가지의 자료형이 존재하며, 자료형을 보고서 데이터가 어떠한 데이터의 형식인지 알 수 있습니다. 파이썬에 내장되어 있는 함수인 type이란 함수를 통해서 객체의 타입을 살펴보도록 하겠습니다. 이 type이란 함수는 객체의 타입을 보여주며, 아래와 같이 사용합니다.

>>> type(33)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type(['1', '2', '3'])
<class 'list'>
>>> type(33331491491492)
<class 'int'>

위를 보시면 객체 33의 타입은 int로, 이는 정수(integer)를 의미합니다. 객체 3.14는 float이므로 실수(float)를 의미합니다. 그 아래에 있는 대괄호로 감싸진 녀석은 리스트라는 녀석인데, 이 리스트란 개념은 좀 더 뒤에가서 설명합니다. 아직은 이것이 무엇인지 아실 필요는 없습니다. 수치 자료형, 문자 자료형, 리스트, 튜플, 사전 이런 식으로 차례대로 설명을 할 계획이며, 우선은 숫자를 나타내는 수치 자료형(Numeric Data Type)에 대해서 알아보도록 합시다.


2. 정수(Integer)


위에서 말한대로 파이썬에서 등장하는 int라는 녀석은 정수(Integer)의 약자입니다. 아래에 변수에 대입이 되는 객체들은 모두 정수형 객체이며, 그 중에서도 가장 많이 쓰이는 10진수의 예입니다.

>>> A = 5
>>> B = 10
>>> print(A, B)
5 10

정수를 10진수가 아닌 2진수, 8진수, 16진수로 인식하게 하고 싶으면 정수 앞에 각각 '0b', '0o', '0x'를 붙이시면 됩니다. 아래와 같이 말입니다.

>>> print(0b10, 0o10, 0x10)
2 8 16

위에서 b는 2진수(binary), o는 8진수(octal), x는 16진수(hexadecimal)라는 의미입니다. 반대로 10진수를 각각 2진수, 8진수, 16진수의 형태로 변환하려면 bin, oct, hex 함수를 사용하시면 됩니다.

>>> bin(202020)
'0b110001010100100100'
>>> oct(20114)
'0o47222'
>>> hex(401000)
'0x61e68'

여기서 주의하셔야 할 부분은, 위에 보시면 출력되는 결과가 정수가 아니라 문자열이라는 것입니다. 즉, 'hex(40) - 20'과 같은 연산에서 hex(40)이 내보내는 결과는 문자열(string), 20은 정수(integer)이니 타입이 맞지 않아 서로 연산을 하지 못합니다. 문자열에 대해서는 다음 편인 문자열 강좌에서 다루니 궁금하신 분은 미리 살펴보고 오셔도 괜찮습니다. 


3. 실수(Float)


파이썬에서 등장하는 float라는 녀석은 부동 소수점(Floating point)의 약자이며, 부동 소수점이란 정수처럼 소숫점이 고정되어 있는게 아니라 부동이란 의미 그대로 고정되어 있지 않고 움직인다는 말입니다. 이 방식은 컴퓨터에서 실수를 표현하는 방식이며, 소숫점의 위치를 나타내는 수를 따로 기록합니다. 앞으로 float라는 단어가 나오면, 이는 부동 소수점이 아니라 실수라는 의미로 설명하도록 하겠습니다. 아래의 예제에서 변수에 대입되는 객체는 모두 실수 형태의 객체라고 말할 수 있습니다.

>>> A = 3.14
>>> B = 5.1402020319
>>> print(A, B)
3.14 5.1402020319

위처럼 실수를 표현하는 방식도 있겠지만, 다른 방식으로는 지수 표기법이라는 것으로 아래와 같이 실수를 표현하는 방식이 존재합니다.

>>> 0.23193202032E8
23193202.032
>>> 1412232.22E-10
0.000141223222

위 코드에서 E는 지수(Exponent)라는 의미이며, 대문자가 아니더라도 소문자 역시 똑같은 의미로 사용됩니다. 위의 예제에서 0.23193202032E8는 0.23193202032 * 10^8이라고 보시면 됩니다. 여기서 10^n은 10의 n승이라는 것입니다. 즉, 0.23193202032 곱하기 10의 8승은 23193202.032라는 값을 지니고, 1412232.22E-10에서는 10^-10이니 이것은 1412232.22 곱하기 10의 마이너스 10승을 의미하며, 0.000141223222라는 값을 가집니다. 한가지 주의하실 부분이 있는데, 한번 아래의 예제를 살펴보도록 합시다.

>>> 5.4 + 1.2
6.6000000000000005
>>> 1.4 - 1.1
0.2999999999999998

우리가 예상하기에는 위의 예제의 결과가 각각 6.6, 0.3으로 나와야 할텐데 이상한 결과가 나오고 있는 것을 확인하실 수 있습니다. 이는 진법 변환에 따른 오차에 의한 것으로 10진수를 2진수로 변환시킬때 10진수의 유한 소수가 2진수에선 무한 소수가 되는 경우가 있다고 합니다. 진법 변환을 간단히 소개하자면, 10진수 0.125를 2진수로 고치면 

0.125 * 2 = 0.25 (0)
0.25 * 2 = 0.5 (0)
0.5 * 2 = 1.0 (1)
0.0 (계산 마침)

위와 같이 계산되어 최종적으로 2진수 0.001이 되는 것입니다. 참고로 여기서 괄호 안의 숫자는 정수 부분만을 취한 것입니다. 이와 같은 방법으로 10진수 0.1를 2진수로 변환한다고 하면 아래와 같을 것입니다.

0.1 * 2 = 0.2 (0)
0.2 * 2 = 0.4 (0)
0.4 * 2 = 0.8 (0)
0.8 * 2 = 1.6 (1)
...

소수부가 0이 나올때까지 2를 곱하게 되는데, 여기서 뒷자리를 자세히 살펴보시면 2,4,8,6의 반복으로 계속 끝이 없는 무한 소수가 되어 나오는 것을 확인하실 수 있습니다. 결과가 이상하게 나오더라도 진법 변환에서 생기는 오차라고 생각하시고, 이런 오류없는 정밀한 계산을 하시려면 모듈을 쓸수도 있지만 아직은 모듈 얘기는 하지 않도록 하겠습니다.


4. 복소수(Complex)


파이썬에선 정수와 실수뿐만 아니라 좀더 넓은 개념인 복소수까지도 내부적으로 지원합니다. 여기서 주의하셔야 할 부분은 허수 단위가 i가 아니라 j 또는 J라는 것입니다. 우선은 아래의 예제를 보도록 합시다.

>>> x = 7 - 3j
>>> type(x)
<class 'complex'>
>>> x.imag
-3.0
>>> x.real
7.0
>>> x.conjugate()
(7+3j)

위 예제에서 imag는 복소수의 허수 부분을 돌려주고, real은 복소수의 실수 부분을 되돌려줍니다. 그리고 conjugate 함수는 복소수의 켤레 복소수를 되돌려줍니다. 물론 정수와 같이 복소수 끼리도 연산이 가능합니다. 복소수가 아직 뭔지 모르시는 분들은 복소수를 따로 보고 오셔도 되고, 아니면 파이썬에도 이런게 있구나 하고 그냥 넘어가셔도 됩니다.


Q1. 정수 문제 (☆☆☆☆)

정수 617를 내장 함수(bin, oct, hex)를 통해서 출력해보세요.

정답 확인

Q2. 실수 문제 (☆☆☆☆)

실수와 정수끼리 사칙연산을 한 다음에 출력해보세요. (연산자 최소 3개 이상 사용 요구)

예시 확인


저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.08.31 22:31 신고 [edit/del]

    복소수의 사칙연산이 흥미롭네요. 좋은 강좌 올려주셔서 감사합니다.

    Reply
  2. 한낱오랑우탄 at 2013.09.25 08:23 신고 [edit/del]

    Python에 입문혁하였습니다.
    그런데, 질문이 있습니다, 선생님!
    ☜⊙▽⊙☞

    >>> x = 7 -3j
    >>> id(x)
    21357560
    >>> id(7-3j)
    21357248
    >>> y=7-3j
    >>> id(y)
    21358088

    이와 같이 7-3j에 대한 아이디가 모두 다릅니다. 복소수의 경우 지난 강좌(3편Variable)에서 Integer의 설명과 조금 다른 양상을 보이고 있네요. 왜 그런걸까요? 왜?왜?^^~~~~

    Reply
    • BlogIcon EXYNOA at 2013.09.25 22:07 신고 [edit/del]

      현재 구현에서는 -5~256 사이의 모든 정수에 대해서 객체 배열을 가지고 있기 때문에 그 사이의 정수를 정의하면 기존에 있는 객체를 참조합니다.'라고 나와있으며, 이는 -5~256 사이의 정수를 X, Y, Z에 넣을때는 미리 만들어져 있는 객체를 참조하지만 범위를 넘어선 경우에는 객체를 새로 정의한다고 합니다.

      복소수는 정수와 다른 개념입니다.

  3. 한낱오랑우탄 at 2013.09.26 08:03 신고 [edit/del]

    답변 감사합니다.
    모든 Complex나 Float에 대해서 객체를 정의한다는 것이 거의 불가능하리라 짐작은 했습니다. 글제요.^^

    Reply
  4. 야호 at 2014.05.08 18:01 신고 [edit/del]

    강의 잘 봤습니다. ^^
    3.실수(Float) 단원에서 오타 발견했어요~

    우리가 예상하기에는 위의 예제의 결과가 각각 6.6, 1.3
    ->
    우리가 예상하기에는 위의 예제의 결과가 각각 6.6, 0.3

    감사합니다.

    Reply
  5. Angel at 2014.08.08 15:50 신고 [edit/del]

    음.. ㅎㅎ 학교다닐때 공부를 열심히 안했던지라.. 걍 숫자나열로 밖에 안보이는데..
    프로그래밍이 가능할지 사기가 급 떨어지내요 ㅎㅎ

    Reply
  6. BlogIcon 404page at 2014.09.26 15:39 신고 [edit/del]

    >>> 5.4 + 1.2
    6.6000000000000005
    로나오는데.. 버그인가요?

    Reply
    • BlogIcon EXYNOA at 2015.01.08 02:57 신고 [edit/del]

      진법 변환에 따른 오차에 의한 것으로 10진수를 2진수로 변환시킬때 10진수의 유한 소수가 2진수에선 무한 소수가 되는 경우가 있다고 합니다.

  7. 정승환 at 2014.11.03 17:16 신고 [edit/del]

    강좌 잘 보고 있습니다~~

    Reply
  8. 김승석 at 2016.06.18 16:59 신고 [edit/del]

    벌써부터 막히네요,

    Reply
    • BlogIcon EXYNOA at 2016.09.17 02:26 신고 [edit/del]

      어떤 부분에서 막히시는지 말씀해주시면 감사하겠습니다.
      항상, 댓글에 작성된 의견을 참고하여 강좌의 내용을 상시 수정하고 있습니다 ^ㅡ^*

submit

티스토리 툴바