JavaScript BigInt vs Number: 성능 차이와 형변환 주의사항 완벽 정리
자바스크립트에서 숫자를 다룰 때, 우리는 보통 아무 고민 없이 number 타입을 사용합니다. 하지만 금융 데이터를 다루거나 아주 큰 ID 값을 처리하다 보면 숫자가 뭉개지는 현상을 목격하게 됩니다. 이를 해결하기 위해 등장한 것이 바로 BigInt입니다.
오늘은 BigInt가 무엇인지, 그리고 일반 Number와 비교했을 때 어떤 성능적 특성과 주의사항이 있는지 풀스택 개발자의 시선으로 정리해 보겠습니다.
목차
- BigInt란 무엇인가? (도입 배경)
- BigInt vs Number: 주요 차이점
- 성능 비교: 언제 BigInt를 써야 할까?
- 형변환 및 연산 시 주의사항 (트러블슈팅)
- 자주 묻는 질문(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와 비교했을 때 성능 차이가 존재합니다.
- 메모리 사용량:
number는 고정된 8바이트(64비트)를 사용하지만,BigInt는 숫자의 크기에 따라 가변적으로 메모리를 할당합니다. 숫자가 커질수록 메모리 점유율도 늘어납니다. - 연산 속도: 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 소개 블로그에서 확인하실 수 있습니다.
댓글을 불러오는 중...