파이썬으로 코드를 짜다 보면 숫자가 필요한 자리에 문자열이 들어와 있거나, 정수만 있으면 되는데 실수가 넘어오는 상황을 자주 만나게 됩니다. 사용자가 입력한 값, 파일에서 읽어온 값, 웹 API가 돌려준 값은 대부분 문자열이기 때문입니다. 이럴 때 필요한 것이 바로 데이터 타입 변환이고, 파이썬은 이를 위해 int(), float(), str()이라는 세 가지 내장 함수를 제공합니다.
이번 챕터에서는 이 세 함수를 각각 언제, 어떻게 쓰는지, 그리고 변환 과정에서 자주 마주치는 오류를 어떻게 다루는지 실제 코드와 함께 정리해보겠습니다.
핵심 요약
int(), float(), str()은 각각 데이터를 정수, 실수, 문자열로 바꾸는 파이썬 내장 함수입니다. int()는 실수를 정수로 바꿀 때 반올림이 아니라 소수점 아래를 그대로 버립니다. 숫자로 해석할 수 없는 문자열을 int()나 float()에 넣으면 ValueError가 발생하므로 try...except로 방어하는 습관이 필요합니다. str()은 숫자나 다른 자료형을 문자열로 바꿔 출력 형식을 맞추거나 다른 문자열과 이어 붙일 때 사용합니다.
숫자와 문자는 왜 이렇게 다르게 취급될까
파이썬은 숫자형(정수, 실수)과 문자열을 완전히 다른 자료형으로 구분합니다. 겉으로 같은 ‘100’처럼 보여도 100과 "100"은 컴퓨터 내부에서 전혀 다르게 저장됩니다. 아래 코드를 보면 그 차이가 바로 드러납니다.
이 코드가 하는 일: 숫자끼리 더하면 계산이 되고, 문자열끼리 더하면 이어붙이기가 됩니다.
num_a = 100
num_b = 50
print(num_a + num_b) # 150
str_a = "100"
str_b = "50"
print(str_a + str_b) # 10050
# 출력 결과
# 150
# 10050
숫자는 더해지지만 문자열은 그저 붙을 뿐입니다. 이 차이를 모르고 문자열과 숫자를 섞어 연산하려 하면 파이썬은 곧바로 TypeError를 던집니다. 그래서 값의 자료형을 목적에 맞게 바꿔주는 과정, 즉 타입 변환이 필요한 것입니다.
int(): 문자열과 실수를 정수로 바꾸기
int()는 숫자로만 이루어진 문자열이나 실수를 정수로 변환합니다. 파일이나 사용자 입력에서 받은 값은 항상 문자열이기 때문에, 이걸 계산에 쓰려면 먼저 int()를 거쳐야 하는 경우가 많습니다.
이 코드가 하는 일: 숫자로만 이루어진 문자열 “123”을 정수 123으로 바꿉니다.
str_num = "123"
int_num = int(str_num)
print(f"문자열: {str_num} (타입: {type(str_num)})")
print(f"정수: {int_num} (타입: {type(int_num)})")
# 출력 결과
# 문자열: 123 (타입: <class 'str'>)
# 정수: 123 (타입: <class 'int'>)
실수를 정수로 바꿀 때는 ‘버림’
int()에 실수를 넣으면 소수점 이하가 반올림 없이 그대로 잘려나갑니다. 이 점을 헷갈려서 3.9를 4로 예상했다가 3이 나와 당황하는 경우를 종종 봅니다.
이 코드가 하는 일: 3.14와 3.999 모두 소수점 아래가 버려져 3이 됩니다.
float_val_1 = 3.14
float_val_2 = 3.999
print(f"{float_val_1} -> {int(float_val_1)}")
print(f"{float_val_2} -> {int(float_val_2)}")
# 출력 결과
# 3.14 -> 3
# 3.999 -> 3
반올림이 필요하다면 int() 대신 내장 함수 round()를 써야 합니다. 이 둘은 이름은 비슷해 보여도 동작이 완전히 다르니 주의가 필요합니다.
흔한 오류: ValueError
int()는 숫자로 해석할 수 없는 문자열을 만나면 ValueError를 발생시킵니다. 특히 실수 형태의 문자열(“3.14”)을 int()에 바로 넣는 실수를 자주 보게 되는데, 이는 int()가 소수점을 처리하지 못하기 때문입니다.
이 코드가 하는 일: 변환할 수 없는 문자열 세 가지를 각각 시도하고, 발생하는 오류 메시지를 출력합니다.
try:
int("hello")
except ValueError as e:
print(f"오류: {e}")
try:
int("123 ") # 문자열 안에 공백이 섞여 있는 경우
except ValueError as e:
print(f"오류: {e}")
try:
int("3.14") # 실수 형태 문자열은 int()로 바로 변환 불가
except ValueError as e:
print(f"오류: {e}")
# 출력 결과
# 오류: invalid literal for int() with base 10: 'hello'
# 오류: invalid literal for int() with base 10: '123 '
# 오류: invalid literal for int() with base 10: '3.14'
“3.14”처럼 실수 형태의 문자열을 정수로 바꾸고 싶다면 int("3.14")가 아니라 int(float("3.14"))처럼 먼저 float()를 거친 뒤 int()로 한 번 더 변환해야 합니다.
float(): 정수와 문자열을 실수로 바꾸기
float()는 정수나 숫자 형태의 문자열을 실수로 바꿉니다. 정수와 달리 소수점이 포함된 문자열(“3.14”)도 문제없이 처리하기 때문에, 값의 형태가 정수인지 실수인지 확실하지 않을 때는 float()를 먼저 시도하는 것도 방법입니다.
이 코드가 하는 일: 정수와 소수 형태 문자열을 각각 실수로 바꿉니다.
int_num = 10
float_from_int = float(int_num)
str_num = "3.14"
float_from_str = float(str_num)
print(f"{int_num} -> {float_from_int}")
print(f"{str_num} -> {float_from_str}")
# 출력 결과
# 10 -> 10.0
# 3.14 -> 3.14
float() 역시 숫자로 해석할 수 없는 문자열을 만나면 int()와 마찬가지로 ValueError를 발생시킵니다. 그래서 외부에서 받은 값을 변환할 때는 언제나 try...except로 감싸는 것이 안전합니다.
str(): 숫자를 문자열로 바꾸기
반대로 숫자를 문자열과 이어 붙이거나 특정 형식으로 출력해야 할 때는 str()을 씁니다. 숫자와 문자열을 + 연산자로 바로 합치면 TypeError가 나기 때문에, 먼저 숫자를 문자열로 바꿔주어야 합니다.
이 코드가 하는 일: 정수 나이를 문자열로 바꿔 다른 문자열과 이어 붙입니다.
age = 25
message = "제 나이는 " + str(age) + "살입니다."
print(message)
# 출력 결과
# 제 나이는 25살입니다.
물론 요즘 코드에서는 + 연결보다 f-문자열(f"제 나이는 {age}살입니다.")을 더 많이 씁니다. f-문자열 안에서는 파이썬이 값을 자동으로 문자열로 바꿔주기 때문에 str()을 따로 부를 필요가 없습니다. 다만 리스트를 파일에 저장하거나 문자열 연결을 직접 다뤄야 하는 상황에서는 str()이 여전히 자주 쓰입니다.
실전 패턴: 사용자 입력값 안전하게 받기
input()으로 받은 값은 항상 문자열입니다. 그래서 사용자에게 숫자를 입력받아 계산하려면 변환과 예외 처리를 함께 묶어두는 패턴이 유용합니다.
이 코드가 하는 일: 사용자 입력을 정수로 바꾸되, 숫자가 아니면 오류 메시지를 안내합니다.
user_input = input("나이를 입력하세요: ")
try:
age = int(user_input)
print(f"입력하신 나이는 {age}살이군요.")
except ValueError:
print("숫자만 입력해 주세요.")
이렇게 변환과 예외 처리를 짝지어 두면, 사용자가 무엇을 입력하든 프로그램이 갑자기 멈추는 일을 막을 수 있습니다.
변환하기 전에: type()으로 먼저 확인하기
변환 오류를 줄이는 가장 쉬운 습관은, 변환하기 전에 값의 현재 자료형을 type()으로 먼저 들여다보는 것입니다. 특히 외부 라이브러리나 API에서 받아온 값은 눈으로 봤을 때 숫자처럼 보여도 실제로는 문자열인 경우가 많아서, 짐작만으로 변환 코드를 쓰면 나중에 예상치 못한 곳에서 오류가 터집니다.
이 코드가 하는 일: 겉보기에는 숫자 같은 값이지만 실제로는 문자열이라는 것을 type()으로 확인합니다.
price = "15000" # 겉보기엔 숫자지만 실제로는 문자열
print(type(price)) # <class 'str'>
print(isinstance(price, int)) # False
price = int(price)
print(type(price)) # <class 'int'>
print(isinstance(price, int)) # True
# 출력 결과
# <class 'str'>
# False
# <class 'int'>
# True
type()은 값의 정확한 자료형을 그대로 알려주고, isinstance()는 “이 값이 특정 자료형에 속하는가”를 True/False로 알려줍니다. 조건문 안에서 자료형을 검사할 때는 보통 isinstance()가 더 많이 쓰입니다.
여러 값을 한꺼번에 변환하기
실무에서는 값 하나가 아니라 여러 개를 한꺼번에 변환해야 하는 경우가 훨씬 많습니다. 예를 들어 CSV 파일 한 줄을 읽으면 콤마로 구분된 값들이 전부 문자열 리스트로 들어오는데, 이 중 숫자 항목만 골라 정수 리스트로 바꾸는 작업이 자주 필요합니다. 이럴 때는 반복문이나 리스트 컴프리헨션으로 int()를 여러 값에 한 번에 적용할 수 있습니다.
이 코드가 하는 일: 문자열로 이루어진 점수 리스트를 정수 리스트로 한 번에 바꾸고, 합계를 계산합니다.
score_strs = ["88", "95", "72", "100"]
scores = [int(s) for s in score_strs]
print(scores) # [88, 95, 72, 100]
print(sum(scores)) # 355
# 출력 결과
# [88, 95, 72, 100]
# 355
만약 score_strs 리스트 안에 "88" 같은 정상 값이 아니라 "팔십팔"처럼 변환할 수 없는 값이 하나라도 섞여 있으면 리스트 컴프리헨션 전체가 ValueError로 멈춥니다. 그래서 값이 깨끗하다는 확신이 없는 데이터라면, 반복문 안에서 하나씩 try...except로 걸러가며 변환하는 편이 안전합니다.
자주 묻는 질문 (FAQ)
Q. int()와 round()는 뭐가 다른가요?
A. int()는 소수점 아래를 무조건 버리고, round()는 반올림합니다. int(3.9)는 3이지만 round(3.9)는 4입니다.
Q. “3.14”를 정수로 바로 바꿀 수 없나요?
A. int("3.14")는 ValueError가 납니다. int(float("3.14"))처럼 float()를 먼저 거쳐야 합니다.
Q. 문자열에 공백이 섞여 있어도 변환할 수 있나요?
A. 앞뒤 공백은 int(" 123 ")처럼 자동으로 무시되지만, 문자 사이에 공백이 있으면(“1 23”) 여전히 ValueError가 발생합니다.
Q. f-문자열을 쓰면 str()은 필요 없나요?
A. f-문자열 안에서는 자동 변환되므로 대부분 필요 없습니다. 다만 +로 문자열을 직접 이어 붙일 때는 여전히 str()이 필요합니다.
Q. 변환 오류를 미리 막을 방법이 있나요?
A. 문자열이 숫자로만 이루어졌는지 str.isdigit() 등으로 미리 확인하거나, try...except로 감싸 오류가 나도 프로그램이 멈추지 않게 하는 방법이 일반적입니다.
마무리하며
int(), float(), str()은 별것 아닌 것처럼 보여도, 외부에서 들어오는 데이터를 다루는 거의 모든 코드에 등장하는 함수입니다. 특히 int()가 소수점을 버린다는 점, 실수 형태 문자열은 int()로 바로 변환되지 않는다는 점, 변환 실패 시 ValueError가 발생한다는 점만 기억해도 실무에서 마주치는 오류의 상당수를 피할 수 있습니다. 다음 챕터에서는 이렇게 정리한 데이터를 여러 개 묶어서 다루는 방법, 리스트에 대해 알아보겠습니다.
참고 자료
- Python 표준 라이브러리 — 내장 함수 int(), float(), str(): https://docs.python.org/ko/3/library/functions.html
- Python 표준 라이브러리 — 내장 자료형: https://docs.python.org/ko/3/library/stdtypes.html
- Python 공식 튜토리얼 — 오류와 예외 (ValueError): https://docs.python.org/ko/3/tutorial/errors.html
#파이썬데이터타입변환, #파이썬int함수사용법, #파이썬ValueError해결, #파이썬문자열숫자변환, #파이썬float사용법, #파이썬기초, #자료형변환, #파이썬str함수, #파이썬오류처리, #파이썬입문
