
파이썬을 다시 공부하면서 연산자를 보면 계산기 버튼부터 떠올랐습니다. 그런데 코드를 찬찬히 따라가 보니 연산자는 숫자를 계산하는 기호에 그치지 않았습니다. 두 값이 같은지 묻고, 여러 조건을 묶고, 문자열을 이어 붙이는 일까지 맡고 있었습니다.
지난 글에서는 값의 종류를 나타내는 int, float, str, bool, None을 살펴봤습니다. 이번에는 그 값으로 실제 일을 시키는 연산자를 알아보겠습니다. 산술·비교·논리 연산자가 어떤 결과를 만들고, 연산 순서가 왜 중요한지 쉬운 예제로 하나씩 확인해 보겠습니다.
연산자는 값 사이의 동작을 정한다
다음 코드에는 숫자 두 개와 +가 있습니다.
result = 3 + 2
print(result)
5
3과 2처럼 연산의 대상이 되는 값을 피연산자, +처럼 어떤 동작을 할지 알려 주는 기호를 연산자라고 합니다. 파이썬은 먼저 오른쪽의 3 + 2를 계산해 새 값 5를 만들고, 그 결과에 result라는 이름을 붙입니다.
연산자를 동사라고 생각하면 이해하기 쉽습니다. 값이 문장의 주인공이라면 더한다, 비교한다, 함께 만족하는지 확인한다가 연산자의 역할입니다.
산술 연산자는 숫자를 계산한다
가장 익숙한 연산자는 숫자를 계산하는 산술 연산자입니다.
+: 더하기-: 빼기*: 곱하기/: 나누기//: 몫 구하기%: 나머지 구하기**: 거듭제곱
짧은 코드로 결과를 확인해 보겠습니다.
print(7 + 3)
print(7 - 3)
print(7 * 3)
print(7 / 3)
print(7 // 3)
print(7 % 3)
print(7 ** 3)
10
4
21
2.3333333333333335
2
1
343
+, -, *는 계산기와 비슷합니다. 처음 볼 때 헷갈리기 쉬운 것은 /, //, %, **입니다.
/와 //는 무엇이 다를까?
/는 나눗셈 결과를 소수까지 보여 줍니다. 나누어떨어지더라도 결과는 float입니다.
print(10 / 2)
print(type(10 / 2))
5.0
<class 'float'>
//는 나눈 뒤 몫을 구합니다.
print(10 // 3)
3
간식 10개를 한 봉지에 3개씩 담으면 가득 찬 봉지는 3개입니다. 이처럼 몇 묶음을 완성할 수 있는지 알고 싶을 때 //가 유용합니다.
음수의 //는 0이 아니라 아래쪽으로 향한다
//를 단순히 소수점 버리기라고 기억하면 음수에서 틀릴 수 있습니다.
print(-7 / 3)
print(-7 // 3)
-2.3333333333333335
-3
파이썬의 //는 결과보다 작거나 같은 정수 쪽으로 내림합니다. 입문 단계에서는 양수 예제로 감각을 잡되, 음수에서는 소수점만 잘라 내는 동작이 아니라는 점을 기억해 두면 좋습니다.
%는 나누고 남은 값을 구한다
%는 나머지를 구하는 연산자입니다.
snack_count = 17
people = 5
print(snack_count // people)
print(snack_count % people)
3
2
간식 17개를 5명에게 똑같이 나누면 한 사람당 3개씩 받고 2개가 남습니다. //는 한 사람이 받을 개수, %는 나누고 남은 개수를 알려 줍니다.
나머지는 짝수와 홀수를 구분할 때도 사용합니다. 어떤 정수를 2로 나눈 나머지가 0이면 짝수입니다.
number = 8
print(number % 2)
0
조건문을 배우면 이 결과를 이용해 짝수와 홀수에 따라 다른 동작을 선택할 수 있습니다.
**는 같은 수를 여러 번 곱한다
**는 거듭제곱을 계산합니다.
print(2 ** 3)
print(10 ** 2)
8
100
2 3은 2를 세 번 곱한 2 × 2 × 2입니다. 다른 언어에서 거듭제곱처럼 보이기도 하는 ^는 파이썬에서는 전혀 다른 비트 연산자입니다. 제곱을 구하려면 2 ^ 3이 아니라 2 3이라고 작성합니다.
같은 +도 자료형에 따라 일이 달라진다
앞 글에서 자료형은 값의 사용 설명서라고 했습니다. 연산자는 그 설명서를 보고 어떤 동작을 할지 결정합니다.
print(3 + 2)
print("파이" + "썬")
print("하" * 3)
5
파이썬
하하하
숫자의 +는 덧셈이지만 문자열의 +는 이어 붙이기입니다. 문자열에 정수를 곱하면 그 문자열을 여러 번 반복합니다. 같은 기호라도 값의 자료형에 따라 가능한 동작과 의미가 달라집니다.
반면 숫자와 문자열을 바로 더하면 파이썬은 계산인지 연결인지 임의로 정하지 않습니다.
print(3 + "2")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
이런 오류가 보이면 양쪽 값의 자료형부터 확인합니다. 문자열과 숫자를 바꾸는 형 변환은 다음 글에서 자세히 다루겠습니다.
비교 연산자는 질문하고 bool로 답한다
비교 연산자는 두 값의 관계를 질문합니다. 결과는 지난 글에서 배운 True 또는 False입니다.
==: 두 값이 같은가?!=: 두 값이 다른가?>: 왼쪽이 더 큰가?<: 왼쪽이 더 작은가?>=: 왼쪽이 크거나 같은가?<=: 왼쪽이 작거나 같은가?
score = 85
print(score >= 80)
print(score == 100)
print(score != 0)
True
False
True
비교는 값을 바꾸지 않고 관계만 확인합니다. score >= 80은 “점수가 80점 이상인가?”라는 질문이고, 파이썬은 True로 답합니다.
=와 ==는 역할이 다르다
=는 오른쪽 값을 왼쪽 변수에 연결하는 대입 기호입니다. ==는 두 값이 같은지 비교합니다.
score = 85
print(score == 85)
True
눈으로 보면 등호 하나 차이지만, 하나는 값을 기억하게 하고 다른 하나는 질문의 답을 만듭니다.
비교는 자연스럽게 이어 쓸 수 있다
파이썬에서는 범위를 다음처럼 표현할 수 있습니다.
score = 85
print(0 <= score <= 100)
True
수학에서 0 ≤ 점수 ≤ 100이라고 쓰는 모습과 비슷합니다. 점수가 0 이상이고 동시에 100 이하인지 한눈에 읽을 수 있습니다.
논리 연산자는 여러 질문을 묶는다
비교 연산으로 만든 질문이 여러 개라면 and, or, not으로 연결할 수 있습니다.
and는 모두 참이어야 한다
has_ticket = True
is_on_time = True
print(has_ticket and is_on_time)
True
표가 있고 시간에도 늦지 않아야 입장할 수 있다면 두 조건이 모두 참이어야 합니다. 하나라도 거짓이면 전체 결과는 False입니다.
or는 하나만 참이어도 된다
is_member = False
has_coupon = True
print(is_member or has_coupon)
True
회원이거나 쿠폰이 있으면 혜택을 받을 수 있다면 둘 중 하나만 참이어도 됩니다.
not은 참과 거짓을 뒤집는다
is_sold_out = False
print(not is_sold_out)
True
is_sold_out은 “품절인가?”라는 질문입니다. not is_sold_out은 그 반대인 “품절이 아닌가?”를 뜻합니다.
결과가 이미 정해지면 뒤는 확인하지 않는다
and는 첫 번째 값이 거짓이면 전체가 참이 될 수 없습니다. or는 첫 번째 값이 참이면 전체가 이미 참입니다. 파이썬은 이처럼 결과가 정해지면 뒤쪽을 평가하지 않는데, 이를 단락 평가라고 합니다.
처음에는 불필요한 확인을 줄이는 똑똑한 진행 방식이라고 생각하면 충분합니다. 나중에 조건문과 함수를 배우면 오류를 피하거나 필요한 작업만 실행할 때 이 원리가 중요해집니다.
연산자 우선순위는 계산 순서를 정한다
한 줄에 여러 연산자가 있으면 아무 순서로나 계산하지 않습니다.
print(2 + 3 * 4)
print((2 + 3) * 4)
14
20
첫 번째 식은 곱셈을 먼저 계산해 2 + 12가 됩니다. 두 번째 식은 괄호 안을 먼저 계산해 5 * 4가 됩니다.
입문 단계에서는 다음 순서를 기억하면 대부분의 코드를 읽을 수 있습니다.
- 괄호
() - 거듭제곱
** - 부호를 나타내는 단항
+,- - 곱셈·나눗셈·몫·나머지
*,/,//,% - 덧셈·뺄셈
+,- - 비교
==,!=,>,<,>=,<= - 논리 부정
not - 논리곱
and - 논리합
or
score = 85
attendance = 90
print(score >= 80 and attendance >= 90)
파이썬은 산술 계산을 한 뒤 비교하고, 마지막에 논리 연산으로 결과를 묶습니다. 우선순위를 모두 외우기보다 뜻이 한눈에 보이지 않으면 괄호로 의도를 나타내는 편이 좋습니다.
print((score >= 80) and (attendance >= 90))
괄호를 추가해도 결과는 같지만 두 질문이 어디에서 나뉘는지 더 분명합니다.
간식 나누기 프로그램으로 연결하기
지금까지 배운 연산자를 하나의 작은 예제로 모아 보겠습니다.
snack_count = 17
people = 5
is_party_started = False
snacks_per_person = snack_count // people
leftover_snacks = snack_count % people
everyone_gets_one = snack_count >= people
ready_to_share = everyone_gets_one and not is_party_started
print("한 사람당:", snacks_per_person, "개")
print("남는 간식:", leftover_snacks, "개")
print("모두 받을 수 있나?:", everyone_gets_one)
print("지금 나눌 수 있나?:", ready_to_share)
한 사람당: 3 개
남는 간식: 2 개
모두 받을 수 있나?: True
지금 나눌 수 있나?: True
실행 흐름을 따라가면 다음과 같습니다.
//로 한 사람이 받을 간식 수를 구합니다.%로 남는 간식 수를 구합니다.>=로 모두가 적어도 하나씩 받을 수 있는지 질문합니다.and와not으로 간식이 충분하고 파티가 아직 시작되지 않았는지 함께 확인합니다.
산술 연산의 결과가 다음 비교의 재료가 되고, 비교 결과인 bool이 다시 논리 연산의 재료가 됩니다. 여러 종류의 연산자가 프로그램 안에서 이어지는 방식입니다.
자주 하는 실수
같은지 비교할 때 =를 쓰는 경우
=는 대입, ==는 비교입니다. “같은가?”라고 묻고 싶다면 등호를 두 개 사용합니다.
/와 //의 결과를 같다고 생각하는 경우
/는 소수까지 포함한 나눗셈 결과, //는 내림한 몫입니다. 특히 음수에서는 단순히 소수 부분을 버리는 것과 다릅니다.
제곱에 ^를 사용하는 경우
파이썬의 거듭제곱은 **입니다. ^는 비트 연산자이므로 제곱 결과가 나오지 않습니다.
0으로 나누는 경우
print(10 / 0)
ZeroDivisionError: division by zero
0으로는 나눌 수 없습니다. 나눗셈에 사용할 값이 0일 가능성이 있다면 이후 조건문으로 먼저 확인해야 합니다.
긴 식을 괄호 없이 작성하는 경우
우선순위에 맞게 실행되더라도 사람이 읽기 어려우면 실수가 생깁니다. 계산 덩어리와 질문 덩어리를 괄호로 구분해 의도를 보여 주세요.
직접 바꿔 보며 확인하기
다음 문제를 결과부터 예상한 뒤 실행해 보세요.
- 사탕 23개를 4명이 나눌 때 한 사람당 받는 수와 남는 수를 구합니다.
5 + 2 * 3과(5 + 2) * 3의 결과를 비교합니다.- 나이가 14세 이상인지
>=로 확인합니다. is_weekend와has_free_time을 만들고and,or,not의 결과를 바꿔 봅니다.- 숫자
2 + 3과 문자열"2" + "3"이 왜 다른지 말로 설명합니다.
기호를 외우기보다 “이 연산은 어떤 값을 받아 어떤 결과를 만드는가?”라고 질문해 보세요. 산술 연산은 주로 숫자를 만들고, 비교와 논리 연산은 다음 판단에 사용할 결과를 만듭니다.
정리
연산자는 값에 어떤 동작을 시킬지 정합니다. 산술 연산자는 숫자를 계산하고, 비교 연산자는 두 값의 관계를 질문해 bool을 만듭니다. 논리 연산자는 여러 참·거짓을 and, or, not으로 연결합니다.
/는 일반 나눗셈, //는 내림한 몫, %는 나머지, **는 거듭제곱입니다. 한 식에 연산자가 여러 개라면 우선순위에 따라 실행되며, 뜻을 분명하게 만들고 싶을 때는 괄호를 사용합니다.
다음 글에서는 프로그램이 직접 값을 받도록 만드는 input()과 형 변환을 다루겠습니다. 입력한 숫자가 왜 문자열이 되는지, int()와 float()로 언제 바꿔야 하는지 이번에 배운 연산자와 연결해 알아보겠습니다.
참고 자료
'파이썬(Python)' 카테고리의 다른 글
| [Python(파이썬)] 조건문이란? if·elif·else와 중첩 조건 쉽게 이해하기 (0) | 2026.08.09 |
|---|---|
| [Python(파이썬)] input()이란? 사용자 입력과 int·float 형 변환 쉽게 이해하기 (0) | 2026.08.08 |
| [Python(파이썬)] 기본 자료형이란? int, float, str, bool, None 쉽게 이해하기 (3) | 2026.08.05 |
| [Python(파이썬)] 변수란? 대입문과 이름·객체의 연결 이해하기 (0) | 2026.08.04 |
| [Python(파이썬)] 첫 시작: print(), 주석, 들여쓰기와 코드 실행 순서 (0) | 2026.08.03 |