데이터 타입

데이터 타입 (Data Type)

  • 숫자 (Number)

    • int (정수, integer)

    • float (부동소수점, 실수, floating point number)

    • complex (복소수, complex number)

  • 문자열 (String)

  • 참/거짓 (Boolean)

  • None

1. 숫자

파이썬 문서

(1) int

모든 정수는 int(정수, ingteger)로 표현됩니다.

Python3에서는 long 타입은 없고 모두 int 타입으로 표기 됩니다.

  • 보통 프로그래밍 언어 및 Python2에서의 long은 OS 기준 32/64비트입니다.

  • Python3에서는 모두 int로 통합되었습니다.

8진수 : 0o / 2진수 : 0b / 16진수: 0x 로도 표현 가능합니다.

# 변수 a에 정수 3을 넣고 해당 변수의 type을 알아봅시다.

a = 3
type(a)
int
# 변수 a에 2의 64제곱을 할당해줍니다.
# print와 type을 이용하여 a의 값과 타입을 확인해봅시다.

a = 2**64
print(a)
type(a)
18446744073709551616
int

파이썬에서 표현할 수 있는 가장 큰 수

  • 파이썬에서 가장 큰 숫자를 활용하기 위해 sys 모듈을 불러옵니다.

  • 파이썬은 기존 C 계열 프로그래밍 언어와 다르게 정수 자료형(integer)에서 오버플로우가 없습니다.

  • 임의 정밀도 산술(arbitrary-precision arithmetic)을 사용하기 때문입니다.

오버플로우(overflow)

  • 데이터 타입 별로 사용할 수 있는 메모리의 크기가 제한되어 있습니다.

  • 표현할 수 있는 수의 범위를 넘어가는 연산을 하게 되면, 기대했던 값이 출력되지 않는 현상, 즉 메모리를 넘어선 상황을 의미합니다.

임의 정밀도 산술(arbitrary-precision arithmetic)

  • 사용할 수 있는 메모리양이 정해져 있는 기존의 방식과 달리, 현재 남아있는 만큼의 가용 메모리를 모두 수 표현에 끌어다 쓸 수 있는 형태를 의미합니다.

  • 특정 값을 나타내는데 4바이트가 부족하다면 5바이트, 더 부족하면 6바이트까지 사용할 수 있게 유동적으로 운용합니다.

# 파이썬이 얼만큼 큰 숫자까지 저장할 수 있는지 확인해봅시다.

import sys
max_int = sys.maxsize

# sys.maxsize 의 값은 2**63 - 1 => 64비트에서 부호비트를 뺀 63개의 최대치

print(max_int)
super_max = sys.maxsize * sys.maxsize
print(super_max)
9223372036854775807
85070591730234615847396907784232501249
# n진수를 만들어봅시다.
# 2진수는 binary_number에 0b10을 할당합니다.
# 8진수는 octal_number에 0o10을 할당합니다.
# 10진수는 decimal_number에 10을 할당합니다.
# 16진수는 hexadecimal_number에 0x10을 할당합니다.
# 그리고 결과를 print를 이용해서 여러줄로 출력해봅시다.

binary_number = 0b10
octal_number = 0o10
decimal_number = 10
hexadecimal_number = 0x10
print(f"""
2진수 : {binary_number}
8진수 : {octal_number}
10진수 : {decimal_number}
16진수 : {hexadecimal_number}
""")
2진수 : 2
8진수 : 8
10진수 : 10
16진수 : 16

(2) float

실수는 float(부동소수점, 실수, floating point number)로 표현됩니다.

다만, 실수를 컴퓨터가 표현하는 과정에서 부동소수점을 사용하며, 항상 같은 값으로 일치되지 않습니다. (floating point rounding error)

이는 컴퓨터가 2진수(비트)를 통해 숫자를 표현하는 과정에서 생기는 오류이며, 대부분의 경우는 중요하지 않으나 값을 같은지 비교하는 과정에서 문제가 발생할 수 있습니다.

# 변수 a에 실수 3.5를 넣고 해당 변수의 type을 알아봅시다.

a = 3.5
type(a)
float

컴퓨터식 지수 표현 방식

  • e를 사용할 수도 있습니다. (e와 E 모두 사용 가능)

# 컴퓨터식 지수 표현 방식을 사용해봅시다.
# 변수 b에 지수 314e-2를 넣고 해당 변수의 type을 알아봅시다.
# print를 이용해 변수 b의 값도 알아봅시다.

b = 314e-2    # 314 ∗ 0.01 
print(type(b))
print(b)
<class 'float'>
3.14

실수의 연산

  • 실수의 경우 실제로 값을 처리하기 위해서는 조심할 필요가 있습니다.

# 실수의 덧셈을 해봅시다.
# 실수 아무 값이나 두 개를 더해봅시다. (3.5 + 3.2)

3.5 + 3.2
6.7
# 실수의 뺄셈을 해봅시다. (3.5 - 3.12)

3.5 - 3.12
0.3799999999999999
# 우리가 원하는대로 반올림을 해봅시다.
# round() 는 0~4는 내림, 5는 동일하게 작동하지 않고 반올림 방식에 따라 다릅니다.
# 앞자리가 짝수면 5는 내림 / 앞자리가 홀수면 5는 올림
# round(값, 소수점자릿수)
# 3.5 - 3.12 의 값을 반올림하는데 소수점 2자리까지 나타나게 해봅시다.

round(3.5 - 3.12, 2)
0.38
# 3.5 - 3.12의 결과와 0.38의 값이 같은지 == 을 사용해서 확인해봅시다.

3.5 - 3.12 == 0.38
False
# print를 이용해서 3.5 - 3.12의 값을 확인해 봅시다.

print(3.5 - 3.12)
0.3799999999999999
  • 따라서 다음과 같은 방법으로 처리 할 수 있습니다. (이외에 다양한 방법이 있음)

# 1. 기본적인 처리방법을 알아봅시다.
# 변수 a, b에 각각의 실수 값을 저장합니다.
# 그리고 abs()를 이용하여 a와 b의 차이를 구합니다.
# a와 b의 차이가 1e-10 값 이하이면 a 와 b 는 같다고 볼 수 있습니다.

a = 3.5 - 3.12
b = 0.38

abs(a - b) <= 1e-10
True
# 2. sys 모듈을 통해 처리하는 방법을 알아봅시다.
# `epsilon` 은 부동소수점 연산에서 반올림을 함으로써 발생하는 오차 상환
# abs() 를 이용하여 a, b의 차이를 구합니다.
# a와 b의 차이가 sys.float_info.epsilon의 값 이하이면 a, b 는 같다고 볼 수 있습니다.

import sys
abs(a - b) <= sys.float_info.epsilon
True
# 3. python 3.5부터 활용 가능한 math 모듈을 통해 처리하는 법을 알아봅시다.
# math.isclose() 를 이용해서 a와 b의 값이 같은지 확인할수 있습니다.

import math
math.isclose(a, b)
True

(3) complex

complex(복소수, complex number)는 실수로 표현되는 실수부와 허수부를 가집니다.

허수부를 j로 표현합니다.

# 변수 a에 복소수 3-4j를 넣고 해당 변수의 type을 알아봅시다.

a = 3 - 4j
type(a)
complex
# 문자열'1+2j' 을 복소수로 변환해봅시다.

complex('1+2j')
(1+2j)
# 문자열을 변환할 때, 문자열은 중앙의 + 또는 - 연산자 주위에 공백을 포함해서는 안 됩니다.
# '1 + 2j'를 복소수로 변환해보고 오류를 확인해봅시다.

complex('1 + 2j') # ValueError
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_28272/3185145093.py in <module>
      2 # '1 + 2j'를 복소수로 변환해보고 오류를 확인해봅시다.
      3 
----> 4 complex('1 + 2j') # ValueError

ValueError: complex() arg is a malformed string

2. 문자열

모든 문자(String)는 str 타입입니다.

문자열은 Single quotes(')나 Double quotes(")을 활용하여 표현 가능합니다.

  • 작은따옴표: '"큰" 따옴표를 담을 있습니다'

  • 큰따옴표: "'작은' 따옴표를 담을 있습니다"

  • 삼중 따옴표: '''세 개의 작은따옴표''', """세 개의 큰따옴표"""

단, 문자열을 묶을 때 동일한 문장부호를 활용해야하며, PEP-8에서는 하나의 문장부호를 선택하여 유지하도록 하고 있습니다. (Pick a rule and Stick to it)

# 변수에 문자열을 넣고 출력해봅시다.
# 변수 greeting 에 hi를 name 에 'ssafy'를 할당합시다. 
# 그리고 각각의 변수를 print로 찍어보고 type도 확인해봅시다.

greetings = 'Hi'
name = 'Hing9u'
print(greetings, name)
print(type(name))
Hi Hing9u
<class 'str'>
# 변수 age 에 사용자로 부터 입력을 받을 수 있는 input()의 결과를 저장합시다.
# age 에 입력받은 값이 저장되었는지 그리고 그 type이 무엇인지 확인해봅시다.
# 숫자를 넣었을때와 문자를 넣었을때의 type이 같은지 다른지도 확인해봅시다.

age = input()
print(age)
print(type(age))
 28
28
<class 'str'>

따옴표 사용

문자열 안에 문장부호(', ")가 사용될 경우 이스케이프 문자(\)를 활용 가능 합니다.

# 문자열 안에 문장부호가 들어간 '철수가 말했다. '안녕?'' 을 활용해서 오류를 확인해봅시다.

print('철수가 말했다. '안녕?'')
  File "C:\Users\User\AppData\Local\Temp/ipykernel_28272/2842659827.py", line 3
    print('철수가 말했다. '안녕?'')
                     ^
SyntaxError: invalid syntax
# 해당 오류를 1) 이스케이프 문자와 2) 서로 다른 문장부호 구성을 통해 해결해봅시다.

print('철수가 말했다. "안녕?"')
print('철수가 말했다. \'안녕?\'')
철수가 말했다. "안녕?"
철수가 말했다. '안녕?'

여러줄에 걸쳐있는 문장은 다음과 같이 표현 가능합니다.

  • PEP-8에 따르면 이 경우에는 반드시 """를 사용하도록 되어 있다.

# 여러줄을 출력해봅시다.

print("""
개행문자(역슬래시 + n) 없이
여러 줄을 그대로 출력 가능합니다.
""")
개행문자(역슬래시 + n) 없이
여러 줄을 그대로 출력 가능합니다.
# 문자열은 + 연산자로 이어붙이고, * 연산자로 반복시킬 수 있습니다.
# 'heyheyhey yo!' 를 출력하도록 코드를 작성해봅시다.

3 * 'hey' + ' yo!'
'heyheyhey yo!'
# 당연히 변수화해서도 사용가능합니다.
# 변수 prefix에 'Py'를 할당합니다.
# 그리고 prefix에 'thon'을 붙여봅시다.

prefix = 'Py'
prefix + 'thon'
'Python'

이스케이프 시퀀스

문자열을 활용하는 경우 특수문자 혹은 조작을 하기 위하여 사용되는 것으로 \를 활용하여 이를 구분합니다.

예약문자

내용(의미)

\n

줄 바꿈

\t

\r

캐리지리턴

\0

널(Null)

\

\

'

단일인용부호(')

"

이중인용부호(")

# print를 한 번만 사용하여 이스케이프 문자열을 조합하여 다음 결과가 나올 수 있게 해봅시다.
# '엔터
# 탭    탭'

print('엔터.\n\t탭')
엔터.
탭	탭
# print 함수의 end 옵션에도 이스케이프 문자를 사용할 수 있습니다.
# 아래 코드를 수정하여 다음의 결과를 출력해봅시다.
# '내용을 띄워서 출력하고 싶으면?    옆으로 띄워짐'

print('내용을 띄워서 출력하고 싶으면?', end='\t')
print('옆으로 띄워짐')
내용을 띄워서 출력하고 싶으면?	옆으로 띄워짐
# print 함수의 end 옵션의 기본은 \n입니다.
# 물론, end 옵션은 이스케이프 문자열이 아닌 다른 것도 가능합니다.
# end에 다른 문자열도 넣을 수 있습니다. 
# 아래 코드를 수정하여 다음의 결과를 출력해봅시다.
# '개행 문자 말고도 가능합니다!진짜로!알고보면 print는 기본이\n!'

print('개행 문자 말고도 가능합니다', end = '!')
print('진짜로', end = '!')
print('알고보면 print는 기본이\\n', end = '!')
개행 문자 말고도 가능합니다!진짜로!알고보면 print는 기본이\n!

String interpolation

  • %-formatting

    • %d : 정수

    • %f : 실수

    • %s : 문자열

  • str.format()

  • f-strings : 파이썬 3.6 이후 버전에서 지원

# name 변수에 이름, score 변수에 학점을 넣어봅시다.

name = 'Kim'
score = 4.5
# %-formatting을 활용해봅시다.
# print를 이용하여 name 을 출력해봅시다..
# print를 이용하여 score를 정수 형태로 출력해봅시다.
# print를 이용하여 score를 실수 형태로 출력해봅시다.

print('Hello, %s' % name)
print('내 성적은 %d' % score)
print('내 성적은 %f' % score)
Hello, Kim
내 성적은 4
내 성적은 4.500000
# str.format()을 활용해봅시다.
# name 을 출력해봅시다.

print('Hello, {}'.format(name))
Hello, Kim
# f-string을 활용해봅시다.
# name 을 출력해봅시다.

print(f'Hello, {name}')
Hello, Kim
# 여러줄 문자열에서도 사용 가능합니다.
# f-string을 이용하여 name을 여러줄 문자열로 출력해봅시다.

print(f"""
Hello,
{name}
""")
Hello,
Kim
  • f-strings에서는 형식을 지정할 수 있습니다.

# 다양한 형식을 활용하기 위해 datetime 모듈로 오늘을 표현해봅시다.
# today 에 현재 시간 날짜를 할당해봅시다.
# print를 이용하여 today를 출력해봅시다.

from datetime import datetime
today = datetime.now()
print(today)
2021-07-20 10:22:21.661280
# interpolation에서 출력형식을 지정할 수 있습니다.
# today에 저장된 시간을 YYYY년, mm월, dd일, a요일 로 구분해서 출력해봅시다.

print(f'오늘은 {today:%Y}{today:%m}{today:%d}{today:%a}')
오늘은 2021년 07월 20일 Tue
  • f-strings에서는 연산과 출력형식 지정도 가능합니다.

# string interpolation을 통해 출력형식 지정 뿐만 아니라, 연산도 가능합니다.
# pi = 3.141592 를 할당하고 
# 원주율은 3.14. 반지를이 2일 때 원의 넓이는 12.566368 이라고 출력해봅시다.

pi = 3.141592
print(f'원주율은 {pi:.3}. 반지름이 2일때 원의 넓이는 {pi * 2 * 2}')
print(f'원주율은 {round(pi, 2)}. 반지름이 2일때 원의 넓이는 {pi * 2 * 2}')
원주율은 3.14. 반지름이 2일때 원의 넓이는 12.566368
원주율은 3.14. 반지름이 2일때 원의 넓이는 12.566368

3. 참 / 거짓 (Boolean)

파이썬에는 TrueFalse로 이뤄진 bool 타입이 있습니다. 비교/논리 연산을 수행 등에서 활용됩니다.

다음은 False로 변환됩니다.

0, 0.0, (), [], {}, '', None
# True와 False의 type을 알아봅시다.

print(type(True))
print(type(False))
<class 'bool'>
<class 'bool'>
# 다양한 True, False 상황들을 확인해봅시다.
# 형변환(Type Conversion)에서 추가적으로 다루는 내용입니다.

bool(3.14)
True
# 0 을 bool 타입으로 형변환해봅시다.

bool(0)
False
# 1 을 bool 타입으로 형변환해봅시다.

bool(1)
True
# None 을 bool 타입으로 형변환해봅시다.

bool(None)
False
# 빈 리스트를 bool 타입으로 형변환해봅시다.

bool([])
False
# 빈 문자열을 bool 타입으로 형변환해봅시다.

bool('')
False
# ['hi']를 bool 타입으로 형변환해봅시다.

bool(['hi'])
True
# 'hi'를 bool 타입으로 형변환해봅시다.

bool('hi')
True

4. None

파이썬에서는 값이 없음을 표현하기 위해 None 타입이 존재합니다.

# None의 타입을 알아봅시다.

type(None)
NoneType
# 변수에 저장해서 확인해봅시다.
# 변수 a에 None을 할당하고 출력해봅시다.

a = None
print(a)
None

5. 형변환

파이썬에서 데이터타입은 서로 변환할 수 있습니다. (Type conversion, Typecasting)

  • 암시적 형변환

  • 명시적 형변환

암시적 형변환

암시적 형변환(Implicit Type Conversion)은 사용자가 의도하지 않았지만, 파이썬 내부적으로 자동으로 형변환 하는 경우입니다. 아래의 상황에서만 가능합니다.

  • bool

  • Numbers (int, float, complex)

# boolean과 integer는 더할 수 있을까요?
# True와 임의의 정수를 더해봅시다.

True + 3
4
# int, float, complex를 각각 변수에 대입해봅시다.
# 변수 int_number 에 정수를 할당해봅시다.
# 변수 float_numbe 에 실수를 할당해봅시다.
# 변수 complex_number 에 복소수를 할당해봅시다.

int_number = 3
float_number = 5.0
complex_number = 3+5j
# int와 float를 더해봅시다. 그리고 값을 출력해봅시다.
# 그 결과의 type은 무엇일까요?

print(int_number + float_number)
print(type(int_number + float_number))
8.0
<class 'float'>
# int와 complex를 더해봅시다. 그리고 값을 출력해봅시다.
# 그 결과의 type은 무엇일까요?

print(int_number + complex_number)
print(type(int_number + complex_number))
(6+5j)
<class 'complex'>

명시적 형변환

위의 상황을 제외하고는 모두 명시적으로 형변환(Explicit Type Conversion)을 해주어야합니다.

  • string -> intger : 형식에 맞는 숫자만 가능

  • integer -> string : 모두 가능

암시적 형변환이 되는 모든 경우도 명시적으로 형변환이 가능합니다.

  • int() : string, float를 int로 변환

  • float() : string, int를 float로 변환

  • str() : int, float, list, tuple, dictionary를 문자열로 변환

list(), tuple() 등은 다음 챕터에서 배울 예정입니다.

# integer와 string 사이의 관계는 명시적으로 형변환을 해줘야만 합니다.
# 정수와 문자열을 그냥 더해보고 오류를 확인해봅시다.

1 + '등'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_28272/985865609.py in <module>
      2 # 정수와 문자열을 그냥 더해보고 오류를 확인해봅시다.
      3 
----> 4 1 + '등'

TypeError: unsupported operand type(s) for +: 'int' and 'str'
# 정수를 문자열로 형변환하고 문자열과 더해봅시다.

str(1) + '등'
'1등'
# 변수 a에 string 3을 할당하고 integer로 변환해봅시다.

a = '3'
int(a)
3
# 변수 a에 string 3.5를 할당하고 float로 변환해봅시다.

a = '3.5'
float(a)
3.5
# string은 글자가 숫자일때만 형변환이 가능합니다.
# 변수 a에 문자열 'hi'를 할당하고 integer로 변환해봅시다.

a = 'hi'
int(a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_28272/2253879097.py in <module>
      3 
      4 a = 'hi'
----> 5 int(a)

ValueError: invalid literal for int() with base 10: 'hi'
# string 3.5를 int로 변환할 수는 없습니다.
# 변수 a에 string 3.5를 저장하고 integer로 변환하고 오류를 확인해봅시다.

a = '3.5'
int(a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_28272/1212358409.py in <module>
      3 
      4 a = '3.5'
----> 5 int(a)

ValueError: invalid literal for int() with base 10: '3.5'
# float 3.5는 int로 변환이 가능합니다.
# 변수 a에 실수 3.5를 저장하고 integer로 변환해봅시다.

a = 3.5
int(a)
3