# 파이썬 연산자: 산술, // 와 %, 비교, and/or/not, 파이썬 round 함수

URL: https://skillaria.top/ko/guides/python/python-operators-round-floor-ceil

파이썬에서 / 연산자는 항상 float을 반환하고, // 는 내림한 몫, % 는 나머지, ** 는 거듭제곱입니다. round(x, n)은 n자리로 반올림하는데 짝수로 반올림하는 방식이라 round(2.5)는 2, round(3.5)는 4입니다. 올림과 내림은 math.ceil과 math.floor, 절댓값은 abs로 구합니다.

파이썬 연산자는 값을 새로운 값으로 바꾸는 기호입니다. `+`는 더하고, `//`는 나눗셈의 몫을 구하고, `and`는 조건을 결합합니다. 아래에서는 전체 연산자 목록을 예제와 함께 정리하고, `/`와 `//`의 차이, `and`, `or`, `not`의 논리, 그리고 파이썬 round와 `math.ceil`, `math.floor`, `abs` 같은 반올림 관련 함수를 살펴봅니다. 모든 예제는 REPL에 그대로 붙여 넣어 확인할 수 있습니다.

## 파이썬 연산자 목록

연산자는 용도별로 묶을 수 있습니다. 표 전체를 외울 필요는 없습니다. 실제 코드에서는 산술, 비교, 논리 연산자가 가장 자주 나옵니다.

| 분류 | 연산자 | 예제 |
| --- | --- | --- |

| 산술 | `+ - * / // % **` | `7 // 2` → 3 |

| 비교 | `== != < > <= >=` | `3 < 5` → True |

| 논리 | `and or not` | `not True` → False |

| 동일성 | `is`, `is not` | `x is None` |

| 소속 | `in`, `not in` | `"커" in "커피"` → True |

| 대입 | `= += -= *= /= //= %= **=` | `total += 250` |

| 왈러스 | `:=` | `if (n := len(s)) > 10:` |

| 비트 단위 | `& | ^ ~ << >>` | `5 & 3` → 1 |

## 산술 연산자

덧셈, 뺄셈, 곱셈은 수학 시간에 배운 대로 동작합니다. 식에 `float`이 하나라도 들어 있으면 결과도 `float`이 됩니다. 예를 들어 `2 + 1.0`은 `3.0`입니다. 파이썬의 정수는 넘치지 않습니다. `2 ** 100`도 자릿수와 상관없이 정확히 계산됩니다.

```
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
```

### 거듭제곱 연산자 **

거듭제곱은 `^`가 아니라 별표 두 개(`**`)로 씁니다. 파이썬에서 `^`는 비트 단위 XOR이므로, `2 ^ 3`의 결과는 8이 아니라 1입니다. 지수를 소수로 쓰면 제곱근이 됩니다. `9 ** 0.5`는 `3.0`입니다. 함수 `pow(x, y)`도 같은 일을 하며, 세 번째 인자를 주면 나머지를 구합니다. `pow(2, 10, 1000)`은 24를 반환합니다.

우선순위에 주의하세요. `**`는 단항 마이너스보다 먼저 계산됩니다. 그래서 `-2 ** 2`는 `-4`입니다. 음수의 제곱을 구하려면 괄호를 쓰세요. `(-2) ** 2`.

## 나눗셈: /, // 와 %

파이썬에는 나눗셈이 두 종류 있으며, 초보자가 가장 많이 헷갈리는 부분입니다. 일반 나눗셈 `/`는 나누어떨어져도 항상 `float`을 반환합니다. 정수 나눗셈 `//`는 소수 부분을 버리고, `%`는 나머지를 반환합니다.

```
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
```

### 정수 나눗셈 // 와 나머지 %: 실전 예제

`//`와 `%`의 조합은 '정수로 몇 개이고 몇 개가 남았나'를 구하는 문제를 해결합니다. 강의의 지출 관리 프로그램은 정확도를 잃지 않으려고 금액을 원 단위 정수로 저장하고, 이를 원과 나머지 원으로 나눕니다.

```
won = 125050              # 금액을 원 단위 정수로 저장
thousand = won // 1000    # 125 — 천 원 단위 개수
rest = won % 1000         # 50 — 나머지
print(thousand, rest)     # 125 50

print(40 // 7, "주와", 40 % 7, "일")   # 5 주와 5 일
```

두 연산을 한 번에 해 주는 내장 함수 `divmod`도 있습니다. `divmod(125050, 1000)`은 `(125, 50)` 튜플을 반환합니다. 나머지는 짝수 판별에도 쓰입니다. `n % 2 == 0`은 짝수에 대해 참입니다.

### 음수: // 는 아래로 내림

`//`는 단순히 소수를 버리는 것이 아니라 음의 무한대 방향으로 내림합니다. 양수에서는 차이가 없지만 음수에서는 차이가 납니다. 파이썬에서 나머지 `%`의 부호는 나누는 수의 부호를 따르므로, 항상 `a == (a // b) * b + a % b`가 성립합니다.

```
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2)     # 반올림이 아니라 소수 부분을 버림
-3
```

### 0으로 나누기: 어떤 오류가 나는가

세 연산자 중 어느 것이든 0으로 나누면 `ZeroDivisionError` 예외가 발생합니다. 정수든 실수든 마찬가지입니다. `try/except`로 잡거나, 나누기 전에 나누는 수를 미리 확인할 수 있습니다.

```
>>> 10 / 0
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 15000 / count if count else 0
>>> avg
0
```

## 비교 연산자

비교 연산자는 `True` 또는 `False`를 반환합니다. 같은지 비교할 때는 `==`를 두 번 쓰고, 한 번만 쓰는 `=`은 대입입니다. 문자열은 문자의 코드 값으로 한 글자씩 비교합니다. 그래서 `"A" < "a"`는 참입니다. 대문자의 코드 값이 소문자보다 작기 때문입니다.

```
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 > 0.1 + 0.2 == 0.3
False
```

파이썬에는 `0 <= x < 100`처럼 비교를 이어 쓰는 체이닝이 있어서 `and`를 따로 쓸 필요가 없습니다. 마지막 줄은 실수의 오차를 보여 줍니다. `0.1 + 0.2`는 `0.30000000000000004`가 됩니다. 실수는 `math.isclose(a, b)`로 비교하고, 돈은 원 단위 정수나 `Decimal`로 저장하세요.

## 논리 연산자 and, or, not

파이썬의 논리 연산자는 `&&`나 `||` 같은 기호가 아니라 영어 단어로 씁니다. `and`는 양쪽이 모두 참일 때 참이고, `or`는 하나라도 참이면 참이며, `not`은 값을 뒤집습니다.

| a | b | a and b | a or b | not a |
| --- | --- | --- | --- | --- |

| True | True | True | True | False |

| True | False | False | True | False |

| False | True | False | True | True |

| False | False | False | False | True |

우선순위는 `not`이 먼저, 그다음 `and`, 마지막이 `or`입니다. 따라서 `True or False and False`는 `True`입니다. `and`가 먼저 계산되기 때문입니다. 복잡한 조건에서는 괄호를 쓰세요. 나와 동료 모두 읽기 쉬워집니다.

### and와 or가 실제로 반환하는 값

`and`와 `or`는 항상 `True`나 `False`를 반환하지 않고, 피연산자 중 하나를 반환합니다. `or`는 처음으로 나오는 참 값을(없으면 마지막 값을), `and`는 처음으로 나오는 거짓 값을(없으면 마지막 값을) 돌려줍니다. 거짓으로 취급되는 값은 `0`, `0.0`, 빈 문자열, 빈 컬렉션, `None`, `False`입니다.

```
>>> name = ""
>>> name or "손님"
'손님'
>>> 5 and 0
0
>>> not ""
True
```

평가는 지연됩니다. 왼쪽만으로 결과가 정해지면 오른쪽은 계산하지 않습니다. 그래서 `count and total / count`는 `count == 0`일 때 0으로 나누는 오류를 내지 않습니다. 또한 `not`은 두 다른 연산자와 달리 항상 `bool`을 반환합니다.

## 연산자 is와 in

`==`는 값을 비교하고, `is`는 두 이름이 같은 객체를 가리키는지 확인합니다. 빈 장바구니 두 개는 값이 같지만 같은 객체는 아닙니다. `is`가 꼭 필요한 곳은 `None` 확인입니다. `if x is None`처럼 씁니다.

```
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
```

숫자나 문자열을 `is`로 비교하지 마세요. 내부 캐싱 때문에 우연히 맞게 나올 수 있지만, 결과가 구현에 따라 달라집니다. 파이썬은 `x is 5` 같은 코드에 `SyntaxWarning`을 띄우기도 합니다.

연산자 `in`은 포함 여부를 확인합니다. 문자열 안의 부분 문자열, 리스트의 원소, 딕셔너리의 키를 검사할 수 있습니다. `not in`은 그 반대입니다.

```
>>> "커피" in "커피 한 잔"
True
>>> "식비" in {"식비": 450, "택시": 300}
True
>>> 5 not in [1, 2, 3]
True
```

## 대입 연산자와 왈러스 연산자 :=

`+=`, `-=`, `*=`, `//=` 같은 복합 대입 연산자는 줄여 쓴 표기입니다. `total += 250`은 `total = total + 250`과 같습니다. 파이썬에는 `++`나 `--` 연산자가 없습니다. `x++`를 쓰면 문법 오류가 납니다.

왈러스 연산자 `:=`는 생김새가 바다코끼리의 눈과 상아를 닮아서 그렇게 불립니다. 식 안에서 값을 대입하면서 동시에 사용할 수 있게 해 줍니다. 값을 검사하고 나서 계속 써야 할 때 유용합니다.

```
items = ["커피", "택시", "점심", "영화"]
if (n := len(items)) > 3:
    print(f"지출 항목이 너무 많습니다: {n}")

while (line := input("금액: ")) != "":
    print(int(line) * 2)
```

왈러스 연산자가 없다면 `len`을 두 번 호출하거나 대입을 별도 줄로 빼야 합니다. 그렇다고 남용할 필요는 없습니다. 식이 읽기 어려워진다면 일반 대입이 낫습니다.

## 반올림: round, ceil, floor

파이썬에서 반올림에는 내장 함수 `round`와 `math` 모듈의 함수들을 씁니다. 해결하는 문제가 서로 다르기 때문에 헷갈리기 쉽습니다.

| 함수 | 동작 | 2.5 | -2.5 | 2.7 |
| --- | --- | --- | --- | --- |

| `round(x)` | 가장 가까운 정수로, 정확히 가운데이면 짝수로 | 2 | -2 | 3 |

| `math.floor(x)` | 아래로, 음의 무한대 방향으로 | 2 | -3 | 2 |

| `math.ceil(x)` | 위로, 양의 무한대 방향으로 | 3 | -2 | 3 |

| `math.trunc(x)`, `int(x)` | 소수 부분을 버리고 0 방향으로 | 2 | -2 | 2 |

### 파이썬 round 함수와 은행원 반올림

`round(x, n)`은 소수점 아래 `n`자리로 반올림합니다. 두 번째 인자를 생략하면 `int`를 반환합니다. 가장 큰 함정은 파이썬 round가 '은행원 반올림'을 쓴다는 점입니다. 정확히 가운데에 있는 수는 가장 가까운 짝수로 갑니다. 그래서 `round(2.5)`는 2이고, `round(3.5)`는 4입니다. 큰 계산을 할 때 반올림 오차가 한쪽으로만 쌓이지 않게 하려는 방식입니다.

```
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2)     # 백 단위로
1200
>>> round(2.675, 2)     # 2.68이 아님: 이진수로는 2.67499...
2.67
```

영수증처럼 익숙한 '반올림(5 이상 올림)'이 필요하다면 `Decimal`과 `ROUND_HALF_UP` 모드를 쓰세요. 실수 오차를 물려받지 않도록 숫자는 문자열로 넘깁니다.

```
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
```

강의에서 말하는 또 하나의 원칙은 값은 출력할 때만 반올림하라는 것입니다. 보기 좋게 출력하는 데 `round`는 필요 없고, f-문자열이면 충분합니다. `f"{amount:.2f}"`는 소수점 둘째 자리까지 보여 주지만 값 자체는 정확하게 유지됩니다.

### math.ceil과 math.floor: 위로, 아래로 반올림

`math.ceil`은 '모자라면 안 되는' 경우에 씁니다. 예를 들어 버스를 몇 대 예약해야 할지, 검색 결과가 몇 페이지인지 계산할 때입니다. `math.floor`는 완전한 단위만 셀 때 씁니다. 두 함수 모두 `int`를 반환합니다.

```
import math

guests = 47
seats = 20
print(math.ceil(guests / seats))   # 버스 3대
print(math.floor(9.99))            # 9
print(-(-guests // seats))         # 3 — math 없이 //로 하는 올림
```

`math` 모듈에는 이 밖에도 `math.sqrt`(제곱근), `math.isclose`(실수 비교), `math.pi`, `math.gcd`가 있습니다. 파이썬 3.15에는 정수 계산을 위한 하위 모듈 `math.integer`(PEP 791)가 추가되었습니다. 여기에는 `comb`, `factorial`, `gcd`, `isqrt`, `lcm`, `perm`이 있으며, 기존의 `math.gcd` 등도 그대로 동작합니다.

## 함수 abs: 절댓값

`abs(x)`는 절댓값, 즉 0으로부터의 거리를 부호 없이 반환합니다. 내장 함수이므로 import가 필요 없습니다. 정수, 실수, 복소수에서 모두 동작합니다. 예를 들어 `3+4j`에 적용하면 벡터의 길이인 `5.0`이 나옵니다.

```
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent)    # 얼마나 벗어났는지
320
```

전형적인 용도는 방향을 무시한 차이와 허용 오차 비교입니다. 예를 들어 `abs(a - b) < 0.001`처럼 씁니다. 실수는 크기를 고려하는 `math.isclose`가 더 정확합니다.

## 연산자 우선순위

한 식에 여러 연산자가 있으면 파이썬은 우선순위에 따라 계산합니다. 높은 순서부터 나열하면 다음과 같습니다.

1. `**`
2. 단항 `-x`, `+x`, `~x`
3. `* / // %`
4. `+ -`
5. 비트 시프트와 비트 연산
6. 비교, `in`, `is`
7. `not`
8. `and`
9. `or`
10. `:=`

그러므로 `2 + 3 * 4`는 14이고, `(2 + 3) * 4`는 20입니다. 확실하지 않다면 괄호를 쓰세요. 불필요한 괄호는 아무런 비용이 없지만, 우선순위 오류는 찾기가 오래 걸립니다.

## 연산자에서 자주 하는 실수

| 실수 | 무슨 일이 생기나 | 올바른 방법 |
| --- | --- | --- |

| `if x = 5:` | SyntaxError: 대입으로 해석됨 | `if x == 5:` |

| 거듭제곱 대신 `2 ^ 3` | 비트 XOR, 결과 1 | `2 ** 3` |

| `8 / 2`에서 정수를 기대함 | 결과가 `4.0` | `8 // 2` |

| `x == 1 or 2` | 항상 참: `or 2` 때문에 | `x in (1, 2)` |

| `round(2.5)`이 3일 것이라 기대함 | 은행원 반올림으로 2 | `ROUND_HALF_UP`을 쓴 `Decimal` |

| `"5" + 5` | TypeError | `int("5") + 5` |

## 정리

핵심은 다음과 같습니다. `/`는 항상 float을 반환하고, `//`는 아래로 내림하며, `%`는 나누는 수의 부호를 따르는 나머지를 반환하고, 거듭제곱은 `**`입니다. 논리 연산자 `and`, `or`, `not`은 영어 단어로 쓰고 지연 평가되며, `is`는 `None` 확인에 씁니다. 파이썬 round는 짝수 쪽으로 반올림하며, 올림과 내림에는 `math.ceil`과 `math.floor`를, 절댓값에는 `abs`를 씁니다. 강의에서는 이 연산자들을 지출 관리 프로그램에 적용해 보며, 금액을 원 단위 정수로 저장합니다.

## FAQ

**파이썬에서 숫자를 소수점 둘째 자리까지 반올림하려면 어떻게 하나요?**

round(x, 2)를 쓰세요. 값은 바꾸지 않고 보기 좋게만 출력하려면 f-문자열 f"{x:.2f}"를 쓰면 됩니다.

**파이썬에서 round(0.5)가 0을 반환하는 이유는 무엇인가요?**

round는 정확히 가운데에 있는 수를 가장 가까운 짝수로 반올림하고, 0은 짝수이기 때문입니다. 같은 이유로 round(1.5)와 round(2.5)는 모두 2를 반환합니다.

**파이썬에서 나눗셈의 정수 몫은 어떻게 구하나요?**

// 연산자를 쓰세요. 17 // 5는 3을 반환합니다. 음수에서는 아래로 내림하므로 -17 // 5는 -4입니다. 소수 부분을 0 방향으로 버리려면 int(-17 / 5)를 쓰세요.

**파이썬에 삼항 연산자가 있나요?**

있습니다. 조건부 식인 값1 if 조건 else 값2 형태입니다. 예를 들어 "짝수" if n % 2 == 0 else "홀수"처럼 씁니다.

**파이썬의 &와 and는 무엇이 다른가요?**

and는 지연 평가하는 논리 연산자이고, &는 숫자의 비트 AND이자 집합의 교집합입니다. if 조건문에서는 and를 쓰세요.


---
Source: Skillaria.Top (https://skillaria.top)
