3. 기초 자료형#

파이썬은 다양한 기초 자료형을 기본으로 제공하며 크게 스칼라 자료형과 모음 자료형으로 나뉜다.

정수, 부동 소수점, 부울값(TrueFalse), 문자열, 날짜와 시간 등처럼 단일한 값의 자료형이 스칼라scalar 자료형이며, 리스트, 튜플, 사전 등은 모음collections 자료형이다.

먼저 스칼라 자료형을 살펴 보고 모음 자료형에서 모음 자료형을 소개한다.

문자열 자료형

문자열은 언어에 따라 스칼라 자료형 또는 모음 자료형으로 간주된다. 예를 들어, C 언어에서는 문자열(str)을 문자(chr)로 이루어진 어레이로 정의하기에 모음 자료형으로 다뤄야 한다.

반면에 파이썬에서는 문자 자료형이 별도로 없다. 그리고 문자열을 문자들의 모음으로 간주하기도 한다. 이는 모음 자료형이 지원하는 인덱싱, 슬라이싱, for 반복문 활용 등을 문자열 자료형 또한 지원하기 때문이다.

3.1. 정수 자료형: int#

int는 정수 자료형이다.

ival = 17239871

ival ** 6  # ival의 6승
26254519291092456596965462913230729701102721

3.2. 부동 소수점 자료형: float#

float는 유리수 자료형이다.

fval = 7.243

나눗셈은 부동 소수점으로 계산된다.

3 / 2
1.5

몫은 정수형으로 계산된다.

3 // 2
1

과학자들이 사용하는 표기법도 사용할 수 있다.

fval2 = 6.78e-5 # 6.78 곱하기 10의 -5승

fval2
6.78e-05

부동 소수점

부동 소수점floating point이란 표현은 컴퓨터가 실수를 유한 소수로 처리할 때 소수점 이하를 제대로 다루지 못하기 데서 연유한다.

실제로 컴퓨터의 한계로 인해 소수점 이하 특정 자릿수에서 반올림한 결과를 이용하여 연산을 수행하기에 무리수 등을 다룰 때 결과에 실제 값과 오차가 발생한다.

3.3. 문자열 자료형: str#

따옴표

문자열은 작은따옴표(') 또는 큰따옴표(")를 감싸며, 따옴표의 종류는 아무 상관이 없다. 단, 동종의 따옴표로 감싸야 한다는 점에 주의해야 한다.

a = '작은따옴표를 사용하는 문자열'
b = "큰따옴표를 사용하는 문자열"

여러 줄로 이루어진 문자열은 삼중 큰따옴표로 감싼다.

c = """여러 줄에 걸친 문자열은
삼중 큰따옴표로 감싼다.
"""

문자열 메서드

문자열 자료형은 다양한 메서드를 제공한다. 예를 들어, 문자열이 몇 줄로 이루어졌는가를 확인하려면 count() 메서드를 이용하여 줄바꿈 기호(\n)가 사용된 횟수를 세면 된다.

c.count('\n')
2

문자열은 불변immutable 객체이다. 아래 코드는 인덱싱을 이용한 특정 문자의 대체가 허용되지 않음을 보여준다.

In [10]: a[10] = 'f'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-2151a30ed055> in <module>
----> 1 a[10] = 'f'

TypeError: 'str' object does not support item assignment

따라서 replace()처럼 문자열을 변경하는 메서드는 새로운 문자열을 생성하는 데에 사용된다.

아래 코드는 a가 가리키는 문자열에서 작은따옴표작은 인용부호로 대체하는 새로운 문자열을 생성하는 것을 보여준다.

d = a.replace('작은따옴포', '작은 인용부호')
d
'작은따옴표를 사용하는 문자열'

변수 a가 가리키는 값은 변하지 않았다.

a
'작은따옴표를 사용하는 문자열'

str() 함수

파이썬 객체를 str() 함수를 이용하여 문자열로 변환할 수 있다.

a = 5.6
s = str(a)

type(s)
str

자료형 str 대 함수 str

str은 문자열 자료형 또는 함수를 가리킬 수 있다. 혼동을 피하기 위해 함수로 사용되는 경우 str()처럼 괄호를 함께 사용하는 게 좋다.

문자열 인덱싱, 슬라이싱

문자열 자료형이 리스트, 튜플 등처럼 일종의 순차 자료형, 즉, 순서가 있는 모음 자료형으로 취급되며, 인덱싱, 슬라이싱 기능 등이 모두 지원된다.

인덱싱과 슬라이싱 등에 대해서 모음 자료형에서 자세히 다룬다.

s = 'python'
s[1]
'y'
s[:3]
'pyt'

백슬래시(\)의 특수 기능

백슬래시(\)와 원화 통화기호(₩)

윈도우 운영체제의 웹브라우저에서는 백슬래시(\)가 원화 통화기호(₩) 모양으로 보이지만, 동일하게 기능한다.

역슬래시 문자(\)는 특수한 기능을 수행한다. 예를 들어, 줄바꿈을 의미하는 문자 \n, 탭을 의미하는 문자 \t 등에서 역슬래시가 특수한 기능을 수행한다. 따라서 역슬래시 자체를 문자열에 포함할 때 조심해야 한다.

예를 들어, 아래와 같은 문자열을 사용하려 해보자.

"12\34"

그런데 그냥 아래와 같이 지정하면 다르게 작동한다.

s = '12\34'

print(s)
12

이유는 \3이 특수한 문자를 표현하도록 역슬래시가 기능하기 때문이다. (아래 유니코드 설명 참조)

s = '\3'

print(s)


따라서 12\34로 출력되게 하려면 역슬래시의 기능을 해제해야 하며, 그러기 위해 역슬래시를 두 번 적어주면 된다. 그러면 첫째 역슬래시 뒤에 나오는 역슬래시의 특수 기능을 해제시킨다.

이스케이프

특정 기능을 작동하지 못하도록 하는 것을 영어로 이스케이프(escape)라고 한다. 예를 들어, 역슬래시의 특수 기능을 이스케이프 시킨다 라고 말할 수 있다.

s = '12\\34'

print(s)
12\34

그런데 문자열 안에 많은 역슬래시가 포함되어 있다면 이런 방식은 매우 불편하다. 하지만 문자열 앞에 영어 알파벳 r을 추가하면 간단하게 해결된다.

s = r'this\has\no\special\characters'

print(s)
this\has\no\special\characters

문자열 연산

두 문자열을 더하면 두 문자열을 이어붙인다.

a = 'this is the first half '
b = 'and this is the second half'

a + b
'this is the first half and this is the second half'

문자열과 정수를 곱하면 해당 정수 횟수만큼 복제하여 이어붙인다.

a * 2
'this is the first half this is the first half '

문자열 템플릿

문자열 템플릿은 문자열 안에 일부 변하는 값을 지정할 수 있도록 선언된 문자열이다. 예를 들어, 아래 문자열 템플릿은 세 개의 값을 임의로 지정할 수 있도록 준비되어 있다.

template = '{0:.2f} {1:s}{2:d} 미국달러에 해당한다.'

문자열 템플릿에 지정된 수 만큼의 값을 format() 메서드를 이용하여 입력하여 새로운 문자열을 생성할 수 있다. 단, format() 메서드에 사용되는 인자의 순서는 지정된 순서대로 정해져야 한다.

예를 들어, template 변수가 가리키는 문자열 템플릿의 세 위치에 차례대로 부동 소수점, 문자열, 정수를 입력해야 하며, 아래와 같이 차례대로 인자로 사용하면 된다.

template.format(4.5560, '아르헨티나 페소', 1)
'4.56 아르헨티나 페소는 1 미국달러에 해당한다.'

중괄호 안에 사용된 숫자와 기호의 의미는 다음과 같다.

  • 0:.2fformat() 메서드의 첫째 인자인 부동 소수점이 자리하며 소수점 이하 두 자리까지 표기

  • 1:sformat() 메서드의 둘째 인자인 문자열이 자리하는 자리

  • 2:dformat() 메서드의 셋째 인자인 정수가 위치하는 자리

콜론(:)을 포함하여 그 이후에 해당하는 부분은 입력될 값들의 자료형을 안내하는 역할을 수행한다. 하지만 의무사항은 아니며 다만, 사용되는 값에 대한 정보를 제공하거나 아니면 보다 서식을 갖춘 문자열이 출력하도록 사용된다.

template = '{0} {1}{2} 미국달러에 해당한다.'

template.format(4.5560, '아르헨티나 페소', 1)
'4.556 아르헨티나 페소는 1 미국달러에 해당한다.'

f-문자열

format() 메서드를 사용하는 대신에 요즘에는 f-문자열을 보다 많이 사용한다. 이유는 보다 편리한 사용성 때문이다. f-문자열은 문자열 앞에 영어 알파벳 f를 추가하기만 하면 되며 문자열 안에 변수를 중괄호로 감싸 직접 대입한다.

a = 4.5560
b = '아르헨티나 페소'
c = 1
template = f'{a} {b}{c} 미국달러에 해당한다.'

template
'4.556 아르헨티나 페소는 1 미국달러에 해당한다.'

문자열 템플릿에서처럼 변수가 가리키는 값에 서식을 지정할 수 있다.

template = f'{a:.2f} {b:s}{c:d} 미국달러에 해당한다.'

template
'4.56 아르헨티나 페소는 1 미국달러에 해당한다.'

3.4. 유니코드와 바이트#

유니코드unicode는 순전히 키보드만을 이용하여 문자를 표현하는 코드표 모음집이며 영어 알파벳과 한글을 포함하여 거의 모든 언어의 문자를 지원한다. 파이썬 또한 유니코드를 기본적으로 지원한다.

반면에 바이트bytes는 문자가 컴퓨터가 이해할 수 있는 형태로 변환된 값이다. 유니코드를 바이트로 인코딩(변환, encoding)하는 방식은 일반적으로 UTF-8 방식을 따른다. 반면에 한글에 특화된 인코딩 방식으로 EUC-KR, CP-949 등이 있다. 따라서 사용하는 웹브라우저에서 한글 또는 특수 문자가 깨져 보이는 경우 언급한 세 가지 인코딩 방식 중 하나로 설정해야 한다. 요즘은 UTF-8 인코딩이 대세이지만 다른 인코딩 방식도 존재한다는 사실 정도는 상식으로 알고 있어야 한다.

예를 들어, 아래는 스페인어(Spanish)를 의미하는 스페인 단어 “español”를 가리키는 변수를 선언한다.

val = "español"
val
'español'

UTF-8 방식으로 바이트로 인코딩하면 사람은 알아볼 수 없게 된다.

val_utf8 = val.encode('utf-8')
val_utf8
b'espa\xc3\xb1ol'

인코딩된 값의 자료형은 bytes이다.

type(val_utf8)
bytes

인코딩 방식을 안다면 유니코드로 디코딩decoding(변환 되돌리기)할 수 있다.

val_utf8.decode('utf-8')
'español'

파일 객체와 bytes

bytes 자료형의 객체는 파일file 다루면서 흔하게 접한다.

3.5. 부울 자료형: bool#

True 또는 False로 계산되는 객체(값)이 부울 자료형 bool에 속한다. 부울 자료형과 관려된 연산자는 논리곱 연산자 and, 논리합 연산자 or가 대표적이며, 두 연산자의 기능은 일반적으로 알려진 것과 동일하다.

True and True
True
False or True
True

비교 연산자

비교 연산의 결과는 모두 부울값이다.

비교 연산자

설명

a == b

a와 b가 동일한 값을 가리키는지 여부 판단

a != b

a와 b가 서로 다른 값을 가리키는지 여부 판단

a < b

a가 b보다 작은지 여부 판단

a <= b

a가 b보다 작거나 같은지 여부 판단

a > b

a가 b보다 큰지 여부 판단

a >= b

a가 b보다 크거나 같은지 여부 판단

a is b

a와 b가 동일한 위치에 저장된 값을 참조하는지 여부 판단

a is not b

a와 b가 다른 위치에 저정된 값을 참조하는지 여부 판단

세 개의 수가 주어졌을 때 양수가 최소 하나라도 있는 경우에만 True를 출력하도록 하는 코드는 다음과 같다.

a = -23
b = -7
c = 1

if a > 0 or b > 0 or not c <= 0:
    print(True)
else:
    print(False)
True

이에 더해 문자열, 리스트, 튜플, 사전 등 모음 자료형에 특정 값을 포함하는지 여부를 판단하는 in 연산자도 부울 자료형을 생성한다.

a = [1, 2, 3]
b = 3

b in a
True

not inin과 정반대 결과를 낸다.

(b in a) and (4 not in a)
True

3.6. 형 변환#

앞서 살펴 본 str()는 임의의 값을 문자열로 자료형을 변환한다. 이처럼 자료형을 변환하는 작업을 형 변환type casting이라 한다. str() 이외에 bool(), int(), float() 등도 형 변환 함수이며 인자로 들어온 값을 각각 부울, 정수, 부동 소수점으로 변환한다.

s = '3.14159'
fval = float(s)
fval
3.14159
type(fval)
float

int() 함수는 부동 소수점에서 소수점 이하를 버리고 정수를 반환한다.

int(fval)
3

int() 함수는 문자열도 직접 정수로 반환한다.

int('334')
334

단, 인자로 사용된 값에 따라 오류가 발생할 수 있다. 예를 들어 str() 함수의 인자로 사용된 문자열이 정수 형식이 아니면 오류가 발생한다.

In [8]: int(s)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-2c4720ab420a> in <module>
----> 1 int(s)

ValueError: invalid literal for int() with base 10: '3.14159'

bool() 함수는 0에 대해서만 False를 반환한다.

bool(fval)
True
bool(0)
False
bool(-1)
True

3.7. None#

None은 어떤 의미도 없는 값, 소위 널(null)값이며, 문법적으로 NoneType 자료형의 유일한 값이다.

type(None)
NoneType
a = None
a is None
True
b = 5
b is not None
True

None 활용법

함수를 정의할 때 함수의 인자가 경우에 따라 추가될 수 있을 때를 대비해서 키워드 인자로 사용되곤 한다. 예를 들어, 아래 add_and_maybe_multiply() 함수의 셋째 인자는 기본적으로 None 이지만, 경우에 따라 다른 값을 지정하여 사용할 수 있도록 활용되고 있다.

def add_and_maybe_multiply(a, b, c=None):
    result = a + b

    if c is not None:
        result = result * c

    return result

키워드 인자를 별도로 지정하지 않으면 지정된 값을 사용한다.

add_and_maybe_multiply(2, 3)  # 2 + 3 
5

키워드 인자를 별도로 지정하면 그 값을 사용한다.

add_and_maybe_multiply(2, 3, 4) # (2 + 3) * 4
20

3.8. 날짜와 시간#

datetime 모듈은 날짜와 시간과 관련된 유용한 클래스를 제공한다. 대표적으로 아래 세 개의 클래스가 활용된다.

  • datetime: 날짜와 시간

  • date: 날짜

  • time: 시간

from datetime import datetime, date, time

년-월-일-시-분-초 정보를 담은 객체는 아래와 같이 생성한다.

dt = datetime(2021, 3, 2, 17, 5, 1)

datetime 객체는 년-월-일-시-분-초를 각각 따로 제공하는 속성 변수를 갖고 있다. 예를 들어, 일(day) 속성은 아래와 같이 확인한다.

dt.day
2

분(minute) 속성은 다음과 같이 확인한다.

dt.minute
5

날짜 정보만 갖는 date 클래스의 객체로의 변환은 date() 메서드를 이용한다.

dt.date()
datetime.date(2021, 3, 2)

시간 정보만 갖는 time 클래스의 객체로의 변환은 time() 메서드를 이용한다.

dt.time()
datetime.time(17, 5, 1)

일상적으로 사용하는 날짜-시간 표기법으로 변환하려면 strftime() 메서드를 이용한다. 단, 인자로 어떤 포맷(format)을 따를지 지정해야 한다.

예를 들어, 서양식은 24시간 형식을 따르면서, 요일, 달-일-년 시:분으로 많이 보여준다.

dt.strftime('%A, %m/%d/%Y %H:%M')
'Tuesday, 03/02/2021 17:05'

반면에 한국식은 오전/오후를 구분하여 12시간제를 따르면서, 년-월-일(요일) 시:분으로 많이 보여준다.

dt.strftime('%Y/%m/%d(%A) %I:%M%p')
'2021/03/02(Tuesday) 05:05PM'

datetime 모듈 공식 문서

날짜와 시간과 관련해서 제공되는 보다 다양한 포맷format에 대한 정보는 datetime 모듈의 공식문서에서 확인할 수 있다.

strptime() 함수는 문자열을 해석하여 datetime 클래스의 객체로 변환한다. 대신에 입력된 문자가 어떤 포맷을 따르는가에 대한 정보를 둘째 인자로 함께 전달해야 한다. 0초는 보여주지 않음에 주의한다.

datetime.strptime('20200228', '%Y%m%d')
datetime.datetime(2020, 2, 28, 0, 0)

datetime 클래스의 객체는 불변(immutable)이다. 하지만 문자열의 경우와 비슷하게 특정 값을 이용하여 새로운 datetime 클래스의 객체를 생성할 수는 있다. 예를 들어, replace() 메서드는 년, 월, 일, 시, 분, 초 각각의 값을 다른 값으로 지정하여 새로운 datetime 클래스의 객체를 생성한다.

아래 예제는 분과 초를 모두 0으로 설정하여 새로운 datetime 객체를 생성한다.

dt.replace(minute=0, second=0)
datetime.datetime(2021, 3, 2, 17, 0)

datetime 객체의 차(difference)는 일(days)과 초(seconds) 단위로 계산되어 timedelta 클래스의 객체를 반환한다.

dt2 = datetime(2021, 6, 15, 23, 59)
delta = dt2 - dt
delta
datetime.timedelta(days=105, seconds=24839)
type(delta)
datetime.timedelta

실제로 dt + deta == dt2는 참이된다.

dt
datetime.datetime(2021, 3, 2, 17, 5, 1)
dt + delta == dt2
True