파이썬의 데이터 종류

0

프로그램에서 다루는 데이터는 몇 가지 종류가 있습니다. 프로그래밍을 할 때는 데이터를 다루는 것이 중요한데, 이 데이터를 효과적으로 다루기 위해서는 사용되는 데이터의 종류에 대해 알고 있어야 합니다.

만약 프로그램에 데이터를 전달하면서 데이터의 타입을 명확하게 알려주지 않으면 프로그램은 전달받은 데이터를 어떻게 처리해야 할 지 알지 못해 에러를 발생시키는데, 파이썬은 수치형, 문자열형, 논리형, 리스트형, 사전형, 튜플형, 집합형의 총 7가지 데이터를 다룰 수 있습니다.

수치형 데이터

수치형 데이터는 숫자로 이루어진 데이터로 1, 2, 3, 4와 같이 일반적인 숫자로 이루어져 있는 데이터입니다.

수치형 데이터는 더하기, 빼기와 같은 기본적인 연산이 가능한데, 문자열로 다루어지는 ‘숫자형’ 데이터가 섞여있는 경우에는 산술적인 의미로서의 연산은 이루어지지 않습니다. ‘전화번호’와 같이 숫자로 구성되었지만 실제로는 문자열로 다루어지는 데이터가 대표적인 ‘숫자형’ 데이터입니다.

전화번호는 비록 숫자로 이루어져 있지만 실제 용도는 문자열에 가까운데, 전화번호끼리는 더하기, 빼기와 같은 연산을 할 필요가 없기 때문입니다. 주소도 마찬가지로 ‘서울시 강남구 강남동 1234’와 같이 주소에 들어가는 숫자는 그 자체로 숫자가 아닌 문자의 역할이기 때문에 문자열로 전달해야 합니다.

이렇게 데이터의 타입에 따라 프로그램의 로직을 작성하는 것이 중요한데, 데이터의 타입에 따라 그 데이터에 적용할 수 있는 기능이 다르기 때문입니다. 수치형 데이터의 경우에는 산술 연산이나 비교 연산 등을 쉽게 수행할 수 있고, 문자열형 데이터의 경우에는 upper(), lower(), count()등 문자열형만의 다양한 메소드를 활용할 수 있습니다.

파이썬은 기본적으로 정수, 실수, 복소수의 3가지 타입의 수치형 데이터를 다룰 수 있기 때문에 고도의 계산이 필요한 소프트웨어를 개발할 수 있는데, 각 타입의 특징에 대해서도 알아둘 필요가 있습니다.

정수

정수는 소수점을 갖지 않는 숫자로 음의 정수, 0, 양의 정수 모두를 통틀어 일컫는 말입니다. 파이썬에서는 메모리가 허용하는 한 무한대의 정수를 다룰 수 있는데, 정수 연산의 결과는 언제나 정수가 되고, 변수에 정수를 대입하면 그 변수도 정수 타입의 수치형 데이터로 다뤄집니다.

a = 1 + 2
print('a는 정수형 데이터 %s입니다.' % a)

b = -3 + 1
print('b는 정수형 데이터 %s입니다.' % b)

c = 123
print('c는 정수형 데이터 %s입니다.' % c)

d = 123456789123456789123456789123456789
print('d는 정수형 데이터 %s입니다.' % d)

e = -123
print('e는 정수형 데이터 %s입니다.' % e)

f = -123456789123456789123456789123456789
print('f는 정수형 데이터 %s입니다.' % f)
a는 정수형 데이터 3입니다.
b는 정수형 데이터 -2입니다.
c는 정수형 데이터 123입니다.
d는 정수형 데이터 123456789123456789123456789123456789입니다.
e는 정수형 데이터 -123입니다.
f는 정수형 데이터 -123456789123456789123456789123456789입니다.

실수

파이썬은 실수를 지원하기 위해 소수점이 들어간 숫자 데이터는 모두 부동 소수형으로 다루는데, 예를 들어 다음과 같이 소수점이 들어가는 수를 사용하거나 결과에 소수점이 들어가는 경우에는 부동 소수형이 됩니다. 물론 부동 소수형도 정수형처럼 사칙 연산자로 연산을 할 수 있습니다.

a = 66 + 78.32
print('%s의 타입은 %s입니다.' % (a, type(a)))

b = 22 / 7
print('%s의 타입은 %s입니다.' % (b, type(b)))

c = 4.5 // 2.0
print('%s의 타입은 %s입니다.' % (c, type(c)))

d = 4.5 % 2.0
print('%s의 타입은 %s입니다.' % (d, type(d)))
144.32의 타입은 <class 'float'>입니다.
3.1428572857143의 타입은 <class 'float'>입니다.
2.0의 타입은 <class 'float'>입니다.
0.5의 타입은 <class 'float'>입니다.

파이썬에서 부동 소수형은 8바이트만을 이용해서 수를 표현하기 때문에 한정된 범위의 수만 표현할 수 있고, 디지털 방식으로 소수를 표현해야 하기 때문에 정밀도에 한계가 있는데, 이는 부동 소수형의 데이터는 어떻게 구성되고 동작하는가를 정의하고 있는 IEEE754 표준을 따르고 있기 때문으로, 이 표준을 따르는 모든 컴퓨터 시스템은 한계가 제한된 정밀도를 갖습니다.

다음 코드의 경우 결과는 0.1이 나와야 하지만, 실제 결과는 조금 다른 것을 알 수 있는데, 아주 미미한 차이지만 분명한 오차인 것이죠.

제한된 정밀도를 갖는 부동 소수형 데이터
a = 2.1 - 2.0
print(a) # 0.10000000000000009

이렇게 부동 소수점은 제한된 정밀도를 가지기 때문에 부동 소수형의 계산 결과를 다른 값과 비교하는 경우에는 일정한 오차 범위에 들어오는지를 판단할 수 있도록 코드를 작성할 필요가 있습니다.

복소수

파이썬에서는 복소수도 정수, 실수와 같은 수치형 데이터이기 때문에 정수나 부동소수형 데이터와 함께 사용할 수 있고 산술 연산자를 사용해서 계산을 할 수 있는데, 수학에서는 허수 단위를 표현할 때 i를 사용하지만 파이썬에서는 j또는 J를 사용하고, 허수부의 계수가 1일 경우에도 1은 생략하지 않습니다.

a = (6 + 8j) - (6 - 3j)
print('a의 값은 %s입니다.' % a)

b = 3j ** 6
print('b의 값은 %s입니다.' % b)

c = 23 + 4j
print('c의 값은 %s입니다.' % c)

d= c + (5 + 8j)
print('d의 값은 %s입니다.' % d)
a의 값은 11j입니다.
b의 값은 (-729+0j)입니다.
c의 값은 (23+4j)입니다.
d의 값은 (28+12j)입니다.

문자열형 데이터

문자열형은 작은 따옴표나 큰 따옴표로 감싼 모든 문자열 데이터를 말하는데, 다음과 같이 문자열 뿐만 아니라 변수에 문자열을 대입한 경우에도 문자열형 데이터로 다뤄집니다.

a = 'Hello World!'
b = a
print('a는 %s 데이터입니다.')
print('b는 %s 데이터입니다.')
a는 <class 'str'> 데이터입니다.
b는 <class 'str'> 데이터입니다.

파이썬에서는 여러개의 복수행 문자열을 만들고 싶은 경우에 작은 따옴표”’나 큰 따옴표“””를 3개씩 연속해서 붙여, 여러 줄의 문자열로 작성할 수 있습니다. 이렇게 따옴표를 3개씩 붙여 사용하는 문법은 여러 줄의 문자열을 작성할 경우에 해당 문자열의 형태 그대로 결과로 출력되기 때문에 편리하게 사용할 수 있습니다.

a = '''
hello
my
world
'''
print(a)

hello
my
world

문자열 조작

파이썬은 문자열형 데이터에 +* 연산자를 사용할 수 있는데, + 연산자를 사용하면 문자열들을 연결할 수 있고, * 연산자를 사용하면 문자열을 입력된 숫자만큼 반복시킬 수 있습니다. 그렇지만 문자열형 데이터에 + 연산을 할 때는 문자열 끼리만 가능하고 * 연산의 경우에는 숫자만 가능하기 때문에, 다른 형태의 데이터와 연산을 시도하게 되면 프로그램은 에러를 발생시킵니다.

문자열 더하기 연산
a = 'Hello' + 'My' + 'World' + '!'
print(a) # 'HelloMyWorld!'
문자열 곱하기 연산
a = 'Hello World, ' * 5
print(a) # 'Hello World, Hello World, Hello World, Hello World, Hello World, '

문자열 슬라이싱

파이썬은 대괄호 연산자를 사용하여 문자열을 분리할 수 있는데, 대괄호 연산자[]의 첫번째 매개변수는 문자열을 분리할 시작 위치를 나타내고 두 번째 매개변수는 마지막 위치를 나타냅니다.

문자열 분리 연산자
s = 'Good Morning'
print(s[0:4]) # 'Good'

이렇게 문자열의 일부를 분리하는 것을 ‘슬라이싱’이라고 하는데, 슬라이싱은 문자열뿐만 아니라 다른 순서열 자료형에서도 사용이 가능합니다. 문자열이나 배열과 같은 순서열 자료형에서는 슬라이싱을 하더라도 원본이 그대로 유지되어 편리하게 사용할 수 있습니다.

문자열 슬라이싱
a = 'Good Morning'
b = a[0:4]
c = a[5:12]
print(b) # 'Good'
print(c) # 'Morning'

슬라이싱을 할 때 첫 번째 매개변수를 생략하는 경우에는 문자열의 처음부터 슬라이싱을 수행하고, 두 번째 매개변수를 생략하는 경우에는 첫 번째 매개변수가 가리키는 인덱스에서 부터 문자열의 마지막까지 슬라이싱을 수행하게 됩니다.

문자열 슬라이싱 매개변수 생략
a = 'Good Morning'
print(a[:4]) # 'Good'
print(a[5:]) # 'Morning'

문자열 인덱스와 in 메소드

문자열에서 특정한 위치에 있는 하나의 문자를 참고하는 경우에는 :를 사용하지 않고 index만을 사용하면 되는데, 문자열 안에 특정한 문자 혹은 문자열이 있는지를 확인하는 경우에는 in이라는 메소드를 사용하면 됩니다. in 메소드를 사용하면 특정한 문자가 있을 때는 True를, 그렇지 않으면 False를 출력합니다.

특정 위치의 인덱스 참고하기
a = 'Good Morning'
print(a[0]) # 'G'
print(a[8]) # 'n'
특정 문자의 존재 여부 확인하기
a = 'Good Morning'
print('Good' in a)      # True
print('Evening' in a)   # False
print('W' in a)         # False

문자열 길이 확인

만약 문자열의 길이를 알고 싶다면 len() 함수를 사용하면 되는데, len() 함수는 리스트형 데이터에도 사용할 수 있습니다.

문자열의 길이 확인하기
a = 'Good Morning'
print(len(a)) # 12

논리형 데이터

논리형 데이터는 True 또는 False의 두 가지 값만 존재하는 데이터 타입으로 Boolean 형 데이터라고도 하는데, 참은 True, 거짓은 False로 표현됩니다.

파이썬에서 논리형 데이터를 사용하는 경우에는 주의해야 할 부분이 있는데, 논리형 데이터의 첫 글자는 대문자로사용해야 합니다.

자바스크립트와 같은 프로그래밍 언어에서 논리형 데이터는 true, false와 같이 표현이 되지만, 파이썬에서는 첫 글자를 소문자로 사용하는 경우에는 논리형 데이터로 인식되지 않기 때문에 원하는 결과가 나오지 않을 수 있습니다.

파이썬의 논리형 데이터 사용법
print(f'{True}의 이 데이터의 타입은 {type(True)}이고, 참 입니다.') # True의 이 데이터의 타입은 <class 'bool'>이고, 참 입니다.
print(f'{False}의 이 데이터의 타입은 {type(False)}이고, 참 입니다.') # False의 이 데이터의 타입은 <class 'bool'>이고, 거짓 입니다.
print(f'{true}의 이 데이터의 타입은 {type(true)}이고, 참 입니다.') # error.
print(f'{false}의 이 데이터의 타입은 {type(false)}이고, 거짓 입니다.') # error.

리스트형 데이터

리스트형은 메소드를 사용하여 복수의 데이터를 하나로 묶을 수 있는 데이터 타입입니다. 프로그램을 만들다 보면 많은 데이터를 다루어야 하는 경우가 많은데, 이렇게 많은 양의 데이터를 다루어야 하는 경우에 모든 데이터를 하나로 묶어 리스트형 데이터로 만들면 편리하게 다룰 수 있습니다.

리스트형 데이터를 사용하기 위해서는 다음과 같이 데이터를 쉼표,로 구분하여 대괄호[]로 감싸주면 되는데, 이때 대괄호 안에 있는 들어가는 각각의 데이터는 수치형 데이터문자열형 데이터를 모두 사용할 수 있고, 리스트에 동적으로 데이터를 추가하거나 삭제, 순서 변경과 같은 기능도 사용할 수 있습니다.

리스트형 데이터
listData = [23, 56, 'python', 'programing']

리스트형 데이터 요소 추가

리스트형에 데이터를 추가하려면 append()라는 메소드를 사용하면 되는데, 이 메소드를 사용하면 기존에 생성된 리스트형 데이터 묶음에 새로운 데이터를 추가합니다.

group = ['design', 'tech']
group.append('entertainment')
print(group)
['design', 'tech', 'entertainment']

리스트형 데이터 요소 제거

리스트형 데이터에서 요소를 제거할 때는 remove()라는 메소드를 사용하면 되는데, 이 메소드를 사용하면 리스트형 데이터에서 지정된 데이터를 제거합니다.

group = ['design', 'tech', 'entertainment']
group.remove('tech')
print(group)
['design', 'entertainment']

리스트형 데이터 순서 변경

리스트형 데이터에 들어있는 데이터를 정렬할 때는 sort()라는 메소드를 사용하면 되는데, 문자열로 구성된 경우에는 알파벳순으로 정렬이 되고, 숫자로 구성된 경우에는 크기가 작은 순으로 정렬됩니다.

문자열로 구성된 경우
group = ['design', 'tech', 'entertainment']
group.sort()
print(group) # ['design', 'entertainment', 'tech']
숫자로 구성된 경우
numGroup = [55, 24, 32, 64, 38]
numGroup.sort()
print(numGroup) # [24, 32, 38, 55, 64]

리스트형 데이터를 정렬하는 경우에는 반드시 리스트에 동일한 형태의 데이터들만 담겨있어야 하는데, 만약 문자열형과 수치형의 데이터가 섞여있는 경우에는 파이썬이 알파벳과 숫자를 비교할 수 없어 에러를 발생시킵니다.

사전형 데이터

사전형 데이터는 키와 값으로 구성되는 데이터형으로 복수의 데이터를 묶어서 저장한다는 점에서 리스트형과 비슷하지만 사전형 데이터는 이 하나의 쌍으로 되어 데이터를 구성한다는 점에서 차이가 있습니다.

사전형 데이터는 키와 값을 콜론:으로 연결하고, 각각의 키와 값은 쉼표,로 구분하는데, 전체 데이터는 중괄호{}로 감싸주는 형태로 되어 있습니다.

사전형 데이터의 구성
myProgram = {
    'Monday' : '벤치 프레스',
    'Tuesday' : '덤벨 익스텐션',
    'Wednesday' : '데드 리프트',
    'Thursday' : '스탠딩 바벨 컬',
    'Friday' : '스쿼트'
}

사전형 데이터에서 원하는 의 데이터를 가져오고 싶다면 변수명['key']의 형태로 가져올 수 있습니다.

사전형 데이터 읽기
print(myProgram['Monday'])      # '벤치 프레스'
print(myProgram['Wednesday'])   # '데드 리프트'

사전형 데이터의 메소드

사전형 데이터는 keys와 values라는 메소드를 제공하는데 각각의 메소드를 사용하여 사전형 데이터의 모든 key 또는 value 데이터를 가져올 수 있습니다.

myProgram.keys()
dict_keys(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
myProgram.values()
dict_values(['벤치 프레스', '덤벨 익스텐션', '데드 리프트', '스탠딩 바벨 컬', '스쿼트'])

튜플형 데이터

튜플이란 복수의 요소로 구성된 하나의 그룹을 의미하는데, 튜플형 데이터와 리스트형 데이터는 매우 유사한 특징이 있습니다.

튜플형 데이터와 리스트형 데이터의 차이는 데이터를 감싸는 방식으로 리스트형 데이터는 대괄호[]로 데이터를 감싸지만, 튜플형 데이터는 대괄호가 아닌, 괄호()로 데이터를 감싸는 형태입니다. 하지만 사실 튜플형 데이터의 가장 큰 특징은 리스트형 데이터와는 달리 데이터를 만들고 난 후에는 절대로 데이터를 변경할 수 없다는 점입니다.

리스트형 데이터의 요소 바꾸기
fruit = ['바나나', '사과', '복숭아', '딸기']
fruit[0] = '포도'
print(fruit) # ['포도', '사과', '복숭아', '딸기']
튜플형 데이터의 요소 바꾸기
fruit = ('바나나', '사과', '복숭아', '딸기')
fruit[0] = '포도' # 에러 발생. TypeError: 'tuple' object does not support item assignment

튜플형 데이터는 사전형 데이터의 키로도 사용될 수 있는데, 리스트형 데이터의 경우에는 사전형 데이터의 키로는 사용될 수 없습니다.

그 이유는 사전형 데이터의 키는 변경할 수 없는 데이터형만 등록할 수 있기 때문인데, 튜플형 데이터로 복수의 데이터를 조합해서 키를 설정하면, 보다 세분화된 조건 설정을 만들 수 있다는 장점이 있습니다.

튜플형 데이터를 키로 등록하는 경우
student = {}
key = ('혜림', '168cm')
student[key] = '48kg'
Print(student) # {('혜림', '168cm'): '48kg'}
리스트형 데이터를 키로 등록하는 경우
student = {}
key = ['혜림', '168cm']
student[key] = '48kg' # 에러 발생. TypeError: unhashable type: 'list'

집합형 데이터

집합형 데이터는 리스트형이나 튜플형과 같이 복수의 데이터를 하나로 묶어서 다룰 수 있는 데이터형인데, 집합형 데이터는 사전형과 같이 중괄호{}를 사용하지만 사전형과는 달리 의 쌍으로 이루어지지는 않습니다.

집합형 데이터
favorite = {'candy', 'snack', 'ice cream'}
print(favorite) # {'candy', 'snack', 'ice cream'}

집합형 데이터는 순서를 저장하지 않고 중복되는 데이터도 갖지 않는데, 다음과 같이 set 함수를 사용하여 집합형 데이터를 만들어 보면 집합형 데이터의 특징을 확인할 수 있습니다.

set 함수에 문자열을 전달하는 경우
candy = set('delicious')
Print(candy) # {'c', 'o', 'u', 'i', 'l', 'e', 's', 'd'}
set 함수에 리스트형 데이터를 전달하는 경우
flavor = ['apple', 'orange', 'peach']
candy = set(flavor)
print(candy) # {'peach', 'apple', 'orange'}

set 함수에 문자열을 전달하면 문자 단위로 분리된 데이터가 만들어지고, 리스트형 데이터를 전달하면 요소 단위로 분리된 데이터가 만들어지는데, 생성된 데이터를 확인해보면 순서가 일정하지 않고, 문자열을 전달한 경우 전달된 문자열에서는 2개였던 문자 i가 하나만 존재함을 알 수 있습니다.

중복 데이터 제거

집합형 데이터의 특징은 ‘동일한 데이터를 갖지 않는다’인 것을 알 수 있는데, 이 속성을 이용하면 중복 데이터를 쉽게 제거할 수 있습니다.

파이썬에서 복수의 데이터를 다루는 경우에는 주로 리스트형 데이터를 사용하지만 리스트형에는 중복된 데이터가 존재할 수 있습니다. 만약 이렇게 리스트형 데이터에 중복된 데이터가 있는 경우 해당 데이터를 제거해주고 싶다면, 리스트형의 데이터를 집합형으로 변환하고 다시 리스트형으로 변환해주는 방식으로 간단하게 중복 데이터를 제거해 줄 수 있습니다.

리스트형에서 중복 데이터 제거하기
playlist = ['music1', 'music2', 'music3', 'music4', 'music1', 'music5', 'music2']
playlistSet = set(playlist)
print(playlistSet) # {'music4', 'music2', 'music1', 'music5', 'music3'}

playlist = list(playlistSet)
print(playlist) # ['music4', 'music2', 'music1', 'music5', 'music3']

차집합과 교집합

집합형 데이터를 사용하면 집합형들 간의 차집합이나 교집합을 쉽게 구할 수 있는데, 다음과 같이 두 개의 집합형 데이터가 있을 때 각각의 집합형 데이터로 연산을 수행하면 집합형 데이터 간의 차집합 또는 교집합을 구할 수 있습니다.

집합형 데이터를 이용한 복수 데이터 연산
flavorA = {'apple', 'banana', 'peach'}
flavorB = {'apple', 'peach', 'vanilla'}
resultA = flavorA - flavorB
resultB = flavorA & flavorB
resultC = flavorA ^ flavorB
print(resultA) # {'banana'}
print(resultB) # {'peach', 'apple'}
print(resultC) # {'banana', 'vanilla'}
집합형 데이터의 연산
데이터 연산 설명
A <= B B에 A의 모든 요소가 포함되는지 판단함
A >= B A에 B의 모든 요소가 포함되는지 판단함
A | B A와 B에 포함된 모든 요소를 가진 새로운 집합형 데이터를 생성함
A & B A와 B에 공통으로 포함되는 요소를 가진 새로운 집합형 데이터를 생성함
A – B A에는 포함되지만 B에는 포함되지 않는 요소 가진 새로운 집합형 데이터를 생성함
A ^ B A와 B 중 한 쪽에만 포함되지 않는 요소를 가진 새로운 집합형 데이터를 생성함

Leave a Reply