
파이썬을 다시 공부하면서 input() 예제를 보면 입력창에 숫자를 썼으니 당연히 숫자로 들어올 것 같았습니다. 그런데 막상 더해 보면 20 + 3이 아니라 203이 나옵니다. 처음에는 파이썬이 숫자도 구분하지 못하나 싶지만, 여기에는 사용자의 말을 함부로 추측하지 않으려는 이유가 있습니다.
지난 글에서는 산술·비교·논리 연산자와 우선순위를 배웠습니다. 이번에는 프로그램 밖에 있던 사용자의 값을 안으로 가져오는 input()과, 받은 문자열을 계산할 수 있는 숫자로 바꾸는 형 변환을 알아보겠습니다.
프로그램에 사용자의 값을 연결하려면
지금까지 작성한 코드는 필요한 값이 미리 정해져 있었습니다.
snack_count = 17
people = 5
print(snack_count // people)
간식 수나 사람 수가 바뀔 때마다 코드를 고쳐야 합니다. 프로그램이 실행되는 동안 사용자에게 값을 받으면 같은 코드를 여러 상황에 사용할 수 있습니다.
name = input("이름을 입력하세요: ")
print("안녕하세요,", name)
이름을 입력하세요: 민지
안녕하세요, 민지
input()을 만나면 파이썬은 다음 순서로 움직입니다.
- 괄호 안의 안내 문구를 보여 줍니다.
- 사용자가 글자를 입력하고 Enter를 누를 때까지 기다립니다.
- Enter 앞까지 입력한 내용을 문자열로 돌려줍니다.
- 돌아온 문자열을
name이라는 변수에 연결합니다.
키보드로 들어온 값을 프로그램의 변수에 연결하는 작은 입구가 input()입니다.
input()은 왜 항상 문자열을 돌려줄까?
숫자처럼 보이는 값을 입력해 자료형을 확인해 보겠습니다.
age = input("나이를 입력하세요: ")
print(age)
print(type(age))
나이를 입력하세요: 20
20
<class 'str'>
사용자는 20을 입력했지만 결과의 자료형은 str입니다. input()은 입력 내용을 숫자로 추측하지 않고 일단 글자로 받습니다.
그 이유는 같은 모양도 쓰임에 따라 의미가 달라질 수 있기 때문입니다. 0101은 계산할 숫자일 수도 있지만 비밀번호 일부나 상품 코드일 수도 있습니다. 3.14는 실수처럼 보이지만 버전 이름일 수도 있습니다. 파이썬이 마음대로 의미를 정하면 앞의 0이 사라지거나 원하지 않는 계산이 일어날 수 있습니다.
따라서 input()은 원문을 문자열로 보존하고, 그 값을 숫자로 사용할지는 코드를 작성한 사람이 분명하게 정하도록 합니다.
문자열 숫자를 그대로 계산하면 어떻게 될까?
두 숫자를 입력받아 더해 보겠습니다.
first = input("첫 번째 숫자: ")
second = input("두 번째 숫자: ")
print(first + second)
첫 번째 숫자: 20
두 번째 숫자: 3
203
지난 글에서 문자열의 +는 이어 붙이기라고 배웠습니다. first와 second에는 숫자가 아니라 문자열 "20", "3"이 들어 있으므로 두 글자를 이어 "203"을 만듭니다.
print(type(first))
print(type(second))
<class 'str'>
<class 'str'>
결과가 예상과 다르면 값의 모양만 보지 말고 type()으로 자료형부터 확인하는 습관이 도움이 됩니다.
int()는 정수로 사용할 문자열을 바꾼다
입력한 값을 정수 계산에 사용하려면 int()로 바꿉니다.
first_text = input("첫 번째 숫자: ")
second_text = input("두 번째 숫자: ")
first_number = int(first_text)
second_number = int(second_text)
print(first_number + second_number)
첫 번째 숫자: 20
두 번째 숫자: 3
23
int(first_text)는 문자열 "20"을 정수 20으로 새로 만들어 돌려줍니다. 원래 문자열 자체가 숫자로 변신한다기보다, 문자열을 읽어 같은 의미의 정수 값을 만드는 과정에 가깝습니다.
짧게 한 줄로 작성할 수도 있습니다.
age = int(input("나이를 입력하세요: "))
print("내년 나이:", age + 1)
안쪽의 input()이 먼저 문자열을 돌려주고, 바깥쪽의 int()가 그 문자열을 정수로 바꿉니다. 함수가 겹쳐 있을 때는 가장 안쪽부터 결과를 따라가면 읽기 쉽습니다.
변환 전후를 나눠 쓰면 흐름이 잘 보인다
입문 단계에서는 두 과정을 나누어 쓰는 방법도 좋습니다.
age_text = input("나이를 입력하세요: ")
age = int(age_text)
age_text는 사용자가 입력한 원문이고, age는 계산에 사용할 정수라는 역할이 이름에 드러납니다. 오류가 생겨도 입력과 변환 중 어느 단계인지 살펴보기 쉽습니다.
float()는 소수점이 있는 숫자를 만든다
키나 무게, 온도처럼 소수점이 필요한 값은 float()로 바꿉니다.
height_text = input("키를 cm로 입력하세요: ")
height = float(height_text)
print("입력한 키:", height)
print(type(height))
키를 cm로 입력하세요: 172.5
입력한 키: 172.5
<class 'float'>
정수 모양의 문자열도 float()에 넣으면 실수가 됩니다.
print(float("10"))
10.0
반대로 int("3.5")는 바로 바꿀 수 없습니다. 문자열 전체가 정수 모양이 아니기 때문입니다.
print(int("3.5"))
ValueError: invalid literal for int() with base 10: '3.5'
소수 문자열은 먼저 float()로 읽어야 합니다. 다만 int(3.9)처럼 실수를 정수로 바꾸면 반올림하지 않고 소수 부분을 버립니다.
print(int(3.9))
print(int(-3.9))
3
-3
반올림이 필요한 상황과 단순히 정수 부분만 필요한 상황은 다릅니다. 형 변환은 편리하지만 어떤 정보가 사라지는지도 함께 생각해야 합니다.
str()은 값을 화면에 쓸 문자열로 바꾼다
숫자를 글자와 +로 이어 붙이려면 반대 방향의 변환이 필요합니다.
age = 20
message = "나이는 " + str(age) + "살입니다."
print(message)
나이는 20살입니다.
str(age)는 정수 20을 문자열 "20"으로 만듭니다. 계산할 때는 int나 float, 문장으로 표현할 때는 str이 필요합니다.
여러 값을 단순히 출력할 때는 쉼표를 사용하는 편이 더 간단합니다.
print("나이는", age, "살입니다.")
문자열 안에 값을 자연스럽게 넣는 f-string은 문자열을 자세히 다루는 글에서 이어서 살펴보겠습니다.
형 변환은 값의 사용 설명서를 바꾸는 일이다
앞 글에서 자료형을 값의 사용 설명서라고 표현했습니다. input()이 돌려준 "20"의 설명서는 문자열이므로 이어 붙이기와 같은 문자열 동작을 합니다. int("20")이 만든 20의 설명서는 정수이므로 덧셈과 나눗셈을 할 수 있습니다.
text_value = "20"
number_value = int(text_value)
print(text_value + "3")
print(number_value + 3)
203
23
겉으로 비슷해 보여도 자료형이 다르면 가능한 동작이 달라집니다. 형 변환은 단순히 표시 모양을 바꾸는 것이 아니라, 그 값을 어떤 규칙으로 사용할지 명확하게 정하는 일입니다.
입력과 변환은 가능한 가까이 둔다
숫자로 사용할 입력이라면 받은 직후 변환하면 이후 코드를 읽기 쉽습니다.
price = int(input("가격: "))
count = int(input("수량: "))
total = price * count
print("총금액:", total)
price와 count가 정수라는 사실이 처음부터 분명합니다. 문자열 상태로 여러 줄을 이동한 뒤 나중에 변환하면 어느 변수가 계산 가능한 값인지 계속 기억해야 합니다.
다만 입력한 원문 자체도 필요하다면 price_text처럼 별도 변수에 남겨 두고 변환한 값을 따로 만드는 편이 좋습니다.
간식 나누기 프로그램에 입력을 연결하기
지난 글의 간식 나누기 예제를 사용자와 대화하는 프로그램으로 바꿔 보겠습니다.
snack_count = int(input("간식은 몇 개인가요? "))
people = int(input("몇 명이 나눠 먹나요? "))
snacks_per_person = snack_count // people
leftover_snacks = snack_count % people
print("한 사람당:", snacks_per_person, "개")
print("남는 간식:", leftover_snacks, "개")
간식은 몇 개인가요? 17
몇 명이 나눠 먹나요? 5
한 사람당: 3 개
남는 간식: 2 개
실행 흐름은 다음과 같습니다.
input()이 입력을 문자열로 받습니다.int()가 문자열을 정수로 바꿉니다.//와%가 몫과 나머지를 계산합니다.print()가 결과를 보여 줍니다.
프로그램의 기본 구조인 입력 → 처리 → 출력이 한 코드 안에 연결됐습니다. 지금 예제에는 0보다 큰 정수를 입력해 보세요. 다음 글에서 조건문을 배우면 0명이나 잘못된 범위가 들어왔을 때 계산을 멈추고 안내하는 방법도 만들 수 있습니다.
자주 하는 실수
input() 결과를 바로 숫자와 더하는 경우
age = input("나이: ")
print(age + 1)
age는 문자열이고 1은 정수이므로 TypeError가 발생합니다. int(age) + 1처럼 계산 전에 자료형을 맞춰야 합니다.
숫자처럼 보이면 모두 int()가 된다고 생각하는 경우
"3.5", "스무 살", 빈 문자열은 정수 모양이 아니므로 int()로 변환할 때 ValueError가 발생합니다. 오류를 안전하게 처리하는 try, except는 예외 처리 편에서 자세히 다루겠습니다.
int()가 반올림한다고 생각하는 경우
int(3.9)의 결과는 4가 아니라 3입니다. int()는 실수의 소수 부분을 버리며 음수도 0을 향해 잘립니다.
변수 이름과 자료형의 역할이 어긋나는 경우
문자열을 담은 변수에 count, 변환한 값에 count_text라고 이름 붙이면 읽는 사람이 헷갈립니다. 입력 원문에는 _text, 계산할 값에는 역할 중심의 이름을 사용하면 흐름이 선명해집니다.
직접 바꿔 보며 확인하기
다음 문제는 실행하기 전에 결과를 먼저 예상해 보세요.
- 이름과 좋아하는 음식을 각각 입력받아 한 문장으로 출력합니다.
- 두 정수를 입력받아 합과 곱을 출력합니다.
- 섭씨 온도를 실수로 입력받아
섭씨 × 9 / 5 + 32로 화씨 온도를 계산합니다. - 영화표 가격과 인원수를 입력받아 총금액을 구합니다.
"12" + "3",int("12") + 3,str(12) + "3"의 결과가 왜 다른지 설명합니다.
입력값을 10, 10.5, hello로 바꿔 보며 어떤 변환이 되고 어떤 변환에서 오류가 나는지 비교하면 자료형의 역할이 더 분명해집니다.
정리
input()은 안내 문구를 보여 준 뒤 사용자가 Enter를 누를 때까지 기다리고, 입력한 내용을 문자열로 돌려줍니다. 숫자처럼 보이는 입력도 파이썬이 의미를 추측하지 않기 때문에 str입니다.
정수 계산에는 int(), 소수점이 필요한 계산에는 float(), 값을 글자로 표현할 때는 str()을 사용합니다. 형 변환은 값의 겉모양만 바꾸는 일이 아니라 앞으로 어떤 동작을 허용할지 정하는 과정입니다.
다음 글에서는 비교 결과에 따라 실행할 코드를 고르는 if, elif, else 조건문을 다루겠습니다. 나이, 점수, 입력 범위에 따라 다른 안내를 보여 주는 프로그램으로 이번에 배운 입력과 형 변환을 연결해 보겠습니다.
참고 자료
'파이썬(Python)' 카테고리의 다른 글
| [Python(파이썬)] for문이란? range()와 누적 계산 쉽게 이해하기 (0) | 2026.08.10 |
|---|---|
| [Python(파이썬)] 조건문이란? if·elif·else와 중첩 조건 쉽게 이해하기 (0) | 2026.08.09 |
| [Python(파이썬)] 연산자란? 산술·비교·논리 연산과 우선순위 이해하기 (0) | 2026.08.07 |
| [Python(파이썬)] 기본 자료형이란? int, float, str, bool, None 쉽게 이해하기 (3) | 2026.08.05 |
| [Python(파이썬)] 변수란? 대입문과 이름·객체의 연결 이해하기 (0) | 2026.08.04 |