Frontend

JavaScript BigInt vs Number: 성능 차이와 형변환 주의사항 완벽 정리

Comparison between JavaScript Number and BigInt range and memory usage

자바스크립트에서 숫자를 다룰 때, 우리는 보통 아무 고민 없이 number 타입을 사용합니다. 하지만 금융 데이터를 다루거나 아주 큰 ID 값을 처리하다 보면 숫자가 뭉개지는 현상을 목격하게 됩니다. 이를 해결하기 위해 등장한 것이 바로 BigInt입니다.

오늘은 BigInt가 무엇인지, 그리고 일반 Number와 비교했을 때 어떤 성능적 특성과 주의사항이 있는지 풀스택 개발자의 시선으로 정리해 보겠습니다.

목차

  1. BigInt란 무엇인가? (도입 배경)
  2. BigInt vs Number: 주요 차이점
  3. 성능 비교: 언제 BigInt를 써야 할까?
  4. 형변환 및 연산 시 주의사항 (트러블슈팅)
  5. 자주 묻는 질문(FAQ)

BigInt란 무엇인가? (도입 배경)

자바스크립트의 number 타입은 64비트 부동 소수점(IEEE 754) 형식을 사용합니다. 이 형식에서 안전하게 표현할 수 있는 최대 정수는 $2^53 - 1$ (약 9,000조)입니다. 이를 Number.MAX_SAFE_INTEGER라고 부르죠.

이 범위를 넘어가면 숫자의 정밀도가 깨지기 시작합니다.

const max = Number.MAX_SAFE_INTEGER;
console.log(max + 1); // 9007199254740991
console.log(max + 2); // 9007199254740992 (여기까진 우연히 맞을 수 있음)
console.log(max + 3); // 9007199254740992 (오차 발생! 값이 같게 나옴)

BigInt는 이러한 제한 없이 **임의 정밀도(Arbitrary Precision)**로 정수를 표현할 수 있는 새로운 숫자 타입입니다. 숫자 뒤에 n을 붙이거나 BigInt() 함수를 호출하여 생성합니다.


BigInt vs Number: 주요 차이점

  • 소수점 미지원: BigInt는 오직 정수만 다룹니다. 소수점 연산을 시도하면 소수점 이하를 버립니다.
  • 독립된 타입: typeof 10n'bigint'이며, typeof 10'number'입니다. 둘은 엄격히 다릅니다.
  • 혼합 연산 불가: 10n + 10처럼 두 타입을 섞어서 연산하면 TypeError가 발생합니다.

성능 비교: 언제 BigInt를 써야 할까?

BigInt는 강력하지만 공짜는 아닙니다. 일반 Number와 비교했을 때 성능 차이가 존재합니다.

  1. 메모리 사용량: number는 고정된 8바이트(64비트)를 사용하지만, BigInt는 숫자의 크기에 따라 가변적으로 메모리를 할당합니다. 숫자가 커질수록 메모리 점유율도 늘어납니다.
  2. 연산 속도: CPU 수준에서 최적화된 부동 소수점 연산에 비해, BigInt 연산은 소프트웨어 알고리즘을 거치기 때문에 상대적으로 느립니다.

🚀 성능 팁: 단순히 Number.MAX_SAFE_INTEGER 내의 숫자를 다룰 때는 무조건 number를 사용하세요. BigInt는 오직 정밀도가 필수적인 거대 정수를 다룰 때만 사용하는 “최후의 보단”입니다.


형변환 및 연산 시 주의사항 (트러블슈팅)

실무에서 BigInt를 쓸 때 가장 많이 마주치는 3가지 함정입니다.

1. 나눗셈의 소수점 버림

BigInt 나눗셈은 결과를 정수로 반환합니다.

console.log(5n / 2n); // 2n (2.5가 아님!)

2. JSON 직렬화 불가

JSON.stringify()는 BigInt를 처리할 수 없어 에러를 던집니다.

const data = { id: 123n };
// JSON.stringify(data); // TypeError: Do not know how to serialize a BigInt

해결책: toJSON 메서드를 구현하거나 문자열로 변환하여 전송해야 합니다.

3. 비교 연산

느슨한 비교(==)는 가능하지만, 엄격한 비교(===)는 타입을 따지므로 false가 됩니다.

console.log(0n == 0);  // true
console.log(0n === 0); // false

자주 묻는 질문(FAQ)

Q. BigInt와 Number를 같이 계산해야 하면 어떻게 하죠? 명시적으로 타입을 변환해야 합니다. BigInt(numberValue) 혹은 Number(bigIntValue)를 사용하세요. 단, BigInt를 Number로 바꿀 때는 데이터 손실이 발생할 수 있음을 인지해야 합니다.

Q. Math 객체의 함수(Math.max 등)를 쓸 수 있나요? 아니요. Math 메서드는 Number 타입을 기대하므로 BigInt와 함께 사용할 수 없습니다. BigInt 전용 비교 로직을 직접 작성해야 합니다.

Q. 브라우저 지원 범위는 어떤가요? Chrome 67+, Firefox 68+, Safari 14+ 등 현대적인 브라우저는 모두 지원하지만, IE는 지원하지 않습니다.

더 자세한 정보는 V8 엔진의 BigInt 소개 블로그에서 확인하실 수 있습니다.

이 글이 마음에 드셨나요?

로딩 중...

관련 글

댓글

댓글을 불러오는 중...