ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 파이썬 자료형 숫자
    파이썬(Python) 강의 2019. 2. 4. 10:34

     프로그래밍 언어를 배울 때 가장 먼저 배우는 것이 첫번째로 개발 환경 설정 및 실행, 두번째가 자료형이다. 우리는 1.파이썬 설치 및 개발환경 설정을 통해 파이썬과 파이참을 설치 해 보았다. 그리고 파이썬 인터프리터를 이용해 hello world!를 실행 시켜 보았다.이 포스트 부터는 본격적으로 파이썬이 제공하는 자료형 중 숫자와 숫자 자료형의 사용법, 그 의미 등을 설명하기로 한다.

    들어가기전에

     이 포스트는 여러분이 파이썬을 설치했고 각자 원하는 IDE를 이용해 파이썬을 개발한다고 가정한다. 대화형(Interactive) 터미널을 사용해도 상관 없다. 혹시 파이썬을 설치하지 않았다면  1.파이썬 설치 및 개발환경 설정 이 포스트에서 파이썬과 파이썬 개발환경을 먼저 셋업하길 바란다. 오늘 배울 자료형에 대해서는 너무 깊게 파고들지 말되 실습은 반드시 해봐라. 이 포스트에서 부연 설명 하는 것들에 대해서 이해가 되지 않아도 괜찮다. 원래 처음 시작 할 때는 인터프리터가 어떻고 저떻고 하는 소리는 하나도 이해 안된다. 그러니 이 포스트에서 30분 이상의 시간을 할애하지 말라. 프로그래밍을 처음 시작한다면 너무 부담 갖지 말고 실습 위주로 진행하면 좋을 것이다.

    목표

    • 자료형(Datatype)이란 무엇인가?
    • 정수형(Integers)
    • 플로팅 포인트(Floating-Point Numbers)
    • 복소수(Complex Numbers)
    예상 소요시간 (30분 이내)

    자료형이란 무엇인가?

      자료형이란 인간이 인식하는 데이터의 종류이다. 예를 들어 우리는 0, 1, 2, 3과 같은 표기를 "숫자"라고 인식하고, "A"와 같은 표기를 "문자"로 인식한다. 그리고 "숫자"인 0, 1, 2, 3으로 "사칙연산"이라는 연산을 할 수 있다는 것은 인지하고 "문자"를 여러개 나열하면 "문자열"이 된다는 사실 또한 알고있다. 그러나 이것은 지극히 인간 관점에서의 인식이지 컴퓨터 입장에서는 전부 1010으로 된 이 표현들이 숫자인지 문자인지 알 수 없다. 아래의 예를 보자.

    예를들어 여러분이 65를 입력으로 준다고 치자. 그러면 여러분의 언어가 뭔지에 따라 컴파일러나 인터프리터가 그 입력값을 CPU가 이해 할 수 있는 바이너리의 형태로 바꿀 것이다. 65의 바이너리는  1000001이므로 CPU는 1000001를 이용해 이후의 코드를 실행 할 것이다. 두번째 그림을 보자. 두 번째 그림에서 여러분은 A를 입력했다. 하지만 애석하게도 A또한 1000001이라는 65와 똑같은 바이너리의 형태를 가지고 있다. 그렇다면 CPU가 이 두 자료형을 어떻게 구분하는가? 정답은 못한다이다. CPU는 여러분의 자료형을 구분하지 못한다. 여러분의 자료형을 구분하는 것은 컴파일러와 인터프리터이다. 컴파일러와 인터프리터는 여러분이 입력 한 65를 보고, "아, 너는 숫자야. 그러니까 너는 4바이트의 메모리가 필요하고, 덧셈, 뺄셈, 곱셈, 나눗셈 등의 연산을 할 수 있어." 라고 이해하며, 'A'를 보고, "너는 문자구나, 너는 1바이트의 메모리가 필요하고, + 연산을 이용해 문자열을 이어붙일 수 있고, lowercase, uppercase같은 연산을 할 수 있어."라고 정한다. 따라서 어떤 자료형을 사용 할 수 있는지는 컴파일러/인터프리터가 허락하는 선에서 가능하고, 컴파일러/인터프리터가 허용한 그 문법들을 우리는 "프로그래밍 언어"라고 부른다. 그리고 컴파일러/인터프리터가 정한 규칙을 어겼을 때 바로 구문오류(Syntax Error)가 발생한다. 너무 복잡하다면 지금 자세히 알 필요는 없다. 다만 자료형은 해당 데이터가 할당 될 메모리 공간의 크기, 그 자료를 화면에 표현하는 방법, 그리고 그 데이터가 할 수 있는 연산이라는 것을 이해하면 된다. 따라서 앞으로 배우게 될 자료형들을 공부 할 때, 그 데이터가 무엇을 표현하고, 어떤 연산(기능)을 할 수 있는지에 대해 초점을 맞추면 조금 수월 할 것이다. 메모리공간은 나중에 생각해도 된다.


    파이썬에서는 다음과 같은 자료형이 존재한다.

    • 숫자(Numbers) : 12, 24.3, 3+2j, .. <- 이 포스트에서 다루는 자료형
    • 문자(Strings) : "hello, "world"
    • 리스트(Lists) : [1, 3, [3, 'hey'], 4]
    • 딕셔너리(Dictionaries) : { 'name': 'fsoftwareengineer', 'age' : 17}
    • 튜플(Tuples) : (1, 'a', 4, 'c')
    • 파일(Files) : f = open('filename', 'r')
    • 셋(Sets) (집합) : { 1, 4, 5 }
    • 다른 타입들 : Boolean (True/Faluse), types, None, etc
    • 프로그래밍 유닛 타입(Programming unit types) : 함수(Functions), 모듈(Modules), 클래스(Classes)
    • 구현 레벨 타입(Implementational-level types) : 예외(Exception) 등등..

    정수형 (Integers)

     말 그대로 정수형이다. 여러분이 학교에서 배운 음수, 0, 양수로 존재하는 정수형을 의미한다. 기본적으로 사칙연산과, 승수 연산을 제공한다. 실습을 위해 파이썬을 실행시키거나 파이참을 실행시켜라. 다음을 실행시켜보자.

    print(10) 10

    너무 시시하니 덧셈을 해보자.

    print(10 + 2) 2

    뺄셈, 곱셈 나눗셈도 해 보아라. 다 한 후에는 승수(지수) 연산을 보자.

    print(10 ** 2)
    100

    10^2인 100을 출력 하는 것을 볼 수 있다.


    그렇다면 파이썬은 10진법만 이해할까? 아니다. 파이썬은 2진법 8진법 16진법도 이해한다. 다만 파이썬에게 무슨 진법인지 알려주기 위해 접두사를 붙여줘야 한다는 점을 유의하자.


    진법 

    접두사

    예 

     2진법

    0b 또는  0B

    0b10, 0B1111 

     8진법

    0o 또는 0O 

    0o10, 0O17 

    16진법 

    0x 또는 0X 

    0xFF, 0x10

    다시 말해 같은 10이라도 앞에 접두사가 어떻게 붙느냐에 따라 결과가 달라진다는 뜻이다.

    print(10)
    print(0b10)
    print(0o10)
    print(0x10)

    결과 를 보면 첫번째 10은 10진수의 10, 두번째 10은 2진수 10이므로 10진법으로 고쳤을 때 2, 마찬가지로 세번째는 8, 네번째는 16임을 알 수 있다. 주의 할 점은 진수만 다르지 전부 정수형이라는 것이다.

    10
    2
    8
    16

    자, 그럼 여러분이 지금 다루고 있는 데이터가 어떤 자료형인지 알고싶다면 어떻게 해야 할까? 그럴 땐 type함수를 사용하면 된다. 파이썬에는 built-in 함수라고, print와 type같이 기본적으로 제공하는 함수들이 있다. type함수를 위해 파이썬 자료형 확인을 해보자.

    print(type(10)) <class 'int'>

    우리는 type(10)을 실행시켰고, 그 결과 값을 print했다. 아래의 그림처럼 이해하면 조금 쉬울 것이다.

    아무튼 어떤 자료형이 무슨 타입인지 궁금하다면 type함수를 이용해 찾을 수 있다. 근데, 10이 정수형인게 빤히 보이는데 왜 굳이 type을 사용해야 할까? 그 이유는 나중에 "변수"를 배우게 될 때 알게 될 것이다. 여기서 간단히 말하자면, 여러분이 10과 같은 "상수"를 사용 할 일은 거의 없다. 상수는 대부분 "변수"라고 불리는 값을 바꿀 수 있는 어떤 공간에 배정되고, 변수는 보통 "num"이나 "value"처럼 사람이 읽기 쉬운 문자로 선언되므로 그 안에 어떤 데이터가 저장되어 있는지 확인 하기 위해 type을 쓰곤 한다. (예를들어서, x + 1 에서 x에 아무 값이나 넣을 수 있는 것 처럼 num, value가 수학에서의 x와 같은 존재들이다.)

    플로팅 포인트(Floating-Point Numbers)

     플로팅 포인트는 파이썬 자료형 숫자들 중에서도 소숫점을 표현하기 위한 자료형이다. float형이라고 부른다. 따라서 float형은 소숫점을 붙이거나 e 또는 E를 이용해 표현 가능하다. 다음과 같은 예제를 보자.

    print(3.4) 3.4

    이제 자료형을 확인 해 보자.

    print(type(3.4)) <class 'float'>

    다음을 실행 해보자. 서부에서는 소숫점의 0을 생략 할 수 있어서 이러한 점이 프로그래밍 언어에도 반영 된 것으로 보여진다.

    print(3.)
    print(.99) 3.0 0.99

    다음으로 e/E에대해 설명하겠다. e와 E는 과학 분야에서 사용되는 표기법을 지원하기 위한 것으로 10의 승수(지수)를 나타 낼 때 쓰인다. 예를들어서 과학분야에서는 30을 30이라고 쓰지 않고 3*10^1 (3*(10의 1승)) 또는 200을 2*10^2 (2*(10의 2승))과 같이 표기한다. 이를 표기하기 위해 10과 '^'승수 표시 대신  e또는 E를 쓰고 뒤에 승수 자리에 올 숫자를 쓴다. 다음의 예시를 통해 확인해보자. (e는 Exponential(지수)의 약자이다.)

    print(2e3)
    2000.0
    

    -승수도 해보도록 하다.

    print(2e-3) 0.002

     이렇게 해서 플로팅 포인트를 알아보았다. 플로팅 포인트의 표기 및 연산은 Floating Point Unit이라는 CPU내부의 특별한 연산 유닛을 이용해 실행된다. 간단히 말해 컴퓨터가 소숫점을 이해 할 수 있도록 도와주는 장치라고 생각하면 된다. 컴퓨터는 메모리공간을 일정 기준으로 나눠서 앞쪽은 정수부분, 뒷쪽은 소수부분으로 인식하는데 그렇게 하면 2진수로 표현 할 수있는 소숫점에 한계가 생기기 때문에 연산의 결과가 부정확 할 수 있다. 예를들어 다음의 구문을 실행 해 보자.

    print(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000001+0.02) 0.02

    결과가 신기하게도 0.02000000.....01이 아니라 0.02인 것을 확인 할 수 있다. 이는 플로팅포인트의 한계 때문에 생기는 오류이다. 어? 그렇다면 우리야 10원 100원 1000원을 사용하니까 돈 계산이 쉽지만 외국처럼 소숫점을 사용하는 데서는 이런 플로팅포인트의 한계를 어떻게 극복할까? 여러분이 인터넷 쇼핑몰을 차려 해외로 상품을 수출하는데 플로팅포인트 때문에 계산에 오류가 생겨 혼란이 오는 것을 원하지 않을 것이다. 따라서 보통 소숫점은 잘 사용하지 않고 예를들어 10.25달러라면 정수형으로 1025를 입력받고 유저들에게 보여줄 때만 10.25로 중간에 .을 넣어서 보여준다.

    복소수 (Complex Numbers)

    파이썬은 과학계에서도 많이 사용하기 때문에 복소수를 지원한다. 복소수는 다음과 같이 표기된다.


    print(3+2j) (3+2j)

    타입을 확인해보면 Complex로 나오는 것을 알 수 있다.

    print(type(3+2j))
    <class 'complex'>

    이 포스트에서는 파이썬의 여러가지 자료형 중에서도 숫자를 어떻게 표현하는지에 대해서 알아봤다. 그 중에서도 정수, 소수, 복소수를 어떻게 표기하는지 알아보았다. 또한 type함수를 이용해 어떤 자료형의 형을 확인하는 방법도 배웠다. 다음 포스트에서는 파이썬에서 문자열을 다루는 방법에 대해 소개하도록 하겠다. 그리고 모르면 댓글을 남겨라. 모르는 것은 나쁘지 않지만 질문하지 않는 것은 매우 나쁘다! 

    댓글

f.software engineer @ All Right Reserved