JavaScript 산술 연산 —
우선순위와 나머지 완전 정리
변수 하나(x = 32)를 가지고 네 가지 계산을 해 보는 코드다. 겉보기엔 단순한 사칙연산인데, 실행해 보면 "왜 결과가 이렇게 나오지?" 싶은 지점이 두 곳 있다. total이 113이 되는 계산 순서, 그리고 div가 정수가 아니라 3.2라는 소수로 나오는 이유다.
100 + x*2/4 - 3 = 113
x/10 = 3.2
x%2 = 0
total = 113(정수), div = 3.2(소수), mod = 0(짝수라서 나머지 없음). 이 세 결과가 어떻게 나오는지 하나씩 뜯어본다.초등학교 산수와 똑같다. 더하기·빼기·곱하기·나누기 네 개에, 프로그래밍에서만 자주 쓰는 나머지(%) 하나가 추가된 것이 전부다. 복잡해 보이는 계산도 결국 이 다섯 기호의 조합일 뿐이다.
| 연산자 | 이름 | 예시 (x=32) | 결과 |
|---|---|---|---|
+ |
더하기 | x + 10 |
42 |
- |
빼기 | x - 10 |
22 |
* |
곱하기 | x * 2 |
64 |
/ |
나누기 | x / 10 |
3.2 |
% |
나머지 | x % 2 |
0 |
*는 수학에서 쓰는 ×가 아니고, /는 ÷가 아니다. 키보드에 있는 별표와 슬래시를 그대로 쓴다.100 + x*2/4 - 3을 보면 왼쪽부터 "100 더하고, x 곱하고..." 순서로 읽고 싶어진다. 하지만 JS를 포함한 대부분의 프로그래밍 언어와 수학은 곱하기·나누기를 더하기·빼기보다 먼저 계산한다. 수학 시간에 배운 "곱셈과 나눗셈을 먼저 하라"는 규칙이 코드에도 그대로 적용되는 것이다. 이 규칙이 없으면 같은 식이 계산 순서에 따라 완전히 다른 결과를 내서, 모두가 같은 답을 얻을 수 없다.
- 1순위 — 괄호
() - 2순위 — 곱하기
*, 나누기/, 나머지% - 3순위 — 더하기
+, 빼기-
가끔은 덧셈을 곱셈보다 먼저 하고 싶을 수 있다. 그럴 때 쓰는 도구가 괄호 ()다. 괄호 안은 우선순위와 상관없이 항상 가장 먼저 계산된다. 즉 계산 순서의 "최종 결정권"은 괄호가 쥐고 있다.
100 + x*2/4 - 3→ x*2/4 먼저 → 113
(100 + x) * 2 / (4-3)→ 괄호부터 → 264
100 + x*2/4 - 3은 의도와 다른 값(113)을 낸다. 원하는 계산 순서가 우선순위와 다르면 반드시 괄호를 써야 한다.
다른 언어(Java, C 등)는 정수(int)와 실수(float)를 구분해서, 정수끼리 나누면 몫만 남기고 소수점을 버려 32/10 = 3이 되기도 한다. 하지만 JavaScript는 숫자 타입이 Number 하나뿐이다. 정수든 실수든 구분하지 않고 똑같이 취급하기 때문에, 나눗셈이 딱 떨어지지 않으면 소수점까지 그대로 계산해서 보여준다. 그래서 x / 10은 몫만 남기지 않고 32 / 10 = 3.2라는 실수 결과가 자연스럽게 나온다.
Math.floor(x / 10)— 소수점 이하를 버림 → 3Math.round(x / 10)— 반올림 → 3parseInt(x / 10)— 문자열처럼 정수 부분만 추출 → 3
%는 나눗셈을 하되 몫이 아니라 "나눠떨어지지 않고 남는 값"만 돌려준다. x % 2는 x를 2로 나눈 나머지이므로 결과는 항상 0 아니면 1이다. 32는 2로 나누어떨어지는 짝수라서 x % 2 = 0이 나온 것이다. 이 성질 덕분에 % 연산자는 실무에서 짝수/홀수 판별, 순환(캐러셀), 시:분:초 변환 등에 자주 쓰인다.
| 식 | 결과 | 의미 |
|---|---|---|
32 % 2 |
0 | 짝수 (나머지 없음) |
33 % 2 |
1 | 홀수 (나머지 1) |
10 % 3 |
1 | 10 = 3*3 + 1 |
if (num % 2 === 0) { 짝수 처리 } — 게시판 목록 배경색 번갈아 칠하기, 5줄마다 구분선 넣기 등에 % 가 항상 등장한다.x*2/4처럼 같은 우선순위의 연산자가 나란히 있으면 왼쪽에서 오른쪽 순서로 계산한다. 이걸 "왼쪽 결합(left-to-right associativity)"이라 부른다. x*2/4는 x*(2/4)가 아니라 (x*2)/4로 계산되는데, 곱하기와 나누기가 같은 우선순위이기 때문에 먼저 나온 곱하기부터 처리하는 것이다. 뒤쪽의 100 + 16 - 3도 마찬가지로 더하기와 빼기가 같은 우선순위라서 왼쪽의 덧셈부터 처리된다.
| 실수 | 증상 | 해결 |
|---|---|---|
| 왼쪽부터 순서대로 계산한다고 오해 | 100 + x*2/4 - 3을 (100+x)*2/4-3처럼 잘못 암산 |
*, / 가 +, - 보다 먼저라는 우선순위 규칙 암기 |
x / 10이 정수(3)로 나올 거라 기대 |
Java·C 습관대로 소수점이 사라질 거라 착각 → 실제론 3.2 | JS는 Number 타입 하나 — 정수 필요하면 Math.floor() 사용 |
| 음수에 % 연산 사용 시 부호 오해 | -7 % 2가 1일 거라 예상했는데 -1이 나옴 |
JS의 %는 나머지 부호가 피제수(왼쪽 값)를 따른다는 점 확인 |
| 계산 순서를 바꾸고 싶은데 괄호를 안 씀 | 의도한 값과 다른 결과가 나옴 | 우선순위와 다른 순서가 필요하면 반드시 ()로 감싸기 |
| + 연산자를 문자열 연결로 착각해 숫자 계산이 깨짐 | "x : " + x는 되지만 x + "10"은 문자열 붙이기가 됨 |
+ 양쪽에 문자열이 하나라도 있으면 연결, 둘 다 숫자여야 덧셈 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| JavaScript 링크·외부 파일 — href · alert · 이미지 교체 완전 정리 (0) | 2026.07.03 |
|---|---|
| JavaScript 리터럴 — 숫자·불리언·문자열 완전 정리 (0) | 2026.07.03 |
| JavaScript 변수 선언 — let · 전역/지역/블록 스코프 완전 정리 (0) | 2026.07.02 |
| MySQL PROCEDURE SELECT — 특정 회원 조회 완전 정리 (0) | 2026.07.02 |
| MySQL BEFORE TRIGGER — 삽입 전 데이터 보정 · 트리거 체인 완전 정리 (0) | 2026.07.02 |
왕진 블로그

댓글