Python에서는 두 숫자를 곱할 수 있습니다. 숫자와 문자열을 곱하는 것도 가능한데, 이 경우 해당 문자열이 지정된 횟수만큼 반복된 시퀀스(sequence)가 반환됩니다.
하지만 문자열에 문자열을 곱하려고 하면 "TypeError: can't multiply sequence by non-int of type 'str'" 오류가 발생합니다.
이 글에서는 이 오류가 의미하는 바와 코드에서 언제 발생하는지 살펴보고, 실제 예제를 통해 오류를 해결하는 방법까지 단계별로 안내합니다.
TypeError: can't multiply sequence by non-int of type 'str'란?
문자열(string)은 시퀀스 타입 중 하나입니다. 문자열은 파이썬이 반복(iteration)할 수 있는 문자들의 집합이기 때문입니다. 그 외 대표적인 시퀀스 타입으로는 튜플(tuple), 딕셔너리(dictionary), 리스트(list) 등이 있습니다.
곱셈 연산자(*)를 사용하면 문자열의 내용을 지정한 횟수만큼 반복하는 새로운 문자열을 만들 수 있습니다. 다음 코드를 살펴보겠습니다.
print("Cakes! " * 2)이 코드는 "Cakes! Cakes!"를 출력합니다. 곱셈 연산자가 문자열을 두 번 반복하도록 만든 것입니다.
그러나 곱셈 연산자로 문자열과 문자열을 곱할 수는 없습니다. 같은 데이터 타입끼리 곱할 수 있는 값은 정수(int)와 부동소수점 숫자(float)뿐입니다. 파이썬은 두 문자열을 곱하는 연산을 어떻게 처리해야 할지 판단하지 못하기 때문입니다.
오류 발생 예시
목요일 오후에 레스토랑이 잼 스콘 판매로 벌어들인 금액을 계산하는 프로그램을 만들어 보겠습니다.
먼저 잼 스콘 하나의 가격을 정의하고, input() 문을 사용해 사용자에게 지난 영업일에 판매한 스콘 개수를 입력받습니다.
jam_scone = "1.95"
sold = input("How many jam scones did you sell yesterday? ")
다음으로 이 두 값을 곱하여 특정 날짜에 스콘 판매로 벌어들인 금액을 구합니다.
earned_from_scones = jam_scone * sold
스콘 판매 수익을 구했으니, 이제 print() 문을 작성해 계산 결과를 사용자에게 출력합니다.
print("You earned ${} from selling scones.".format(earned_from_scones))format() 메서드를 사용하면 문자열 내 중괄호({}) 위치에 earned_from_scones 변수의 값이 삽입됩니다.
또한 스콘 하나당 발생하는 이익도 계산해야 합니다. 스콘당 25센트의 이익이 발생한다고 할 때, 총 이익은 다음 코드로 계산합니다.
profit = sold * 0.25
print("You made a ${} profit from selling scones.".format(profit))
이 코드는 스콘 판매로 발생한 총 이익을 계산한 뒤 그 값을 콘솔에 출력합니다. 코드를 실행해 결과를 확인해 보겠습니다.
How many jam scones did you sell yesterday? 17
Traceback (most recent call last):
File "main.py", line 4, in <module>
earned_from_scones = jam_scone * sold
TypeError: can't multiply sequence by non-int of type 'str'
코드 실행 중 오류가 발생했습니다.
해결 방법
오류가 발생한 코드 줄을 분석해 보겠습니다.
earned_from_scones = jam_scone * sold
이 코드는 언뜻 문제가 없어 보이지만, 사실 두 문자열 값을 곱하려고 하고 있다는 것이 문제입니다. jam_scone 변수는 문자열로 저장되어 있고, input() 메서드는 항상 문자열을 반환하기 때문에 sold 변수 역시 문자열 값을 갖게 됩니다.
이 문제를 해결하려면 jam_scone과 sold 두 변수 모두 부동소수점 숫자(float)여야 합니다. 그래야 두 값에 대해 산술 연산을 수행할 수 있습니다.
변수 선언 방식을 다음과 같이 수정합니다.
jam_scone = 1.95
sold = float(input("How many jam scones did you sell yesterday? "))
jam_scone 값에서 따옴표가 제거되었습니다. 이제 jam_scone은 문자열이 아닌 부동소수점 숫자로 저장됩니다. 또한 float() 메서드를 사용해 sold 값을 부동소수점 숫자로 변환했습니다.
다시 코드를 실행해 보겠습니다.
How many jam scones did you sell yesterday? 17
You earned $33.15 from selling scones.
You made a $4.25 profit from selling scones.
코드가 성공적으로 작동합니다. 먼저 사용자에게 판매한 스콘 개수를 입력받고, 다음으로 스콘 판매 수익을 계산한 뒤, 마지막으로 스콘 판매에서 발생한 총 이익을 계산하여 출력합니다.
마무리
"TypeError: can't multiply sequence by non-int of type 'str'" 오류는 두 문자열 값을 곱하려고 할 때 발생합니다. 이 문제를 해결하려면 두 숫자 값을 곱하거나, 문자열에는 반드시 정수만 곱하도록 코드를 수정하면 됩니다.
이제 여러분도 파이써니스타답게 이 오류를 손쉽게 해결할 수 있습니다!