03. 숫자와 연산자
- 정수(
int)와 실수(float)의 차이를 안다. - 사칙연산과 더불어 나눗셈의 세 형제(
/,//,%)를 구분한다. - 형 변환(
int(),float(),str())으로 값의 종류를 바꾼다. - 부동소수점의 함정을 알고 놀라지 않는다.
두 가지 숫자: 정수와 실수
Python에서 숫자는 크게 둘로 나뉩니다.
| 종류 | 영어 이름 | 예 | 설명 |
|---|---|---|---|
| 정수 | int (integer) | 0, 42, -7, 1000000 | 소수점이 없는 수 |
| 실수 | float (floating point) | 3.14, -0.5, 2.0 | 소수점이 있는 수 |
값의 종류를 자료형(type)이라고 부릅니다. 어떤 값이 무슨 자료형인지는 type()으로 확인할 수 있습니다.
print(type(42)) # <class 'int'> print(type(3.14)) # <class 'float'> print(type(2.0)) # <class 'float'> ← 소수점이 붙으면 값이 2여도 실수!
int와 float를 가른다. 2는 정수, 2.0은 실수다. 똑같이 2를 뜻해도 자료형이 다르다.사칙연산
기본 연산은 직관적입니다.
print(10 + 3) # 13 (덧셈) print(10 - 3) # 7 (뺄셈) print(10 * 3) # 30 (곱셈) print(2 ** 10) # 1024 (거듭제곱: 2의 10승)
곱셈은 ×가 아니라 별표 *, 거듭제곱은 **(별표 두 개)를 쓴다는 점만 주의하면 됩니다.
나눗셈의 세 형제
나눗셈은 조금 특별합니다. 목적에 따라 세 가지 연산자가 있습니다.
| 연산자 | 이름 | 7과 2로 예시 | 결과 자료형 |
|---|---|---|---|
/ | 일반 나눗셈 | 7 / 2 → 3.5 | 항상 float |
// | 몫 (정수 나눗셈) | 7 // 2 → 3 | 정수끼리면 int |
% | 나머지 | 7 % 2 → 1 | 정수끼리면 int |
print(7 / 2) # 3.5 ← 나누기는 항상 실수! print(7 // 2) # 3 ← 몫만 (소수점 버림) print(7 % 2) # 1 ← 나머지
/는 정수끼리 나눠도 결과가 항상 실수입니다. 10 / 2는 5가 아니라 5.0입니다. "정수 결과"가 필요하면 //를 쓰세요.나머지(%)는 어디에 쓰나?
나머지 연산은 생각보다 활용도가 높습니다. 대표적으로 짝수/홀수 판별입니다. 어떤 수를 2로 나눈 나머지가 0이면 짝수입니다.
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
연산 순서
수학과 똑같습니다. 곱셈·나눗셈이 덧셈·뺄셈보다 먼저, 괄호가 최우선입니다.
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" |
n = int("42") # 문자열 "42" → 정수 42 print(n + 8) # 50 print(int(3.9)) # 3 ← 반올림이 아니라 '버림'! print(float(5)) # 5.0 print(str(2025) + "년") # 2025년
int(3.9)는 4가 아니라 3입니다. 반올림이 아니라 소수점 이하를 버립니다. 반올림이 필요하면 round(3.9)를 쓰세요(→ 4).int()에 넣으면 에러가 납니다.```python
int("hello")
```
```text
ValueError: invalid literal for int() with base 10: 'hello'
```
ValueError는 "자료형은 맞는데 값이 부적절하다"는 뜻입니다. 문자열을 받긴 했지만 숫자로 바꿀 수 없는 내용이라 거부한 것이죠. (메시지의 literal은 "리터럴", 즉 코드에 직접 적힌 값 그 자체를 뜻합니다. 여기서는 'hello'라는 글자값이 정수로 읽히지 않는다는 의미입니다.)형 변환이 왜 필요할까?
다음 장에서 배울 input()(사용자 입력)은 무엇을 입력하든 항상 문자열로 받습니다. 그래서 입력받은 나이로 계산을 하려면 숫자로 바꿔야 합니다.
# 만약 변환을 안 하면? (문자열 "10" + 5) # "10" + 5 → TypeError 발생! age = int("10") # 문자열 "10" → 정수 10 print(age + 5) # 15
나쁜 예 ❌ vs 좋은 예 ✅
문자열과 숫자를 섞어 출력할 때, 형 변환을 일일이 하는 것보다 더 파이썬다운 방법이 있습니다.
year = 2025 # ❌ 나쁜 예: str()로 일일이 변환하고 +로 이어 붙임 (장황하고 실수하기 쉬움) print("올해는 " + str(year) + "년입니다") # ✅ 좋은 예: f-string 사용 (다음 장에서 자세히!) print(f"올해는 {year}년입니다") # 둘 다 출력: 올해는 2025년입니다
f-string은 다음 장에서 제대로 배웁니다. 지금은 "숫자와 문자열을 섞을 땐 +보다 f-string이 파이썬답다"만 기억하세요.
⚠️ 부동소수점의 함정
이건 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/3을 0.333...으로 정확히 못 적는 것과 비슷합니다.)
해결책은 상황에 따라 다르지만, 입문 단계에서는 다음만 기억하면 됩니다.
- 돈 계산처럼 정확함이 중요하면 실수 대신 정수(예: 원 단위)로 다루거나, 나중에
decimal모듈을 씁니다. - 표시할 때 자릿수를 제한하면 됩니다 (다음 장 f-string의
:.2f).
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)을 예상하세요.
9 / 3 9 // 3 9 % 3 9.0 + 1
문제 2. 어떤 해가 윤년인지 대략 판별하려 합니다. year % 4가 0이면 윤년 후보입니다. year = 2024, year = 2025에 대해 year % 4를 각각 출력하세요.
문제 3. 다음 코드의 출력은?
print(int(7.99)) print(round(7.99))
문제 4. 초(seconds)로 받은 총 시간 total = 200을 "몇 분 몇 초"로 나누려 합니다. 분은 //, 초는 %를 사용해 3분 20초 형태로 출력하세요. (힌트: 1분 = 60초)
<details>
<summary>✅ 정답·해설 보기</summary>
1.
9 / 3→3.0(float,/는 항상 실수)9 // 3→3(int)9 % 3→0(int)9.0 + 1→10.0(float, 하나라도 실수면 결과는 실수)
2. 2024 % 4 → 0, 2025 % 4 → 1. 즉 2024는 윤년 후보, 2025는 아님.
3. int(7.99) → 7 (버림), round(7.99) → 8 (반올림).
4.
total = 200 minutes = total // 60 # 3 seconds = total % 60 # 20 print(f"{minutes}분 {seconds}초") # 3분 20초
(f-string은 다음 장에서 배우지만 미리 맛보기로 사용했습니다.)
</details>
◀️ 이전 장: 02. 변수와 출력 | ▶️ 다음 장: 04. 문자열과 입력