HOWTO · Python

파이썬에서 사용자 입력을 정수로 읽는 방법

Python 3에서 사용자 입력을 정수로 읽는 방법: int(input())으로 단일 값을 변환하고, split()과 map()으로 한 줄에서 여러 정수를 읽으며, try-except로 잘못된 입력을 처리합니다.

이 페이지의 내용

Python 3에서 input() 함수는 항상 문자열을 반환합니다. 입력된 값을 숫자로 다루려면 그 문자열을 int()로 변환해야 합니다. 이 글에서는 정수 하나를 읽는 방법, 유효한 정수가 아닌 입력을 처리하는 방법, 그리고 한 줄에서 여러 정수를 읽는 방법을 설명합니다.

이 글은 Python 3을 다룹니다. Python 2는 같은 작업에 raw_input()을 사용했으며 2020년에 지원이 종료되었으므로, 아래 예제에서는 내내 input()을 사용합니다.

int(input())으로 정수 하나 읽기

먼저 입력을 문자열로 읽은 다음 변환합니다.

user_input = input("Please enter an integer: ")
integer_value = int(user_input)

print("You entered:", integer_value)
print(type(integer_value))

Output:

Please enter an integer: 42
You entered: 42
<class 'int'>

변환과 읽기를 한 줄로 합치는 경우도 많으며, 동작은 완전히 같습니다.

integer_value = int(input("Please enter an integer: "))

사용자가 hello나 3.5처럼 정수가 아닌 값을 입력하면 int()는 ValueError를 발생시키고 프로그램이 중단됩니다. 다음 섹션에서 그 경우를 처리하는 방법을 설명합니다.

try-except로 잘못된 입력 처리하기

변환을 try-except 블록으로 감싸면 ValueError를 잡아 프로그램이 충돌하는 대신 다시 묻도록 할 수 있습니다.

while True:
    user_input = input("Please enter an integer: ")
    try:
        integer_value = int(user_input)
        print("You entered:", integer_value)
        break
    except ValueError:
        print("That's not a valid integer. Please try again.")

변환이 성공할 때까지 루프가 계속 프롬프트를 표시합니다. 변환이 성공한 뒤에야 break가 루프를 종료합니다.

Output:

Please enter an integer: hello
That's not a valid integer. Please try again.
Please enter an integer: 10
You entered: 10

이런 방식으로 입력을 검증하는 것은 대화형 프로그램의 모범 사례입니다. 오타 하나로 전체 실행이 날아가는 것이 아니라 프롬프트 한 번이면 충분해야 합니다.

한 줄에서 여러 정수 읽기

프로그램이 한 번에 여러 숫자를 필요로 할 때는 사용자에게 공백으로 구분하여 한 줄에 입력하게 합니다. split()은 줄을 문자열 조각들로 나누고, map()은 각 조각을 int()로 변환합니다.

numbers = list(map(int, input("Enter numbers separated by spaces: ").split()))

print(numbers)
print("Sum:", sum(numbers))

Output:

Enter numbers separated by spaces: 4 8 15 16 23 42
[4, 8, 15, 16, 23, 42]
Sum: 108

리스트 컴프리헨션도 같은 일을 하며, 그에 못지않게 흔히 쓰입니다.

numbers = [int(piece) for piece in input("Enter numbers separated by spaces: ").split()]

필요한 값의 개수가 고정되어 있다면 결과를 바로 언패킹합니다. 아래에서는 사용자가 정확히 두 개의 정수를 입력해야 합니다.

a, b = map(int, input("Enter two numbers: ").split())

print("a =", a)
print("b =", b)

Output:

Enter two numbers: 3 17
a = 3
b = 17

예상보다 많거나 적은 값을 입력하면 ValueError가 발생하므로, 개수가 중요할 때는 이 패턴을 이전 섹션의 try-except 루프와 함께 사용하십시오.

int()가 받아들이는 것과 거부하는 것

int()는 많은 사람이 생각하는 것보다 관대합니다. 앞뒤 공백을 무시하고, 선택적인 + 또는 - 부호를 허용하며, 숫자 사이에 밑줄을 넣을 수 있습니다.

print(int(" 42 "))
print(int("+7"))
print(int("1_000"))

Output:

42
7
1000

반면 문자열 형태의 정수 리터럴이 아닌 것은 모두 거부합니다. "3.5", "12a", 빈 문자열 ""가 여기에 해당하며, 모두 ValueError를 발생시킵니다. 입력에 소수 값이 포함될 수 있다면 대신 float()로 변환하거나, 소수 부분을 버려도 괜찮을 때 int(float(text))를 사용하십시오.

결론

Python 3에서 정수를 읽는 것은 하나의 패턴으로 귀결됩니다. input()은 문자열을 주고, int()가 그것을 정수로 바꿉니다. 잘못된 입력이 프로그램을 중단시키는 대신 다시 묻도록 try-except 루프를 사용하고, 한 줄에서 여러 정수가 필요할 때는 split()과 함께 map()이나 리스트 컴프리헨션을 활용하십시오.

FAQ

  1. Python 3에서 사용자 입력을 정수로 읽으려면 어떻게 해야 하나요?
    int(input())을 사용합니다. input()은 한 줄을 문자열로 읽고, int()가 그것을 정수로 변환합니다.

  2. 한 줄에서 여러 정수를 읽으려면 어떻게 해야 하나요?
    줄을 나눈 뒤 각 조각을 변환합니다. 예를 들어 list(map(int, input().split())) 또는 [int(x) for x in input().split()]처럼 합니다.

  3. 사용자가 정수가 아닌 값을 입력하면 어떻게 되나요?
    int()가 ValueError를 발생시킵니다. try-except 블록으로 잡아서 다시 입력받으십시오.

  4. input()의 결과로 바로 산술 연산을 할 수 없는 이유는 무엇인가요?
    input()은 숫자가 아니라 문자열을 반환하기 때문입니다. 문자열에 int()로 변환하기 전까지는 문자열과 정수를 더하면 TypeError가 발생합니다.

  5. 입력을 읽을 때 Python 2와 Python 3의 차이점은 무엇인가요?
    Python 2는 텍스트 입력에 raw_input()을 사용했고, Python 3는 input()을 사용합니다. int() 변환은 두 버전에서 동일하게 동작하지만, Python 2는 더 이상 유지 관리되지 않으므로 새 코드는 Python 3를 사용해야 합니다.