일반적으로 표현식의 데이터 타입은 피연산자(인수)의 타입에 따라 결정됩니다. 이 규칙은 대부분의 연산자에 적용됩니다. 예를 들어 두 정수를 더하면 결과 역시 정수가 되는 식입니다.
그런데 나눗셈만은 상황이 조금 다릅니다. 나눗셈에는 서로 다른 두 가지 기대치가 공존하기 때문입니다. 어떤 경우에는 정확한 부동 소수점(float) 값을 얻기를 원하고, 또 어떤 경우에는 소수점 아래를 버린 정수 결과를 원합니다.
파이썬 2.x에서의 나눗셈 동작
파이썬 2.x에서 나눗셈 연산자(/)의 결과는 오직 피연산자의 타입에만 의존했습니다. 예를 들어 파이썬 2.7에서 20/7을 계산하면 두 피연산자가 모두 정수이므로 결과는 2가 됩니다. 반면 20./7은 피연산자가 부동 소수점 숫자이기 때문에 2.857142857142857을 출력합니다.
이러한 '/'의 정의는 개발자가 예상하지 못한 데이터 타입이 입력되는 애플리케이션에서 잦은 오류의 원인이 되었습니다.
섭씨 온도를 화씨로 변환하는 간단한 프로그램을 예로 들어 보겠습니다. 입력값에 따라 전혀 다른 결과가 출력됩니다. 한 사용자가 정수 18을 입력하고 다른 사용자가 18.0을 입력하더라도, 수치적으로는 동일한 값임에도 불구하고 결과는 완전히 달라집니다.
# 파이썬 2.6에서 섭씨를 화씨로 변환
>>> print 18*9/5 + 32
64
>>> print 18.0*9/5 + 32
64.4
>>> 18 == 18.0
True
위 예제에서 확인할 수 있듯이, 18.0을 전달하면 올바른 결과인 64.4를 얻지만, 18을 전달하면 잘못된 결과인 64가 출력됩니다. 이러한 동작이 발생하는 이유는 파이썬 2.x에서 모든 피연산자가 정수일 경우 '/' 연산자가 버림 나눗셈(floor division)으로 작동하기 때문입니다. 반면 피연산자 중 하나라도 float 값이라면 '/' 연산자는 float 값을 반환합니다.
'//' 버림 나눗셈 연산자의 등장
이 문제는 float(x)처럼 명시적인 형 변환 함수를 사용해 어느 정도 방지할 수 있습니다. 하지만 파이썬은 단순하고 간결한 언어 철학을 지향하기 때문에, 드물게 발생하는 예상치 못한 데이터 타입 사례를 처리하기 위해 곳곳에 형 변환 코드를 넘보하는 것을 원치 않았습니다.
그래서 파이썬 2.2 버전부터 새로운 나눗셈 연산자가 도입되어 각각의 기대 동작을 명확하게 구분했습니다. 일반 '/' 연산자는 이후 부동 소수점 결과를 반환하도록 정비되었고, 소수점 아래를 버린 정수 결과가 필요할 때는 특수 나눗셈 연산자인 //(버림 나눗셈)를 사용하도록 한 것입니다.
>>> # 파이썬 2.7에서 정수와 부동 소수점 숫자 모두에 대해 "//" 사용 예시
>>> print 9//2
4
>>> print -9//2
-5
>>> print 9.0//2
4.0
>>> print -9.0//2
-5.0
'//' 연산자는 항상 소수점 아래를 버린다(내림한다)는 점에 유의하세요. 양수 9를 2로 나누면 4가 되지만, 음수 -9를 2로 나누면 -4가 아니라 -5가 됩니다. 즉, 0에 가까워지는 방향이 아니라 항상 더 작은 정수 쪽으로 내립니다.
파이썬 3.x의 나눗셈 연산
파이썬 3.x에서는 위에서 언급한 결함이 해소되었습니다. '/' 연산자는 피연산자가 정수든 부동 소수점이든 항상 부동 소수점 나눗셈을 수행합니다.
>>> # 파이썬 3.x에서 섭씨를 화씨로 변환
>>> # 정수 18 전달
>>> print (18*9/5 + 32)
64.4
>>> # 부동 소수점 18.0 전달
>>> print(18.0*9/5 + 32)
64.4
이제 입력값의 타입과 무관하게 항상 동일한 결과를 얻을 수 있습니다. 또한 양수와 음수 피연산자 간에도 동작의 차이가 없습니다.
>>> print(9/2)
4.5
>>> print(-9/2)
-4.5
>>> print(9.0/2)
4.5
>>> print(-9.0/2)
-4.5
정리: 파이썬 나눗셈 연산자 요약
- 파이썬 2.x의 '/': 피연산자가 모두 정수면 버림 나눗셈(정수 반환), 하나라도 float이면 실수 나눗셈(float 반환) → 타입에 따라 결과가 달라져 혼란 초래
- 파이썬 2.2+의 '//': 피연산자 타입과 관계없이 항상 소수점 아래를 버린 결과 반환
- 파이썬 3.x의 '/': 항상 부동 소수점 나눗셈 수행 → 정수 입력에도 64.4처럼 정확한 실수 결과 보장
레거시 파이썬 2 코드를 유지 보수하거나 마이그레이션할 때는 이러한 나눗셈 동작의 차이를 반드시 염두에 두어야 합니다. 정수 나눗셈이 필요한 경우에는 3.x에서도 명시적으로 '//' 연산자를 사용하는 것이 안전하고 의도를 분명하게 드러내는 좋은 습관입니다.