
파이썬을 오랜만에 다시 공부하다 보니, 예전에 외웠던 int, str 같은 이름보다 “왜 값을 굳이 종류별로 나눌까?”라는 질문이 먼저 떠올랐습니다. 자료형을 단어 목록처럼 외우면 금방 헷갈리지만, 값마다 할 수 있는 일이 다르다고 생각하면 훨씬 이해하기 쉽습니다.
지난 글에서는 변수를 값에 붙이는 이름표로 이해하고 대입문이 움직이는 순서를 살펴봤습니다. 이번에는 그 이름표가 가리키는 값의 종류인 자료형을 알아보겠습니다. 정수 int, 실수 float, 문자열 str, 참·거짓 bool, 값이 없음을 나타내는 None을 일상적인 예제로 하나씩 구분해 보겠습니다.
자료형은 왜 필요할까?
다음 두 값은 눈으로 보면 모두 3입니다.
number = 3
text = "3"
print(number + number)
print(text + text)
6
33
따옴표가 없는 3은 계산할 수 있는 숫자이고, 따옴표로 감싼 "3"은 글자입니다. 그래서 +를 사용했을 때 숫자는 더해지고 문자열은 이어 붙습니다.
자료형은 값에 붙은 사용 설명서와 비슷합니다. 파이썬은 자료형을 보고 이 값으로 계산할 수 있는지, 글자를 이어 붙일 수 있는지, 참과 거짓을 판단할 수 있는지 결정합니다. 모양이 비슷해도 자료형이 다르면 가능한 동작과 결과가 달라집니다.
type()으로 값의 종류 확인하기
값의 자료형이 헷갈릴 때는 내장 함수 type()으로 확인할 수 있습니다.
age = 20
temperature = 23.5
name = "민지"
is_student = True
coupon = None
print(type(age))
print(type(temperature))
print(type(name))
print(type(is_student))
print(type(coupon))
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>
처음에는 <class ...>라는 표시가 낯설 수 있습니다. 지금은 각각 “이 값의 종류는 int다”, “이 값의 종류는 str이다”라고 읽으면 충분합니다. type()은 값을 다른 종류로 바꾸는 기능이 아니라 현재 종류를 확인하는 돋보기입니다.
int는 소수점이 없는 정수다
int는 integer의 줄임말로, 소수점이 없는 정수를 나타냅니다. 양수와 음수, 0을 모두 포함합니다.
student_count = 28
floor = -1
empty_seat_count = 0
print(student_count)
print(type(student_count))
28
<class 'int'>
사람 수, 주문 수량, 점수처럼 하나씩 셀 수 있는 값에 잘 어울립니다. 28명처럼 중간에 반 명이 생기지 않는 값이라면 정수로 표현하는 것이 자연스럽습니다.
파이썬의 정수에는 다른 언어처럼 정해진 작은 범위가 있는 것이 아니라, 사용할 수 있는 메모리가 허용하는 범위에서 큰 수도 다룰 수 있습니다. 입문 단계에서는 숫자 크기보다 소수점이 필요한 값인지를 먼저 판단하면 됩니다.
float는 소수점이 있는 수다
float는 소수점이 있는 수를 나타냅니다.
temperature = 23.5
average_score = 87.25
print(temperature)
print(type(average_score))
23.5
<class 'float'>
온도, 평균, 비율처럼 정수 사이의 값까지 표현해야 할 때 사용합니다. 23.0처럼 소수 부분이 0이어도 소수점을 적으면 float입니다.
소수 계산이 가끔 딱 맞지 않는 이유
컴퓨터는 많은 소수를 2진수로 바꾸어 근삿값으로 저장합니다. 그래서 다음처럼 예상보다 긴 결과가 나타날 수 있습니다.
print(0.1 + 0.2)
0.30000000000000004
파이썬이 덧셈을 틀린 것이 아니라, 0.1과 0.2를 컴퓨터 안에서 정확히 표현하기 어려워 생기는 작은 차이입니다. 지금은 float가 소수를 근사해서 저장할 수 있다는 점만 알아두면 됩니다. 돈처럼 오차에 민감한 계산은 나중에 목적에 맞는 방법을 따로 선택합니다.
str은 글자의 순서를 기억한다
str은 string의 줄임말로, 글자들이 순서대로 이어진 문자열을 나타냅니다. 큰따옴표나 작은따옴표로 감싸서 만듭니다.
name = "민지"
menu = '아메리카노'
phone_prefix = "010"
print(name)
print(type(phone_prefix))
민지
<class 'str'>
"010"은 숫자처럼 보이지만 따옴표 안에 있으므로 문자열입니다. 전화번호, 우편번호, 학번처럼 계산보다 표시와 구분이 중요한 값은 숫자 모양이어도 문자열이 더 자연스럽습니다. 앞의 0도 그대로 보존할 수 있습니다.
문자열끼리 +를 사용하면 글자가 이어집니다.
first_name = "하늘"
greeting = "안녕하세요, " + first_name
print(greeting)
안녕하세요, 하늘
숫자 3과 문자열 "3"을 구분하는 이유도 여기에 있습니다. 하나는 계산 재료이고, 다른 하나는 화면에 보여 줄 글자 재료입니다.
bool은 두 가지 대답을 표현한다
bool은 어떤 질문에 대한 참과 거짓을 나타냅니다. 사용할 수 있는 값은 True와 False 두 가지입니다.
is_member = True
is_sold_out = False
print(is_member)
print(type(is_sold_out))
True
<class 'bool'>
“회원인가?”, “품절됐는가?”, “로그인했는가?”처럼 예 또는 아니오로 답할 수 있는 상태에 잘 어울립니다. 변수 이름을 is_member, has_coupon처럼 질문으로 읽히게 지으면 True와 False의 의미도 분명해집니다.
True와 False의 첫 글자는 반드시 대문자입니다. "True"처럼 따옴표로 감싸면 참을 나타내는 불리언이 아니라 네 글자로 된 문자열이 됩니다. 다음에 조건문을 배우면 이 두 값에 따라 실행할 코드를 선택하게 됩니다.
None은 0도 빈 글자도 아니다
None은 현재 가리킬 값이 없음을 나타내는 특별한 값입니다.
coupon_code = None
print(coupon_code)
print(type(coupon_code))
None
<class 'NoneType'>
온라인 주문을 시작했지만 아직 쿠폰을 선택하지 않은 상황을 떠올려 보세요. 쿠폰 할인액이 0원이라는 뜻과 쿠폰 정보가 아직 없다는 뜻은 다릅니다. None은 두 번째 상황을 표현합니다.
0: 숫자 값이 0입니다."": 글자 수가 0인 빈 문자열입니다.False: 질문에 대한 답이 거짓입니다.None: 아직 값이 없거나 정해지지 않았습니다.
서로 비슷하게 “비어 보이는” 값이지만 의미와 자료형은 다릅니다. None도 "None"처럼 따옴표로 감싸면 특별한 값이 아니라 글자가 됩니다.
자료형은 변수 이름이 아니라 값에 있다
앞 글에서 변수는 값에 붙이는 이름표라고 했습니다. 자료형 역시 이름표 자체가 아니라 그 이름표가 현재 가리키는 값에 있습니다.
value = 10
print(type(value))
value = "열"
print(type(value))
<class 'int'>
<class 'str'>
같은 value라는 이름이 처음에는 정수를 가리키고, 다음에는 문자열을 가리킵니다. 파이썬은 대입할 때 변수의 자료형을 미리 선언하지 않아도 됩니다.
문법상 이렇게 바꿀 수 있다고 해서 언제나 좋은 코드는 아닙니다. price가 어느 줄에서는 숫자였다가 갑자기 글자가 되면 계산할 때 혼란이 생깁니다. 한 변수는 가능한 한 같은 역할의 값을 가리키게 작성하는 편이 읽고 고치기 쉽습니다.
자료형이 다르면 왜 오류가 날까?
정수와 문자열을 바로 더해 보겠습니다.
age = 20
message = "나이: " + age
TypeError: can only concatenate str (not "int") to str
파이썬은 문자열을 이어 붙여야 할지 숫자를 계산해야 할지 마음대로 추측하지 않습니다. 서로 맞지 않는 자료형의 동작을 요청했기 때문에 TypeError로 알려 줍니다.
오류가 보이면 먼저 type()으로 양쪽 값의 종류를 확인해 보세요. 값을 다른 자료형으로 바꾸는 방법은 입력과 형 변환을 다룰 글에서 자세히 알아보겠습니다. 지금은 오류 메시지를 없애는 것보다 각 값이 어떤 역할이어야 하는지 판단하는 것이 먼저입니다.
작은 주문 정보표 만들기
지금까지 배운 변수와 다섯 자료형을 한곳에 모아 보겠습니다.
menu_name = "아메리카노"
unit_price = 4500
temperature = 68.5
is_takeout = True
coupon_code = None
print("메뉴:", menu_name, type(menu_name))
print("가격:", unit_price, type(unit_price))
print("음료 온도:", temperature, type(temperature))
print("포장 여부:", is_takeout, type(is_takeout))
print("쿠폰:", coupon_code, type(coupon_code))
메뉴: 아메리카노 <class 'str'>
가격: 4500 <class 'int'>
음료 온도: 68.5 <class 'float'>
포장 여부: True <class 'bool'>
쿠폰: None <class 'NoneType'>
메뉴 이름은 글자이므로 str, 가격은 원 단위 정수이므로 int, 온도는 소수점이 필요해 float를 사용했습니다. 포장 여부는 예·아니오 상태라 bool, 아직 선택하지 않은 쿠폰은 None입니다.
자료형을 정할 때는 값의 겉모양보다 프로그램에서 맡을 역할을 물어보면 좋습니다. 계산할 값인가, 표시할 글자인가, 두 가지 상태인가, 아직 정해지지 않은 값인가를 판단하면 선택이 쉬워집니다.
자주 하는 실수
숫자 모양의 문자열을 숫자로 생각하는 경우
"5000"은 따옴표 안에 있으므로 계산용 정수가 아닙니다. 코드를 읽을 때 따옴표부터 확인합니다.
true와 false를 소문자로 쓰는 경우
파이썬의 불리언은 True, False입니다. 소문자로 쓰면 파이썬은 true라는 변수 이름을 찾다가 NameError를 냅니다.
None을 따옴표로 감싸는 경우
None은 값이 없음을 나타내지만 "None"은 네 글자로 된 문자열입니다. 출력 모양이 비슷해도 type()으로 확인하면 다릅니다.
float는 모든 소수를 정확히 저장한다고 생각하는 경우
대부분의 일상 계산에는 충분하지만, 일부 소수는 컴퓨터 내부에서 근삿값으로 저장됩니다. 결과에 아주 작은 차이가 보이면 계산 순서와 함께 자료형의 특성도 떠올려 봅니다.
직접 바꿔 보며 확인하기
다음 값을 변수로 만들고 type()으로 종류를 확인해 보세요.
- 읽은 책의 권수
- 오늘의 체온
- 좋아하는 책 제목
- 책을 다 읽었는지 여부
- 아직 정하지 않은 다음 책
그다음 3 + 3과 "3" + "3"의 결과를 먼저 예상한 뒤 실행해 보세요. 0, "", False, None도 각각 출력하고 같은 값인지가 아니라 어떤 상황을 표현하는지 말로 설명해 보면 자료형의 차이가 더 오래 기억됩니다.
정리
자료형은 값이 어떤 종류이고 어떤 동작을 할 수 있는지 정하는 사용 설명서입니다. int는 소수점이 없는 정수, float는 소수점이 있는 수, str은 따옴표로 감싼 문자열을 나타냅니다. bool은 True와 False 두 상태를, None은 값이 아직 없음을 표현합니다.
변수 이름에 자료형이 고정되는 것이 아니라, 변수가 현재 가리키는 값에 자료형이 있습니다. 종류가 헷갈릴 때는 type()으로 확인할 수 있습니다. 중요한 것은 문법 이름을 외우는 데 그치지 않고 그 값이 계산, 표시, 상태, 미정 정보 중 어떤 역할을 맡는지 생각하는 것입니다.
다음 글에서는 이 값들을 실제로 계산하고 비교하는 연산자를 다루겠습니다. 산술·비교·논리 연산자가 어떤 순서로 실행되고, 자료형에 따라 같은 기호의 의미가 어떻게 달라지는지 알아보겠습니다.
참고 자료
'파이썬(Python)' 카테고리의 다른 글
| [Python(파이썬)] 조건문이란? if·elif·else와 중첩 조건 쉽게 이해하기 (0) | 2026.08.09 |
|---|---|
| [Python(파이썬)] input()이란? 사용자 입력과 int·float 형 변환 쉽게 이해하기 (0) | 2026.08.08 |
| [Python(파이썬)] 연산자란? 산술·비교·논리 연산과 우선순위 이해하기 (0) | 2026.08.07 |
| [Python(파이썬)] 변수란? 대입문과 이름·객체의 연결 이해하기 (0) | 2026.08.04 |
| [Python(파이썬)] 첫 시작: print(), 주석, 들여쓰기와 코드 실행 순서 (0) | 2026.08.03 |