03. 숫자와 연산자

🎯 이 장의 목표
  • 정수(int)와 실수(float)의 차이를 안다.
  • 사칙연산과 더불어 나눗셈의 세 형제(/, //, %)를 구분한다.
  • 형 변환(int(), float(), str())으로 값의 종류를 바꾼다.
  • 부동소수점의 함정을 알고 놀라지 않는다.

두 가지 숫자: 정수와 실수

Python에서 숫자는 크게 둘로 나뉩니다.

종류영어 이름설명
정수int (integer)0, 42, -7, 1000000소수점이 없는 수
실수float (floating point)3.14, -0.5, 2.0소수점이 있는 수

값의 종류를 자료형(type)이라고 부릅니다. 어떤 값이 무슨 자료형인지는 type()으로 확인할 수 있습니다.

PYTHON
print(type(42))      # <class 'int'>
print(type(3.14))    # <class 'float'>
print(type(2.0))     # <class 'float'>  ← 소수점이 붙으면 값이 2여도 실수!
📌 핵심
핵심: 소수점의 유무가 intfloat를 가른다. 2는 정수, 2.0은 실수다. 똑같이 2를 뜻해도 자료형이 다르다.

사칙연산

기본 연산은 직관적입니다.

PYTHON
print(10 + 3)    # 13   (덧셈)
print(10 - 3)    # 7    (뺄셈)
print(10 * 3)    # 30   (곱셈)
print(2 ** 10)   # 1024 (거듭제곱: 2의 10승)

곱셈은 ×가 아니라 별표 *, 거듭제곱은 **(별표 두 개)를 쓴다는 점만 주의하면 됩니다.

나눗셈의 세 형제

나눗셈은 조금 특별합니다. 목적에 따라 세 가지 연산자가 있습니다.

연산자이름72로 예시결과 자료형
/일반 나눗셈7 / 23.5항상 float
//몫 (정수 나눗셈)7 // 23정수끼리면 int
%나머지7 % 21정수끼리면 int
PYTHON
print(7 / 2)     # 3.5   ← 나누기는 항상 실수!
print(7 // 2)    # 3     ← 몫만 (소수점 버림)
print(7 % 2)     # 1     ← 나머지
⚠️ 흔한 실수
흔한 함정: /는 정수끼리 나눠도 결과가 항상 실수입니다. 10 / 25가 아니라 5.0입니다. "정수 결과"가 필요하면 //를 쓰세요.

나머지(%)는 어디에 쓰나?

나머지 연산은 생각보다 활용도가 높습니다. 대표적으로 짝수/홀수 판별입니다. 어떤 수를 2로 나눈 나머지가 0이면 짝수입니다.

PYTHON
print(10 % 2)    # 0  → 짝수
print(7 % 2)     # 1  → 홀수
print(15 % 5)    # 0  → 15는 5의 배수
flowchart LR
    N["숫자 n"]:::data --> Mod["n % 2"]:::proc
    Mod -->|"0"| Even["짝수 ✅"]:::result
    Mod -->|"1"| Odd["홀수"]:::result

    classDef data fill:#a8dadc,stroke:#457b9d,color:#1d3557
    classDef proc fill:#7fd8d8,stroke:#2a9d8f,color:#14532d
    classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d

연산 순서

수학과 똑같습니다. 곱셈·나눗셈이 덧셈·뺄셈보다 먼저, 괄호가 최우선입니다.

PYTHON
print(2 + 3 * 4)      # 14   (3*4=12, +2)
print((2 + 3) * 4)    # 20   (괄호 먼저)
print(2 ** 3 + 1)     # 9    (2**3=8, +1)
💡 팁
헷갈릴 것 같으면 괄호를 적극적으로 쓰세요. (a + b) * c처럼 괄호로 의도를 분명히 하면 읽기도 쉽고 실수도 줄어듭니다.

형 변환: 자료형 바꾸기

값의 자료형을 바꾸는 것을 형 변환(type casting)이라 합니다. 가장 자주 쓰는 셋을 봅시다.

함수하는 일
int(x)정수로 변환int("42")42, int(3.9)3
float(x)실수로 변환float("3.14")3.14, float(5)5.0
str(x)문자열로 변환str(2025)"2025"
PYTHON
n = int("42")           # 문자열 "42" → 정수 42
print(n + 8)            # 50

print(int(3.9))         # 3   ← 반올림이 아니라 '버림'!
print(float(5))         # 5.0
print(str(2025) + "년")  # 2025년
⚠️ 흔한 실수
흔한 함정 1: int(3.9)4가 아니라 3입니다. 반올림이 아니라 소수점 이하를 버립니다. 반올림이 필요하면 round(3.9)를 쓰세요(→ 4).
⚠️ 흔한 실수
흔한 함정 2: 숫자가 아닌 글자를 int()에 넣으면 에러가 납니다.
```python
int("hello")
```
```text
ValueError: invalid literal for int() with base 10: 'hello'
```
ValueError는 "자료형은 맞는데 값이 부적절하다"는 뜻입니다. 문자열을 받긴 했지만 숫자로 바꿀 수 없는 내용이라 거부한 것이죠. (메시지의 literal은 "리터럴", 즉 코드에 직접 적힌 값 그 자체를 뜻합니다. 여기서는 'hello'라는 글자값이 정수로 읽히지 않는다는 의미입니다.)

형 변환이 왜 필요할까?

다음 장에서 배울 input()(사용자 입력)은 무엇을 입력하든 항상 문자열로 받습니다. 그래서 입력받은 나이로 계산을 하려면 숫자로 바꿔야 합니다.

PYTHON
# 만약 변환을 안 하면? (문자열 "10" + 5)
# "10" + 5  →  TypeError 발생!
age = int("10")    # 문자열 "10" → 정수 10
print(age + 5)     # 15

나쁜 예 ❌ vs 좋은 예 ✅

문자열과 숫자를 섞어 출력할 때, 형 변환을 일일이 하는 것보다 더 파이썬다운 방법이 있습니다.

PYTHON
year = 2025

# ❌ 나쁜 예: str()로 일일이 변환하고 +로 이어 붙임 (장황하고 실수하기 쉬움)
print("올해는 " + str(year) + "년입니다")

# ✅ 좋은 예: f-string 사용 (다음 장에서 자세히!)
print(f"올해는 {year}년입니다")
# 둘 다 출력: 올해는 2025년입니다

f-string은 다음 장에서 제대로 배웁니다. 지금은 "숫자와 문자열을 섞을 땐 +보다 f-string이 파이썬답다"만 기억하세요.

⚠️ 부동소수점의 함정

이건 Python만의 문제가 아니라 거의 모든 프로그래밍 언어가 공유하는 유명한 현상입니다. 직접 보면 깜짝 놀랍니다.

PYTHON
print(0.1 + 0.2)        # 0.30000000000000004  (?!)
print(0.1 + 0.2 == 0.3) # False                (?!?!)

0.1 + 0.2가 깔끔한 0.3이 아니라 이상한 꼬리를 답니다. 버그가 아닙니다. 컴퓨터는 숫자를 2진법으로 저장하는데, 0.1 같은 값은 2진법으로 정확히 표현할 수 없어 아주 미세한 오차가 생깁니다. (10진법으로 1/30.333...으로 정확히 못 적는 것과 비슷합니다.)

해결책은 상황에 따라 다르지만, 입문 단계에서는 다음만 기억하면 됩니다.

  • 돈 계산처럼 정확함이 중요하면 실수 대신 정수(예: 원 단위)로 다루거나, 나중에 decimal 모듈을 씁니다.
  • 표시할 때 자릿수를 제한하면 됩니다 (다음 장 f-string의 :.2f).
PYTHON
result = 0.1 + 0.2
print(round(result, 2))   # 0.3   ← round로 둘째 자리까지 반올림
📌 핵심
핵심: 0.1 + 0.2 != 0.3은 버그가 아니라 컴퓨터가 실수를 저장하는 방식의 본질적 한계다. 실수의 정확한 비교(==)는 피하는 게 좋다.

이 장에서 배운 것

  • 숫자는 정수(int)실수(float)로 나뉘며, 소수점 유무로 구분된다. type()으로 확인.
  • 나눗셈은 셋: /(항상 실수), //(몫), %(나머지). 짝/홀 판별엔 % 2.
  • 연산 순서는 수학과 같고, 헷갈리면 괄호로 분명히 한다.
  • 형 변환: int()·float()·str(). int()는 소수점을 버린다(반올림 아님). 잘못된 값은 ValueError.
  • 0.1 + 0.2가 깔끔하지 않은 건 부동소수점의 본질적 한계다. 실수의 == 비교는 피한다.

🧪 실습 문제

문제 1. 다음 각 식의 결과와 자료형(int/float)을 예상하세요.

PYTHON
9 / 3
9 // 3
9 % 3
9.0 + 1

문제 2. 어떤 해가 윤년인지 대략 판별하려 합니다. year % 40이면 윤년 후보입니다. year = 2024, year = 2025에 대해 year % 4를 각각 출력하세요.

문제 3. 다음 코드의 출력은?

PYTHON
print(int(7.99))
print(round(7.99))

문제 4. 초(seconds)로 받은 총 시간 total = 200을 "몇 분 몇 초"로 나누려 합니다. 분은 //, 초는 %를 사용해 3분 20초 형태로 출력하세요. (힌트: 1분 = 60초)

<details>

<summary>✅ 정답·해설 보기</summary>

1.

  • 9 / 33.0 (float, /는 항상 실수)
  • 9 // 33 (int)
  • 9 % 30 (int)
  • 9.0 + 110.0 (float, 하나라도 실수면 결과는 실수)

2. 2024 % 40, 2025 % 41. 즉 2024는 윤년 후보, 2025는 아님.

3. int(7.99)7 (버림), round(7.99)8 (반올림).

4.

PYTHON
total = 200
minutes = total // 60   # 3
seconds = total % 60    # 20
print(f"{minutes}분 {seconds}초")   # 3분 20초

(f-string은 다음 장에서 배우지만 미리 맛보기로 사용했습니다.)

</details>

◀️ 이전 장: 02. 변수와 출력 | ▶️ 다음 장: 04. 문자열과 입력