간단한 기본 데이터 타입

이 노트북은 제이크 반더플라스(Jake VanderPlas)의 A Whirlwind Tour of Python(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 CC0 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.

< 연산자 | 목차 | 기본 데이터 구조 >

 

파이썬 변수와 객체에 대해 이야기할 때 모든 파이썬 객체는 타입 정보를 포함한다는 사실을 언급했습니다. 이 섹션에서 파이썬에서 제공하는 기본 데이터 타입을 간단히 소개하겠습니다. “간단한 데이터 타입”이라는 것은 다음 섹션에서 이야기할 일부 복합적인 데이터 타입에 대조되는 의미로 사용했습니다.

파이썬의 간단한 데이터 타입은 다음 표에 정리한 것과 같습니다:

파이썬 스칼라(Scalar) 타입

타입 설명
int x = 1 정수
float x = 1.0 부동소수 (즉, 실수)
complex x = 1 + 2j 복소수 (즉, 실수와 허수로 구성된 수)
bool x = True 불리언: True/False 값
str x = 'abc' 문자열: 문자나 텍스트
NoneType x = None null을 의미하는 특별한 객체

차례대로 하나씩 둘러 보겠습니다.

정수

가장 기본적인 수치형 타입은 정수입니다. 소수점이 없는 모든 숫자는 정수입니다:

x = 1
type(x)
int

파이썬 정수는 사실 C같은 언어의 정수보다 훨씬 복잡합니다. C 정수는 정밀도가 고정되어 있어서 어떤 값 이상은 담을 수 없습니다(컴퓨터에 따라서 2^{31}2^{63}). 파이썬 정수는 가변 정밀도를 가지고 있어서 다른 언어라면 오버플로우(overflow)가 날 수 있는 연산을 할 수 있습니다:

2 ** 200
1606938044258990275541962092341162602522202993782792835301376

파이썬 정수의 또 다른 편리한 특징은 기본적으로 나눗셈을 하면 부동소수로 변환해주는 점입니다:

5 / 2
2.5

이런 타입 변환은 파이썬 3의 특징입니다. 파이썬 2에서는 C 같이 정적인 타입을 가진 언어들처럼 정수 나눗셈을 하면 소수 이하는 버리고 정수 부분만 반환합니다:

# Python 2 behavior
>>> 5 / 2
2

파이썬 3에서 이와 같이 하려면 몫 연산자를 사용합니다:

5 // 2
2

마지막으로 파이썬 2.xintlong 타입을 가지고 있지만, 파이썬 3은 이 둘을 하나의 int 타입으로 합쳤습니다.

부동소수

부동소수 타입은 분수를 저장할 수 있습니다. 기본 10진법 표기나 지수 표기를 사용할 수 있습니다:

x = 0.000005
y = 5e-6
print(x == y)
True
x = 1400000.00
y = 1.4e6
print(x == y)
True

지수 표기에서 eE는 “10의 ~ 제곱”로 읽을 수 있습니다. 1.4e61.4 \times 10^6 가 됩니다.

정수는 float 함수를 사용해 부동소수로 강제로 변환할 수 있습니다:

float(1)
1.0

사이드노트: 부동소수점 정밀도

부동소숫점 계산에서 알아야 할 한가지는 정밀도에 한계가 있기 때문에 동일한 값인지 테스트하는 것이 불안정할 수 있습니다. 예를 들어:

0.1 + 0.2 == 0.3
False

왜 이런 일이 생길까요? 이는 파이썬에만 있는 문제가 아니라 이진 부동소수점을 저장하는데 고정 정밀도를 사용하는 전부는 아니더라도 대부분의 과학 컴퓨팅 플랫폼에서 발생합니다. 부동소수를 사용하는 모든 프로그래밍 언어는 한정된 개수의 비트에 이를 저장하므로 일부 숫자는 근사적으로 표현됩니다. 소숫점 이하 정밀도를 높여 확인해 보면 이를 알 수 있습니다:

print("0.1 = {0:.17f}".format(0.1))
print("0.2 = {0:.17f}".format(0.2))
print("0.3 = {0:.17f}".format(0.3))
0.1 = 0.10000000000000001
0.2 = 0.20000000000000001
0.3 = 0.29999999999999999

우리는 숫자를 10진수로 생각하는 게 익숙하므로 분수를 10의 제곱의 합으로 표현할 수 있습니다:

1/8 = 1 \cdot 10^{-1} + 2 \cdot 10^{-2} + 5 \cdot 10^{-3}

이 10진법 표현은 익숙한 십진수가 됩니다: 0.125

컴퓨터는 보통 이진법으로 데이터를 저장하므로 숫자가 2의 제곱의 합으로 표현됩니다:

1/8 = 0 \cdot 2^{-1} + 0 \cdot 2^{-2} + 1 \cdot 2^{-3}

2진법 표현에서 0.001_2 라고 쓸 때 아래 첨자 2는 이진법을 의미합니다. 0.125 = 0.001_2 는 이진법과 십진법을 사용해 한정된 개수의 숫자로 나타낼 수 있는 한 예입니다.

10진법 표현에서 한정된 개수의 숫자로 나타낼 수 없는 값이 있습니다. 예를 들어, 13 으로 나누면 기본 10진수로는 다음과 같습니다:

1 / 3 = 0.333333333 \cdots

3이 계속됩니다. 즉 이를 완벽하게 나타내려면 무한한 개수의 숫자가 필요합니다!

비슷하게 이진 표현으로는 무한한 숫자가 필요한 값이 있습니다. 예를 들어:

1/10 = 0.00011001100110011 \cdots_2

십진수에서 1/3 을 완벽하게 표현하려면 무한한 숫자가 필요하듯이 이진수에서도 1/10 을 표현하려면 무한한 숫자가 필요합니다. 대부분의 시스템에서 파이썬은 내부적으로 이런 표현을 첫 번째 0이 아닌 비트에서부터 52비트까지만 유지합니다.

부동소수의 반올림 오차는 부동소수를 사용하기 위한 필요악입니다. 이에 대해 대처하는 가장 좋은 방법은 부동소수 연산이 근사값이므로 절대로 부동소수를 사용해 같은 값인지를 확인하는 테스트를 해서는 안된다는 사실을 유념하는 것입니다.

복소수

복소수는 실수와 허수부가 있는 숫자입니다. 이전에 정수와 실수를 보았는데 이를 사용해 허수를 만들 수 있습니다:

complex(1, 2)
(1+2j)

다른 방법으로 표현식에서 허수부를 의미하는 “j” 첨자를 사용할 수 있습니다:

1 + 2j
(1+2j)

복소수는 흥미로운 특성과 메서드를 많이 가지고 있습니다. 여기서 조금 둘러 보겠습니다:

c = 3 + 4j
c.real # 실수부
3.0
c.imag # 허수부
4.0
c.conjugate() # 켤레 복소수
(3-4j)
abs(c) # 크기, 즉 sqrt(c.real ** 2 + c.imag ** 2)
5.0

문자열 타입

파이썬에서 문자열은 단일 따옴표나 이중 따옴표로 만들어 집니다:

message = "what do you like?"
response = 'spam'

파이썬에는 아주 유용한 문자열 함수들과 메서드들이 많이 있습니다. 그중에 몇 개를 살펴 보겠습니다:

# 문자열의 길이
len(response)
4
# 대문자로 만듭니다. str.lower()도 확인해 보세요.
response.upper()
'SPAM'
# 첫 문자를 대문자로 만듭니다. str.title()도 확인해 보세요.
message.capitalize()
'What do you like?'
# + 으로 문자열을 연결합니다
message + response
'what do you like?spam'
# 곱셈은 문자열을 여러번 잇습니다
5 * response
'spamspamspamspamspam'
# 개개의 문자에 접근합니다(0이 시작 인덱스)
message[0]
'w'

파이썬의 인덱싱에 대해서는 기본 데이터 구조의 리스트 부분을 참고하세요.

None 타입

파이썬에는 NoneType이라는 특별한 타입이 포함되어 있습니다. 이 타입의 값은 None 하나만 가능합니다. 예를 들면:

type(None)
NoneType

None이 여러 곳에서 사용되지만 아마 가장 흔한 곳은 함수의 기본 반환 값에 사용되는 것입니다. 예를 들어 파이썬 3의 print() 함수는 아무 것도 반환하지 않지만 값을 받도록 쓸 수 있습니다:

return_value = print('abc')
abc
print(return_value)
None

이와 비슷하게 파이썬에서 반환값이 없는 함수는 실제로 None을 반환합니다.

불리언 타입

불리언 타입은 TrueFalse 값을 가질 수 있는 간단한 타입이고 이전에 설명한 것처럼 비교 연산자에 의해 반환되는 값입니다:

result = (4 < 5)
result
True
type(result)
bool

불리언 값은 다른 언어와는 달리 대소문자를 구별하므로 TrueFalse의 첫 글자는 반드시 대문자여야 합니다!

print(True, False)
True False

불리언은 bool() 함수를 사용하여 만들 수도 있습니다. 일정 규칙 하에서 다른 타입의 값을 불리언으로 변경합니다.  예를 들어, 숫자 0은 False이고 그외에는 True입니다:

bool(2014)
True
bool(0)
False
bool(3.1415)
True

None을 불리언으로 변환하면 항상 False입니다:

bool(None)
False

문자열일 경우 빈 문자열이면 bool(s)가 False이고 그 외에는 True입니다:

bool("")
False
bool("abc")
True

다음 섹션에서 볼 시퀀스 타입일 경우 시퀀스에 값이 없으면 False이고 그 외에는 True가 됩니다.

bool([1, 2, 3])
True
bool([])
False

 

< 연산자 | 목차 | 기본 데이터 구조 >

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.