코딩의 덧셈·나눗셈·몫·나머지 완전 기초
코딩을 처음 배울 때 덧셈, 뺄셈, 곱셈, 나눗셈은 쉬워 보인다. 그런데 막상 코드를 쓰다 보면 /와 //의 차이, %가 왜 필요한지, 1 + "2" 같은 코드가 왜 이상한 결과를 만드는지에서 자주 막힌다.
이 글은 수학을 잘하는 사람을 위한 글이 아니라, 코딩을 막 시작한 사람이 “아, 그래서 이렇게 쓰는구나” 하고 감을 잡을 수 있도록 정리한 산술 연산자 기초 가이드다. 예제는 Python을 중심으로 설명하고, 웹 개발 입문자가 많이 만나는 JavaScript 차이도 함께 적었다.
+ - * /코딩에서 산술 연산은 계산기 기능이 아니라, 데이터를 원하는 형태로 바꾸는 가장 기본적인 도구다.
1. 코딩에서 연산자는 무엇일까?
연산자는 컴퓨터에게 “이 값과 저 값을 이렇게 계산해줘”라고 말하는 기호다. 예를 들어 3 + 4에서 3과 4는 계산에 쓰이는 값이고, +는 두 값을 더하라는 연산자다. 이런 계산식 전체를 보통 표현식이라고 부른다.
3 + 4
price * count
total / people
초보자는 연산자를 “수학 기호”로만 생각하기 쉽다. 하지만 코딩에서는 한 가지를 더 봐야 한다. 바로 값의 종류, 즉 타입이다. 숫자끼리 더하면 계산이 되지만, 문자열끼리 더하면 글자가 이어 붙는다. 같은 +라도 어떤 타입에 쓰느냐에 따라 의미가 달라질 수 있다.
2. 기본 산술 연산자 한 번에 보기
대부분의 프로그래밍 언어는 아래 연산자를 공통으로 사용한다. 기호 자체는 단순하지만, 실제 코드를 짤 때는 “결과가 정수인지 소수인지”, “나눗셈에서 몫만 필요한지”, “나머지가 필요한지”를 구분해야 한다.
| 연산자 | 이름 | 의미 | Python 예시 | 결과 |
|---|---|---|---|---|
+ |
덧셈 | 두 값을 더한다. | 10 + 3 |
13 |
- |
뺄셈 | 왼쪽 값에서 오른쪽 값을 뺀다. | 10 - 3 |
7 |
* |
곱셈 | 두 값을 곱한다. | 10 * 3 |
30 |
/ |
나눗셈 | 왼쪽 값을 오른쪽 값으로 나눈다. | 10 / 3 |
3.333... |
// |
몫, floor division | 나눈 결과에서 정수 몫을 구한다. | 10 // 3 |
3 |
% |
나머지, modulo | 나누고 남은 값을 구한다. | 10 % 3 |
1 |
** |
거듭제곱 | 같은 수를 여러 번 곱한다. | 2 ** 3 |
8 |
JavaScript를 공부한다면?
JavaScript에도 +, -, *, /, %, **가 있다. 다만 Python의 //처럼 몫만 바로 구하는 연산자는 일반 숫자 타입에 따로 없어서 Math.floor(), Math.trunc() 같은 함수를 함께 쓴다.
3. 덧셈: 숫자는 더하고, 문자열은 붙인다
덧셈은 가장 익숙한 연산이다. 숫자끼리 더하면 우리가 아는 그 덧셈이다.
a = 10
b = 3
print(a + b) # 13
그런데 코딩에서 +는 숫자에만 쓰이지 않는다. 문자열에도 쓸 수 있다. 문자열은 글자 데이터이기 때문에, 이때 +는 계산이 아니라 이어 붙이기가 된다.
first_name = "Heo"
last_name = "Brain"
print(first_name + last_name) # HeoBrain
print(first_name + " " + last_name) # Heo Brain
여기서 초보자가 자주 만나는 실수가 있다. 숫자처럼 보이는 문자열은 숫자가 아니다.
print(1 + 2) # 3
print("1" + "2") # 12
"1"은 숫자 1이 아니라 글자 "1"이다. 그래서 "1" + "2"는 3이 아니라 "12"가 된다. 사용자 입력값은 대부분 문자열로 들어오기 때문에, 계산하려면 숫자로 바꿔야 한다.
age_text = "20"
age = int(age_text)
print(age + 1) # 21
JavaScript에서 더 조심해야 하는 부분
JavaScript에서는 "1" + 2가 "12"가 된다. 한쪽이 문자열이면 다른 값도 문자열처럼 이어 붙는 상황이 생긴다. 숫자 계산을 하고 싶다면 Number("1") + 2처럼 명시적으로 변환하는 습관이 좋다.
4. 뺄셈과 곱셈: 순서와 기호를 정확히 보기
뺄셈은 왼쪽 값에서 오른쪽 값을 빼는 연산이다. 덧셈과 달리 순서를 바꾸면 결과가 달라진다.
print(10 - 3) # 7
print(3 - 10) # -7
곱셈은 코딩에서 x가 아니라 *를 쓴다. 처음에는 낯설지만 금방 익숙해진다.
price = 12000
count = 3
total = price * count
print(total) # 36000
Python에서는 문자열에 정수를 곱하면 같은 문자열을 반복할 수도 있다. 이것은 숫자 곱셈이라기보다 “반복”에 가깝다.
print("ha" * 3) # hahaha
print("-" * 10) # ----------
이런 기능은 간단한 출력 테스트에는 편하지만, 실제 계산 코드에서는 값이 숫자인지 문자열인지 계속 확인하는 습관이 중요하다.
5. 나눗셈: 몫을 볼지, 소수까지 볼지 정해야 한다
나눗셈을 이해하려면 먼저 용어를 정리하는 편이 좋다.
나누어지는 수: 10
나누는 수: 3
몫: 3
나머지: 1
코딩에서는 이 네 가지를 자주 나눠서 생각한다. 어떤 상황에서는 10 / 3처럼 소수 결과가 필요하고, 어떤 상황에서는 “3개씩 묶으면 몇 묶음이 되는지”처럼 몫만 필요하다. 또 어떤 상황에서는 “묶고 남는 것이 몇 개인지”가 더 중요하다.
print(10 / 3) # 3.3333333333333335
print(10 // 3) # 3
print(10 % 3) # 1
Python에서 /는 정수끼리 나눠도 소수형 결과를 만든다.
print(6 / 3) # 2.0
수학적으로는 2지만, Python 결과는 2.0이다. 2는 정수, 2.0은 소수형 숫자다. 값은 비슷해 보여도 타입이 다르다. 이 차이는 나중에 데이터베이스 저장, 화면 표시, 반올림 처리에서 중요해진다.
6. 몫: //는 “그냥 소수점 버리기”가 아니다
몫은 나눗셈 결과에서 “몇 번 들어가는가”를 나타내는 값이다. 예를 들어 사탕 10개를 3명에게 똑같이 나눠주면 한 명당 3개씩 줄 수 있고, 1개가 남는다. 여기서 3이 몫이다.
candies = 10
people = 3
each = candies // people
left = candies % people
print(each) # 3
print(left) # 1
Python의 //는 floor division이라고 부른다. 양수끼리 계산할 때는 단순히 소수점 아래를 버리는 것처럼 보인다.
print(7 // 2) # 3
print(9 // 4) # 2
print(100 // 30) # 3
하지만 음수가 들어가면 이야기가 조금 달라진다. Python의 //는 결과를 0쪽으로 자르는 것이 아니라 더 작은 정수 방향으로 내린다.
print(-7 / 2) # -3.5
print(-7 // 2) # -4
처음 보면 “왜 -3이 아니지?” 싶을 수 있다. 이유는 //가 floor, 즉 바닥 방향으로 내리기 때문이다. 숫자선에서 -4는 -3보다 더 작다. 양수만 다룰 때는 크게 신경 쓰지 않아도 되지만, 좌표 계산이나 날짜 차이처럼 음수가 나올 수 있는 코드에서는 이 차이가 중요하다.
JavaScript에서 몫을 구하려면
JavaScript 일반 숫자에는 Python의 //가 없다. 양수에서 몫만 필요하면 Math.floor(7 / 2)를 많이 쓴다. 음수까지 다룰 때는 Math.floor()와 Math.trunc()의 결과가 달라질 수 있으므로 의도를 먼저 정해야 한다.
console.log(Math.floor(7 / 2)); // 3
console.log(Math.trunc(7 / 2)); // 3
console.log(Math.floor(-7 / 2)); // -4
console.log(Math.trunc(-7 / 2)); // -3
7. 나머지: %는 생각보다 자주 쓴다
나머지는 나누고 남은 값이다. 수학 시간에는 그냥 문제 풀이용으로 지나갔을 수 있지만, 코딩에서는 매우 자주 등장한다.
print(10 % 3) # 1
print(8 % 2) # 0
print(9 % 2) # 1
가장 쉬운 예는 짝수와 홀수 판별이다. 어떤 수를 2로 나눴을 때 나머지가 0이면 짝수, 1이면 홀수다.
number = 17
if number % 2 == 0:
print("짝수")
else:
print("홀수")
나머지는 반복되는 패턴을 만들 때도 유용하다. 예를 들어 요일은 7일마다 반복되고, 배열 인덱스는 길이를 넘으면 다시 처음으로 돌아가야 할 때가 있다.
days = ["월", "화", "수", "목", "금", "토", "일"]
today_index = 0
after_10_days = (today_index + 10) % 7
print(days[after_10_days]) # 목
“7로 나눈 나머지”를 사용했기 때문에 0부터 6 사이의 인덱스 안에서만 결과가 나온다. 달력, 순번, 페이지, 슬라이드, 게임 캐릭터 위치처럼 반복 구조가 있는 곳에서 %는 정말 자주 쓰인다.
음수의 나머지는 언어마다 다를 수 있다
양수끼리 계산할 때는 %를 “나머지”라고 이해해도 거의 문제가 없다. 다만 음수가 들어가면 Python과 JavaScript 결과가 달라질 수 있다. 예를 들어 Python의 -7 % 2는 1이고, JavaScript의 -7 % 2는 -1이다. 좌표 이동, 회전, 순환 인덱스처럼 음수가 나올 수 있는 코드는 공식 문서를 확인하는 습관이 좋다.
8. 몫과 나머지는 항상 한 세트로 생각하면 편하다
몫과 나머지는 따로 외우는 것보다 아래 관계로 묶어 이해하면 훨씬 쉽다.
10 = 3 × 3 + 1
Python에서는 이 관계가 그대로 코드로도 이어진다.
x = 10
y = 3
quotient = x // y
remainder = x % y
print(x == y * quotient + remainder) # True
몫과 나머지를 동시에 구하고 싶다면 Python에서는 divmod()도 쓸 수 있다.
quotient, remainder = divmod(10, 3)
print(quotient) # 3
print(remainder) # 1
실전 감각으로 바꿔보기
사람 5명에게 쿠키 23개를 나눠준다면 23 // 5는 한 명당 받을 수 있는 쿠키 수이고, 23 % 5는 나누고 남는 쿠키 수다. 즉 몫은 “공평하게 몇 개씩?”, 나머지는 “그래도 남는 것은?”이라는 질문에 답한다.
9. 연산자 우선순위: 컴퓨터도 계산 순서가 있다
코드는 왼쪽에서 오른쪽으로만 계산되는 것이 아니다. 수학처럼 곱셈과 나눗셈이 덧셈과 뺄셈보다 먼저 계산된다.
print(2 + 3 * 4) # 14
print((2 + 3) * 4) # 20
기본 순서는 대략 이렇게 기억하면 된다.
- 괄호
() - 거듭제곱
** - 곱셈, 나눗셈, 몫, 나머지
*///% - 덧셈, 뺄셈
+-
초보자에게 가장 좋은 습관은 애매하면 괄호를 쓰는 것이다. 컴퓨터가 알아서 해석하겠지 하고 맡기기보다, 내가 의도한 계산 순서를 코드에 드러내는 편이 유지보수에도 좋다.
total_price = (item_price * count) + delivery_fee
average_score = (math_score + english_score + coding_score) / 3
10. 실전 예제로 익히기
예제 1. 장바구니 총액 계산
상품 가격과 개수를 곱하고, 배송비를 더하면 총 결제 금액이 된다. 가장 기본적인 덧셈과 곱셈 조합이다.
item_price = 15000
count = 2
delivery_fee = 3000
total = item_price * count + delivery_fee
print(total) # 33000
예제 2. 회비를 나눠 내기
총 금액을 인원수로 나누면 1인당 금액이 나온다. 원 단위로 딱 떨어지지 않으면 몫과 나머지를 함께 봐야 한다.
total_fee = 10000
people = 3
each = total_fee // people
left = total_fee % people
print(each) # 3333
print(left) # 1
이 경우 한 사람당 3,333원씩 내면 1원이 남는다. 실제 서비스라면 남은 1원을 누가 부담할지 정책을 정해야 한다. 코딩에서 산술 연산은 단순 계산으로 끝나지 않고, 이렇게 서비스 규칙과 연결된다.
예제 3. 게시글 페이지 수 계산
게시글이 53개 있고 한 페이지에 10개씩 보여준다면 몇 페이지가 필요할까? 일반 나눗셈으로는 5.3이지만, 실제 화면에는 6페이지가 필요하다.
import math
total_posts = 53
page_size = 10
pages = math.ceil(total_posts / page_size)
print(pages) # 6
여기서는 몫만 구하면 안 된다. 5페이지까지는 50개를 보여주고, 남은 3개를 보여줄 6페이지가 필요하기 때문이다. 이런 경우에는 올림을 사용한다.
예제 4. 초를 분과 초로 바꾸기
러닝 앱이나 타이머 앱을 만든다고 생각해보자. 125초를 “2분 5초”로 바꾸려면 몫과 나머지를 함께 쓰면 된다.
seconds = 125
minutes = seconds // 60
remaining_seconds = seconds % 60
print(minutes) # 2
print(remaining_seconds) # 5
이 예제는 몫과 나머지가 왜 중요한지 가장 잘 보여준다. 몫은 완성된 분 단위이고, 나머지는 분으로 묶고 남은 초다.
11. 초보자가 자주 만나는 오류
0으로 나누기
어떤 수를 0으로 나누는 계산은 성립하지 않는다. Python에서는 ZeroDivisionError가 발생한다.
print(10 / 0) # ZeroDivisionError
그래서 사용자 입력값이나 데이터 개수로 나눌 때는 0인지 먼저 확인해야 한다.
total = 100
count = 0
if count == 0:
print("평균을 계산할 수 없습니다.")
else:
print(total / count)
소수 계산이 딱 맞지 않는 문제
컴퓨터는 소수를 10진수 그대로 저장하지 못하는 경우가 있다. 그래서 아래처럼 예상과 조금 다른 결과가 나올 수 있다.
print(0.1 + 0.2) # 0.30000000000000004
이것은 Python만의 문제가 아니라 많은 프로그래밍 언어에서 만나는 부동소수점 표현 문제다. 일반적인 화면 표시에서는 반올림해서 보여주면 되고, 돈 계산처럼 정확성이 중요한 경우에는 원 단위 정수로 저장하거나 Decimal 같은 별도 방식을 사용한다.
반올림, 올림, 내림을 섞어 쓰는 문제
나눗셈 결과를 정수로 바꿀 때는 “어떤 방식으로 정수화할 것인지”를 분명히 해야 한다.
| 방식 | 의미 | 예시 | 어울리는 상황 |
|---|---|---|---|
| 버림 | 소수 부분을 제거한다. | int(3.8) == 3 |
소수는 필요 없고 정수 부분만 쓸 때 |
| 내림 | 더 작은 정수로 내린다. | math.floor(3.8) == 3 |
좌표, 구간, floor division 개념 |
| 올림 | 더 큰 정수로 올린다. | math.ceil(3.1) == 4 |
페이지 수, 필요한 박스 수 계산 |
| 반올림 | 가까운 정수로 맞춘다. | round(3.6) == 4 |
평균 점수, 화면 표시 |
값을 업데이트할 때 생기는 헷갈림
코딩에서는 기존 값에 어떤 값을 더해서 다시 저장하는 일이 아주 많다.
count = 0
count = count + 1
print(count) # 1
이 코드는 수학 방정식이 아니다. “오른쪽을 먼저 계산한 뒤, 그 결과를 왼쪽 변수에 다시 넣는다”는 뜻이다. 같은 코드를 더 짧게 쓰면 이렇게 된다.
count += 1
total += price
stock -= 1
+=, -=, *=, /= 같은 대입 연산자는 계산과 저장을 한 번에 표현한다. 반복문에서 카운트를 세거나, 장바구니 금액을 누적하거나, 재고를 줄일 때 자주 사용한다.
JavaScript나 C 계열 언어에서는 count++, count--처럼 1씩 증가하거나 감소시키는 증감 연산자도 자주 보인다. Python에는 ++ 연산자가 없으므로 count += 1처럼 쓰면 된다. 처음에는 언어별 특수 문법보다 count = count + 1의 의미를 정확히 이해하는 것이 먼저다.
12. 머릿속에 이렇게 정리하면 오래 간다
+: 숫자끼리는 더하고, 문자열끼리는 이어 붙인다. 계산 전 타입을 확인하자.
-: 왼쪽에서 오른쪽을 뺀다. 순서가 바뀌면 결과도 바뀐다.
*: 곱셈이다. Python에서는 문자열 반복에도 쓰일 수 있다.
/: 나눗셈 결과를 소수까지 본다. Python에서는 정수끼리 나눠도 결과가 소수형이다.
//: 몫을 구한다. Python에서는 floor division이라 음수 계산에서 주의가 필요하다.
%: 나머지를 구한다. 짝수/홀수, 반복 패턴, 시간 변환, 페이지 계산에서 자주 쓴다.
괄호: 계산 순서가 조금이라도 헷갈리면 괄호로 의도를 드러내자.
13. 연습 문제
아래 문제를 직접 손으로 예상해보고, 그다음 코드로 실행해보면 훨씬 빨리 익숙해진다.
17 // 5와17 % 5의 결과는 무엇일까?- 초 367초를 “몇 분 몇 초”로 바꾸려면 어떤 연산자를 써야 할까?
- 게시글 101개를 한 페이지에 20개씩 보여주려면 총 몇 페이지가 필요할까?
"3" + "4"와int("3") + int("4")의 결과는 어떻게 다를까?2 + 3 * 4와(2 + 3) * 4의 결과가 다른 이유는 무엇일까?
정답 힌트
1번은 몫 3, 나머지 2다. 2번은 // 60과 % 60을 함께 쓰면 된다. 3번은 딱 나누어떨어지지 않는 남은 글이 있으므로 올림이 필요하다.
마무리
덧셈, 나눗셈, 몫, 나머지는 코딩 입문 초반에 배우지만, 실제로는 계속 다시 만나는 개념이다. 가격 계산, 평균 계산, 시간 변환, 페이지네이션, 짝수·홀수 판별, 반복 패턴 만들기까지 거의 모든 기본 프로그램에 들어간다.
처음에는 연산자 기호를 외우는 것보다 “이 계산에서 내가 원하는 결과가 소수인지, 몫인지, 나머지인지”를 먼저 묻는 습관이 더 중요하다. 그 질문에 답할 수 있으면 /, //, % 중 무엇을 써야 할지도 자연스럽게 보인다.
참고 자료
이 글은 코딩 입문자를 위한 학습용 글입니다. 언어마다 산술 연산자의 세부 동작이 조금씩 다를 수 있으므로, 실제 프로젝트에서는 사용 중인 언어의 공식 문서를 함께 확인하는 것이 좋습니다.
코딩의 덧셈·나눗셈·몫·나머지 완전 기초
코딩을 처음 배울 때 덧셈, 뺄셈, 곱셈, 나눗셈은 쉬워 보인다. 그런데 막상 코드를 쓰다 보면 /와 //의 차이, %가 왜 필요한지, 1 + "2" 같은 코드가 왜 이상한 결과를 만드는지에서 자주 막힌다.
이 글은 수학을 잘하는 사람을 위한 글이 아니라, 코딩을 막 시작한 사람이 “아, 그래서 이렇게 쓰는구나” 하고 감을 잡을 수 있도록 정리한 산술 연산자 기초 가이드다. 예제는 Python을 중심으로 설명하고, 웹 개발 입문자가 많이 만나는 JavaScript 차이도 함께 적었다.
+ - * /코딩에서 산술 연산은 계산기 기능이 아니라, 데이터를 원하는 형태로 바꾸는 가장 기본적인 도구다.
1. 코딩에서 연산자는 무엇일까?
연산자는 컴퓨터에게 “이 값과 저 값을 이렇게 계산해줘”라고 말하는 기호다. 예를 들어 3 + 4에서 3과 4는 계산에 쓰이는 값이고, +는 두 값을 더하라는 연산자다. 이런 계산식 전체를 보통 표현식이라고 부른다.
3 + 4
price * count
total / people
초보자는 연산자를 “수학 기호”로만 생각하기 쉽다. 하지만 코딩에서는 한 가지를 더 봐야 한다. 바로 값의 종류, 즉 타입이다. 숫자끼리 더하면 계산이 되지만, 문자열끼리 더하면 글자가 이어 붙는다. 같은 +라도 어떤 타입에 쓰느냐에 따라 의미가 달라질 수 있다.
2. 기본 산술 연산자 한 번에 보기
대부분의 프로그래밍 언어는 아래 연산자를 공통으로 사용한다. 기호 자체는 단순하지만, 실제 코드를 짤 때는 “결과가 정수인지 소수인지”, “나눗셈에서 몫만 필요한지”, “나머지가 필요한지”를 구분해야 한다.
| 연산자 | 이름 | 의미 | Python 예시 | 결과 |
|---|---|---|---|---|
+ |
덧셈 | 두 값을 더한다. | 10 + 3 |
13 |
- |
뺄셈 | 왼쪽 값에서 오른쪽 값을 뺀다. | 10 - 3 |
7 |
* |
곱셈 | 두 값을 곱한다. | 10 * 3 |
30 |
/ |
나눗셈 | 왼쪽 값을 오른쪽 값으로 나눈다. | 10 / 3 |
3.333... |
// |
몫, floor division | 나눈 결과에서 정수 몫을 구한다. | 10 // 3 |
3 |
% |
나머지, modulo | 나누고 남은 값을 구한다. | 10 % 3 |
1 |
** |
거듭제곱 | 같은 수를 여러 번 곱한다. | 2 ** 3 |
8 |
JavaScript를 공부한다면?
JavaScript에도 +, -, *, /, %, **가 있다. 다만 Python의 //처럼 몫만 바로 구하는 연산자는 일반 숫자 타입에 따로 없어서 Math.floor(), Math.trunc() 같은 함수를 함께 쓴다.
3. 덧셈: 숫자는 더하고, 문자열은 붙인다
덧셈은 가장 익숙한 연산이다. 숫자끼리 더하면 우리가 아는 그 덧셈이다.
a = 10
b = 3
print(a + b) # 13
그런데 코딩에서 +는 숫자에만 쓰이지 않는다. 문자열에도 쓸 수 있다. 문자열은 글자 데이터이기 때문에, 이때 +는 계산이 아니라 이어 붙이기가 된다.
first_name = "Heo"
last_name = "Brain"
print(first_name + last_name) # HeoBrain
print(first_name + " " + last_name) # Heo Brain
여기서 초보자가 자주 만나는 실수가 있다. 숫자처럼 보이는 문자열은 숫자가 아니다.
print(1 + 2) # 3
print("1" + "2") # 12
"1"은 숫자 1이 아니라 글자 "1"이다. 그래서 "1" + "2"는 3이 아니라 "12"가 된다. 사용자 입력값은 대부분 문자열로 들어오기 때문에, 계산하려면 숫자로 바꿔야 한다.
age_text = "20"
age = int(age_text)
print(age + 1) # 21
JavaScript에서 더 조심해야 하는 부분
JavaScript에서는 "1" + 2가 "12"가 된다. 한쪽이 문자열이면 다른 값도 문자열처럼 이어 붙는 상황이 생긴다. 숫자 계산을 하고 싶다면 Number("1") + 2처럼 명시적으로 변환하는 습관이 좋다.
4. 뺄셈과 곱셈: 순서와 기호를 정확히 보기
뺄셈은 왼쪽 값에서 오른쪽 값을 빼는 연산이다. 덧셈과 달리 순서를 바꾸면 결과가 달라진다.
print(10 - 3) # 7
print(3 - 10) # -7
곱셈은 코딩에서 x가 아니라 *를 쓴다. 처음에는 낯설지만 금방 익숙해진다.
price = 12000
count = 3
total = price * count
print(total) # 36000
Python에서는 문자열에 정수를 곱하면 같은 문자열을 반복할 수도 있다. 이것은 숫자 곱셈이라기보다 “반복”에 가깝다.
print("ha" * 3) # hahaha
print("-" * 10) # ----------
이런 기능은 간단한 출력 테스트에는 편하지만, 실제 계산 코드에서는 값이 숫자인지 문자열인지 계속 확인하는 습관이 중요하다.
5. 나눗셈: 몫을 볼지, 소수까지 볼지 정해야 한다
나눗셈을 이해하려면 먼저 용어를 정리하는 편이 좋다.
나누어지는 수: 10
나누는 수: 3
몫: 3
나머지: 1
코딩에서는 이 네 가지를 자주 나눠서 생각한다. 어떤 상황에서는 10 / 3처럼 소수 결과가 필요하고, 어떤 상황에서는 “3개씩 묶으면 몇 묶음이 되는지”처럼 몫만 필요하다. 또 어떤 상황에서는 “묶고 남는 것이 몇 개인지”가 더 중요하다.
print(10 / 3) # 3.3333333333333335
print(10 // 3) # 3
print(10 % 3) # 1
Python에서 /는 정수끼리 나눠도 소수형 결과를 만든다.
print(6 / 3) # 2.0
수학적으로는 2지만, Python 결과는 2.0이다. 2는 정수, 2.0은 소수형 숫자다. 값은 비슷해 보여도 타입이 다르다. 이 차이는 나중에 데이터베이스 저장, 화면 표시, 반올림 처리에서 중요해진다.
6. 몫: //는 “그냥 소수점 버리기”가 아니다
몫은 나눗셈 결과에서 “몇 번 들어가는가”를 나타내는 값이다. 예를 들어 사탕 10개를 3명에게 똑같이 나눠주면 한 명당 3개씩 줄 수 있고, 1개가 남는다. 여기서 3이 몫이다.
candies = 10
people = 3
each = candies // people
left = candies % people
print(each) # 3
print(left) # 1
Python의 //는 floor division이라고 부른다. 양수끼리 계산할 때는 단순히 소수점 아래를 버리는 것처럼 보인다.
print(7 // 2) # 3
print(9 // 4) # 2
print(100 // 30) # 3
하지만 음수가 들어가면 이야기가 조금 달라진다. Python의 //는 결과를 0쪽으로 자르는 것이 아니라 더 작은 정수 방향으로 내린다.
print(-7 / 2) # -3.5
print(-7 // 2) # -4
처음 보면 “왜 -3이 아니지?” 싶을 수 있다. 이유는 //가 floor, 즉 바닥 방향으로 내리기 때문이다. 숫자선에서 -4는 -3보다 더 작다. 양수만 다룰 때는 크게 신경 쓰지 않아도 되지만, 좌표 계산이나 날짜 차이처럼 음수가 나올 수 있는 코드에서는 이 차이가 중요하다.
JavaScript에서 몫을 구하려면
JavaScript 일반 숫자에는 Python의 //가 없다. 양수에서 몫만 필요하면 Math.floor(7 / 2)를 많이 쓴다. 음수까지 다룰 때는 Math.floor()와 Math.trunc()의 결과가 달라질 수 있으므로 의도를 먼저 정해야 한다.
console.log(Math.floor(7 / 2)); // 3
console.log(Math.trunc(7 / 2)); // 3
console.log(Math.floor(-7 / 2)); // -4
console.log(Math.trunc(-7 / 2)); // -3
7. 나머지: %는 생각보다 자주 쓴다
나머지는 나누고 남은 값이다. 수학 시간에는 그냥 문제 풀이용으로 지나갔을 수 있지만, 코딩에서는 매우 자주 등장한다.
print(10 % 3) # 1
print(8 % 2) # 0
print(9 % 2) # 1
가장 쉬운 예는 짝수와 홀수 판별이다. 어떤 수를 2로 나눴을 때 나머지가 0이면 짝수, 1이면 홀수다.
number = 17
if number % 2 == 0:
print("짝수")
else:
print("홀수")
나머지는 반복되는 패턴을 만들 때도 유용하다. 예를 들어 요일은 7일마다 반복되고, 배열 인덱스는 길이를 넘으면 다시 처음으로 돌아가야 할 때가 있다.
days = ["월", "화", "수", "목", "금", "토", "일"]
today_index = 0
after_10_days = (today_index + 10) % 7
print(days[after_10_days]) # 목
“7로 나눈 나머지”를 사용했기 때문에 0부터 6 사이의 인덱스 안에서만 결과가 나온다. 달력, 순번, 페이지, 슬라이드, 게임 캐릭터 위치처럼 반복 구조가 있는 곳에서 %는 정말 자주 쓰인다.
음수의 나머지는 언어마다 다를 수 있다
양수끼리 계산할 때는 %를 “나머지”라고 이해해도 거의 문제가 없다. 다만 음수가 들어가면 Python과 JavaScript 결과가 달라질 수 있다. 예를 들어 Python의 -7 % 2는 1이고, JavaScript의 -7 % 2는 -1이다. 좌표 이동, 회전, 순환 인덱스처럼 음수가 나올 수 있는 코드는 공식 문서를 확인하는 습관이 좋다.
8. 몫과 나머지는 항상 한 세트로 생각하면 편하다
몫과 나머지는 따로 외우는 것보다 아래 관계로 묶어 이해하면 훨씬 쉽다.
10 = 3 × 3 + 1
Python에서는 이 관계가 그대로 코드로도 이어진다.
x = 10
y = 3
quotient = x // y
remainder = x % y
print(x == y * quotient + remainder) # True
몫과 나머지를 동시에 구하고 싶다면 Python에서는 divmod()도 쓸 수 있다.
quotient, remainder = divmod(10, 3)
print(quotient) # 3
print(remainder) # 1
실전 감각으로 바꿔보기
사람 5명에게 쿠키 23개를 나눠준다면 23 // 5는 한 명당 받을 수 있는 쿠키 수이고, 23 % 5는 나누고 남는 쿠키 수다. 즉 몫은 “공평하게 몇 개씩?”, 나머지는 “그래도 남는 것은?”이라는 질문에 답한다.
9. 연산자 우선순위: 컴퓨터도 계산 순서가 있다
코드는 왼쪽에서 오른쪽으로만 계산되는 것이 아니다. 수학처럼 곱셈과 나눗셈이 덧셈과 뺄셈보다 먼저 계산된다.
print(2 + 3 * 4) # 14
print((2 + 3) * 4) # 20
기본 순서는 대략 이렇게 기억하면 된다.
- 괄호
() - 거듭제곱
** - 곱셈, 나눗셈, 몫, 나머지
*///% - 덧셈, 뺄셈
+-
초보자에게 가장 좋은 습관은 애매하면 괄호를 쓰는 것이다. 컴퓨터가 알아서 해석하겠지 하고 맡기기보다, 내가 의도한 계산 순서를 코드에 드러내는 편이 유지보수에도 좋다.
total_price = (item_price * count) + delivery_fee
average_score = (math_score + english_score + coding_score) / 3
10. 실전 예제로 익히기
예제 1. 장바구니 총액 계산
상품 가격과 개수를 곱하고, 배송비를 더하면 총 결제 금액이 된다. 가장 기본적인 덧셈과 곱셈 조합이다.
item_price = 15000
count = 2
delivery_fee = 3000
total = item_price * count + delivery_fee
print(total) # 33000
예제 2. 회비를 나눠 내기
총 금액을 인원수로 나누면 1인당 금액이 나온다. 원 단위로 딱 떨어지지 않으면 몫과 나머지를 함께 봐야 한다.
total_fee = 10000
people = 3
each = total_fee // people
left = total_fee % people
print(each) # 3333
print(left) # 1
이 경우 한 사람당 3,333원씩 내면 1원이 남는다. 실제 서비스라면 남은 1원을 누가 부담할지 정책을 정해야 한다. 코딩에서 산술 연산은 단순 계산으로 끝나지 않고, 이렇게 서비스 규칙과 연결된다.
예제 3. 게시글 페이지 수 계산
게시글이 53개 있고 한 페이지에 10개씩 보여준다면 몇 페이지가 필요할까? 일반 나눗셈으로는 5.3이지만, 실제 화면에는 6페이지가 필요하다.
import math
total_posts = 53
page_size = 10
pages = math.ceil(total_posts / page_size)
print(pages) # 6
여기서는 몫만 구하면 안 된다. 5페이지까지는 50개를 보여주고, 남은 3개를 보여줄 6페이지가 필요하기 때문이다. 이런 경우에는 올림을 사용한다.
예제 4. 초를 분과 초로 바꾸기
러닝 앱이나 타이머 앱을 만든다고 생각해보자. 125초를 “2분 5초”로 바꾸려면 몫과 나머지를 함께 쓰면 된다.
seconds = 125
minutes = seconds // 60
remaining_seconds = seconds % 60
print(minutes) # 2
print(remaining_seconds) # 5
이 예제는 몫과 나머지가 왜 중요한지 가장 잘 보여준다. 몫은 완성된 분 단위이고, 나머지는 분으로 묶고 남은 초다.
11. 초보자가 자주 만나는 오류
0으로 나누기
어떤 수를 0으로 나누는 계산은 성립하지 않는다. Python에서는 ZeroDivisionError가 발생한다.
print(10 / 0) # ZeroDivisionError
그래서 사용자 입력값이나 데이터 개수로 나눌 때는 0인지 먼저 확인해야 한다.
total = 100
count = 0
if count == 0:
print("평균을 계산할 수 없습니다.")
else:
print(total / count)
소수 계산이 딱 맞지 않는 문제
컴퓨터는 소수를 10진수 그대로 저장하지 못하는 경우가 있다. 그래서 아래처럼 예상과 조금 다른 결과가 나올 수 있다.
print(0.1 + 0.2) # 0.30000000000000004
이것은 Python만의 문제가 아니라 많은 프로그래밍 언어에서 만나는 부동소수점 표현 문제다. 일반적인 화면 표시에서는 반올림해서 보여주면 되고, 돈 계산처럼 정확성이 중요한 경우에는 원 단위 정수로 저장하거나 Decimal 같은 별도 방식을 사용한다.
반올림, 올림, 내림을 섞어 쓰는 문제
나눗셈 결과를 정수로 바꿀 때는 “어떤 방식으로 정수화할 것인지”를 분명히 해야 한다.
| 방식 | 의미 | 예시 | 어울리는 상황 |
|---|---|---|---|
| 버림 | 소수 부분을 제거한다. | int(3.8) == 3 |
소수는 필요 없고 정수 부분만 쓸 때 |
| 내림 | 더 작은 정수로 내린다. | math.floor(3.8) == 3 |
좌표, 구간, floor division 개념 |
| 올림 | 더 큰 정수로 올린다. | math.ceil(3.1) == 4 |
페이지 수, 필요한 박스 수 계산 |
| 반올림 | 가까운 정수로 맞춘다. | round(3.6) == 4 |
평균 점수, 화면 표시 |
값을 업데이트할 때 생기는 헷갈림
코딩에서는 기존 값에 어떤 값을 더해서 다시 저장하는 일이 아주 많다.
count = 0
count = count + 1
print(count) # 1
이 코드는 수학 방정식이 아니다. “오른쪽을 먼저 계산한 뒤, 그 결과를 왼쪽 변수에 다시 넣는다”는 뜻이다. 같은 코드를 더 짧게 쓰면 이렇게 된다.
count += 1
total += price
stock -= 1
+=, -=, *=, /= 같은 대입 연산자는 계산과 저장을 한 번에 표현한다. 반복문에서 카운트를 세거나, 장바구니 금액을 누적하거나, 재고를 줄일 때 자주 사용한다.
JavaScript나 C 계열 언어에서는 count++, count--처럼 1씩 증가하거나 감소시키는 증감 연산자도 자주 보인다. Python에는 ++ 연산자가 없으므로 count += 1처럼 쓰면 된다. 처음에는 언어별 특수 문법보다 count = count + 1의 의미를 정확히 이해하는 것이 먼저다.
12. 머릿속에 이렇게 정리하면 오래 간다
+: 숫자끼리는 더하고, 문자열끼리는 이어 붙인다. 계산 전 타입을 확인하자.
-: 왼쪽에서 오른쪽을 뺀다. 순서가 바뀌면 결과도 바뀐다.
*: 곱셈이다. Python에서는 문자열 반복에도 쓰일 수 있다.
/: 나눗셈 결과를 소수까지 본다. Python에서는 정수끼리 나눠도 결과가 소수형이다.
//: 몫을 구한다. Python에서는 floor division이라 음수 계산에서 주의가 필요하다.
%: 나머지를 구한다. 짝수/홀수, 반복 패턴, 시간 변환, 페이지 계산에서 자주 쓴다.
괄호: 계산 순서가 조금이라도 헷갈리면 괄호로 의도를 드러내자.
13. 연습 문제
아래 문제를 직접 손으로 예상해보고, 그다음 코드로 실행해보면 훨씬 빨리 익숙해진다.
17 // 5와17 % 5의 결과는 무엇일까?- 초 367초를 “몇 분 몇 초”로 바꾸려면 어떤 연산자를 써야 할까?
- 게시글 101개를 한 페이지에 20개씩 보여주려면 총 몇 페이지가 필요할까?
"3" + "4"와int("3") + int("4")의 결과는 어떻게 다를까?2 + 3 * 4와(2 + 3) * 4의 결과가 다른 이유는 무엇일까?
정답 힌트
1번은 몫 3, 나머지 2다. 2번은 // 60과 % 60을 함께 쓰면 된다. 3번은 딱 나누어떨어지지 않는 남은 글이 있으므로 올림이 필요하다.
마무리
덧셈, 나눗셈, 몫, 나머지는 코딩 입문 초반에 배우지만, 실제로는 계속 다시 만나는 개념이다. 가격 계산, 평균 계산, 시간 변환, 페이지네이션, 짝수·홀수 판별, 반복 패턴 만들기까지 거의 모든 기본 프로그램에 들어간다.
처음에는 연산자 기호를 외우는 것보다 “이 계산에서 내가 원하는 결과가 소수인지, 몫인지, 나머지인지”를 먼저 묻는 습관이 더 중요하다. 그 질문에 답할 수 있으면 /, //, % 중 무엇을 써야 할지도 자연스럽게 보인다.
참고 자료
이 글은 코딩 입문자를 위한 학습용 글입니다. 언어마다 산술 연산자의 세부 동작이 조금씩 다를 수 있으므로, 실제 프로젝트에서는 사용 중인 언어의 공식 문서를 함께 확인하는 것이 좋습니다.
'AI > Coding' 카테고리의 다른 글
| 파이썬 입문 1편 — 프로그래밍이 처음이어도 괜찮습니다: 설치부터 첫 코드, 변수·자료형까지 (0) | 2026.06.10 |
|---|