포스트

JavaScript 수학 표현식과 연산자 완벽 가이드

JavaScript의 산술 연산자, 증감 연산자, 할당 연산자와 연산자 우선순위를 상세히 알아봅니다. 전위/후위 연산자의 차이와 Math 객체 활용법을 마스터합니다.

JavaScript 수학 표현식과 연산자 완벽 가이드

JavaScript 수학 계산

JavaScript에서는 숫자를 사용하여 다양한 수학 계산을 수행할 수 있습니다.

기본 산술 연산

1
2
3
4
5
6
7
8
9
let a = 1.3;
let b = 2;
let c = -10;

console.log(a + b);              // 3.3 (덧셈)
console.log(b * c / 10);         // -2 (곱셈과 나눗셈)
console.log(a + 10);             // 11.3
console.log(450 - 30);           // 420 (뺄셈)
console.log(a + 10 * b * b / 2 + 3);  // 24.3 (복합 연산)

산술 연산자

JavaScript는 다양한 산술 연산자를 제공합니다.

기본 산술 연산자

연산자이름설명예시결과
+덧셈두 값을 더함5 + 38
-뺄셈첫 번째 값에서 두 번째 값을 뺌5 - 32
*곱셈두 값을 곱함5 * 315
/나눗셈첫 번째 값을 두 번째 값으로 나눔6 / 32
%나머지나눗셈의 나머지7 % 31
**거듭제곱첫 번째 값을 두 번째 값만큼 제곱2 ** 38

나머지 연산자 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
// 짝수/홀수 판별
console.log(10 % 2);  // 0 (짝수)
console.log(11 % 2);  // 1 (홀수)

// 배수 판별
console.log(15 % 5);  // 0 (5의 배수)
console.log(16 % 5);  // 1 (5의 배수 아님)

// 순환 인덱스
const colors = ['red', 'green', 'blue'];
for (let i = 0; i < 10; i++) {
  console.log(colors[i % 3]);  // 배열을 순환하며 접근
}

거듭제곱 연산자 (ES2016)

1
2
3
4
5
6
console.log(2 ** 3);   // 8 (2³)
console.log(5 ** 2);   // 25 (5²)
console.log(10 ** -1); // 0.1 (10⁻¹)

// Math.pow()와 동일
console.log(Math.pow(2, 3));  // 8

증감 연산자

증감 연산자는 변수의 값을 1씩 증가 또는 감소시킵니다.

기본 사용법

1
2
3
4
5
6
7
let num = 1;
num++;  // num = num + 1; 과 동일

console.log(num);  // 2

num--;  // num = num - 1; 과 동일
console.log(num);  // 1

후위 증감 연산자 (Postfix)

변수를 먼저 사용한 후 증가/감소합니다.

1
2
3
4
5
let num = 1;
let newNum = num++;  // 1. newNum에 num(1) 할당 → 2. num 증가

console.log(num);     // 2 (증가됨)
console.log(newNum);  // 1 (할당 시점의 값)

단계별 실행 과정:

1
2
3
4
// let newNum = num++; 를 풀어쓰면:
let num = 1;
let newNum = num;  // 1단계: 현재 값 할당
num++;             // 2단계: 증가

전위 증감 연산자 (Prefix)

변수를 먼저 증가/감소한 후 사용합니다.

1
2
3
4
5
let num = 1;
let newNum = ++num;  // 1. num 증가 → 2. newNum에 num(2) 할당

console.log(num);     // 2 (증가됨)
console.log(newNum);  // 2 (증가된 값)

단계별 실행 과정:

1
2
3
4
// let newNum = ++num; 를 풀어쓰면:
let num = 1;
num++;             // 1단계: 먼저 증가
let newNum = num;  // 2단계: 증가된 값 할당

전위 vs 후위 비교

1
2
3
4
5
6
7
8
9
10
11
// 후위 증감 (Postfix)
let a = 5;
let b = a++;
console.log(a);  // 6
console.log(b);  // 5

// 전위 증감 (Prefix)
let x = 5;
let y = ++x;
console.log(x);  // 6
console.log(y);  // 6

실전 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 카운터 구현
let count = 0;
console.log(count++);  // 0 (출력 후 증가)
console.log(count);    // 1

// 배열 순회
let arr = [10, 20, 30];
let i = 0;
console.log(arr[i++]);  // 10 (인덱스 0 출력 후 i는 1)
console.log(arr[i++]);  // 20 (인덱스 1 출력 후 i는 2)
console.log(arr[i++]);  // 30 (인덱스 2 출력 후 i는 3)

// 반복문에서 활용
for (let j = 0; j < 5; j++) {
  console.log(j);  // 0, 1, 2, 3, 4
}

할당 연산자

변수에 값을 할당하면서 연산을 수행하는 복합 할당 연산자입니다.

복합 할당 연산자

연산자예시동일 표현
+=x += 5x = x + 5
-=x -= 3x = x - 3
*=x *= 2x = x * 2
/=x /= 4x = x / 4
%=x %= 3x = x % 3
**=x **= 2x = x ** 2

사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let score = 100;

score += 50;   // score = score + 50
console.log(score);  // 150

score -= 30;   // score = score - 30
console.log(score);  // 120

score *= 2;    // score = score * 2
console.log(score);  // 240

score /= 8;    // score = score / 8
console.log(score);  // 30

score %= 7;    // score = score % 7
console.log(score);  // 2

문자열 연결

1
2
3
4
5
6
7
8
let message = "Hello";
message += " ";       // "Hello "
message += "World";   // "Hello World"
console.log(message); // "Hello World"

let name = "Alice";
name += "!";
console.log(name);    // "Alice!"

연산자 우선순위

JavaScript는 수학과 동일하게 연산자 우선순위를 따릅니다.

우선순위 표

우선순위연산자설명
1()괄호
2**거듭제곱
3++, --증감
4*, /, %곱셈, 나눗셈, 나머지
5+, -덧셈, 뺄셈
6=, +=, -=, …할당

계산 순서 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 수학 계산: 1 + 2 * 2 = ?
console.log(1 + 2 * 2);  // 5 (곱셈이 먼저)

// 괄호 사용
console.log((1 + 2) * 2);  // 6 (괄호 안이 먼저)

// 복잡한 계산
let result = 10 + 5 * 2 - 3;
// 1. 5 * 2 = 10
// 2. 10 + 10 = 20
// 3. 20 - 3 = 17
console.log(result);  // 17

// 거듭제곱 포함
console.log(2 + 3 ** 2);    // 11 (3² = 9 먼저)
console.log((2 + 3) ** 2);  // 25 (5² = 25)

괄호로 명확하게

1
2
3
4
5
// ❌ 헷갈리는 코드
let x = 5 + 3 * 2 - 1;

// ✅ 명확한 코드
let y = 5 + (3 * 2) - 1;  // 의도를 명확히 표현

Math 객체

JavaScript는 복잡한 수학 계산을 위한 Math 객체를 제공합니다.

상수

1
2
3
console.log(Math.PI);     // 3.141592653589793 (π)
console.log(Math.E);      // 2.718281828459045 (자연로그 밑)
console.log(Math.SQRT2);  // 1.4142135623730951 (√2)

반올림 메서드

1
2
3
4
5
6
7
8
9
10
11
let num = 4.7;

console.log(Math.round(num));  // 5 (반올림)
console.log(Math.floor(num));  // 4 (내림)
console.log(Math.ceil(num));   // 5 (올림)
console.log(Math.trunc(num));  // 4 (정수 부분만)

// 음수에서의 차이
let negative = -4.7;
console.log(Math.floor(negative));  // -5
console.log(Math.trunc(negative));  // -4

최대/최소값

1
2
3
4
5
6
7
console.log(Math.max(5, 10, 3, 8));   // 10
console.log(Math.min(5, 10, 3, 8));   // 3

// 배열에서 최대/최소
let numbers = [5, 10, 3, 8];
console.log(Math.max(...numbers));    // 10
console.log(Math.min(...numbers));    // 3

절대값과 부호

1
2
3
4
5
6
console.log(Math.abs(-5));    // 5 (절대값)
console.log(Math.abs(5));     // 5

console.log(Math.sign(-10));  // -1 (음수)
console.log(Math.sign(0));    // 0
console.log(Math.sign(10));   // 1 (양수)

거듭제곱과 제곱근

1
2
3
console.log(Math.pow(2, 3));   // 8 (2³)
console.log(Math.sqrt(16));    // 4 (√16)
console.log(Math.cbrt(27));    // 3 (∛27, 세제곱근)

난수 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
// 0 이상 1 미만의 난수
console.log(Math.random());  // 예: 0.4563421

// 1부터 10 사이의 정수 난수
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(1, 10));

// 배열에서 무작위 요소 선택
let colors = ['red', 'green', 'blue'];
let randomColor = colors[Math.floor(Math.random() * colors.length)];
console.log(randomColor);

삼각함수

1
2
3
4
5
6
7
8
9
10
11
// 라디안 단위
console.log(Math.sin(Math.PI / 2));  // 1 (sin 90°)
console.log(Math.cos(0));            // 1 (cos 0°)
console.log(Math.tan(Math.PI / 4));  // 1 (tan 45°)

// 도(degree)를 라디안으로 변환
function toRadians(degrees) {
  return degrees * (Math.PI / 180);
}

console.log(Math.sin(toRadians(90)));  // 1

실전 예제

1. 총점과 평균 계산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function calculateGrade(scores) {
  const total = scores.reduce((sum, score) => sum + score, 0);
  const average = total / scores.length;

  return {
    total: total,
    average: Math.round(average * 10) / 10,  // 소수점 첫째 자리
    grade: average >= 90 ? 'A' :
           average >= 80 ? 'B' :
           average >= 70 ? 'C' :
           average >= 60 ? 'D' : 'F'
  };
}

const scores = [85, 92, 78, 95, 88];
console.log(calculateGrade(scores));
// { total: 438, average: 87.6, grade: 'B' }

2. 할인가 계산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function calculateDiscount(price, discountRate) {
  const discountAmount = price * (discountRate / 100);
  const finalPrice = price - discountAmount;

  return {
    originalPrice: price,
    discount: discountRate + '%',
    discountAmount: Math.round(discountAmount),
    finalPrice: Math.round(finalPrice)
  };
}

console.log(calculateDiscount(50000, 20));
// { originalPrice: 50000, discount: '20%',
//   discountAmount: 10000, finalPrice: 40000 }

3. 거리 계산

1
2
3
4
5
6
7
8
function calculateDistance(x1, y1, x2, y2) {
  const dx = x2 - x1;
  const dy = y2 - y1;
  return Math.sqrt(dx ** 2 + dy ** 2);
}

console.log(calculateDistance(0, 0, 3, 4));  // 5
console.log(calculateDistance(1, 1, 4, 5));  // 5

4. 원의 넓이와 둘레

1
2
3
4
5
6
7
8
9
function calculateCircle(radius) {
  return {
    area: Math.round(Math.PI * radius ** 2 * 100) / 100,
    circumference: Math.round(2 * Math.PI * radius * 100) / 100
  };
}

console.log(calculateCircle(5));
// { area: 78.54, circumference: 31.42 }

5. 카운트다운 타이머

1
2
3
4
5
6
7
8
9
10
let countdown = 10;

const timer = setInterval(() => {
  console.log(countdown--);

  if (countdown < 0) {
    clearInterval(timer);
    console.log("발사!");
  }
}, 1000);

부동 소수점 주의사항

JavaScript는 부동 소수점 연산에서 정밀도 문제가 발생할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ❌ 예상치 못한 결과
console.log(0.1 + 0.2);  // 0.30000000000000004

// ✅ 해결 방법 1: 정수로 변환 후 계산
console.log((0.1 * 10 + 0.2 * 10) / 10);  // 0.3

// ✅ 해결 방법 2: toFixed() 사용
console.log((0.1 + 0.2).toFixed(2));  // "0.30" (문자열)
console.log(parseFloat((0.1 + 0.2).toFixed(2)));  // 0.3 (숫자)

// ✅ 해결 방법 3: Number.EPSILON 사용
function areEqual(a, b) {
  return Math.abs(a - b) < Number.EPSILON;
}

console.log(areEqual(0.1 + 0.2, 0.3));  // true

모범 사례

1. 명확한 변수명 사용

1
2
3
4
5
6
7
// ❌ 나쁜 예
let x = 10000;
let y = x * 0.2;

// ✅ 좋은 예
let price = 10000;
let tax = price * 0.2;

2. 매직 넘버 피하기

1
2
3
4
5
6
// ❌ 나쁜 예
let total = price * 0.9;

// ✅ 좋은 예
const DISCOUNT_RATE = 0.9;
let total = price * DISCOUNT_RATE;

3. 안전한 나눗셈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ❌ 나쁜 예
let result = a / b;  // b가 0이면?

// ✅ 좋은 예
let result = b !== 0 ? a / b : 0;

// 또는
function safeDivide(a, b) {
  if (b === 0) {
    console.error('0으로 나눌 수 없습니다.');
    return null;
  }
  return a / b;
}

4. 적절한 반올림

1
2
3
4
5
6
7
// 금액 계산 시 소수점 둘째 자리까지
function roundMoney(amount) {
  return Math.round(amount * 100) / 100;
}

console.log(roundMoney(12.345));  // 12.35
console.log(roundMoney(12.344));  // 12.34

마치며

JavaScript의 수학 표현식과 연산자를 이해하면 다양한 계산 로직을 구현할 수 있습니다:

  1. 산술 연산자: +, -, *, /, %, **
  2. 증감 연산자: 전위(++x)와 후위(x++)의 차이 이해
  3. 할당 연산자: +=, -=, *=, /= 등으로 코드 간결화
  4. 연산자 우선순위: 수학 규칙과 동일, 괄호로 명확하게
  5. Math 객체: 복잡한 계산을 위한 다양한 메서드 활용

부동 소수점 정밀도 문제를 인식하고, 적절한 반올림과 안전한 연산을 통해 정확한 계산 로직을 구현하세요.

참고 자료

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.