본문 바로가기

프로그래밍 언어/자바스크립트

JavaScript BigInt, 정수 한계를 넘어선 대형 숫자 처리

JavaScript BigInt, 정수 한계를 넘어선 대형 숫자 처리

JavaScript에서 정수(Integer) 타입의 최대 크기를 넘어서 계산해야 할 때 BigInt가 필요합니다. 기존의 Number 타입은 **253-1**까지만 정확한 정수 연산이 가능합니다. 하지만 금융, 암호학, 과학 계산 등에서는 더 큰 정수를 다뤄야 합니다. 이 문서에서는 **BigInt의 개념과 활용법을 상세히 알아봅니다.**

 

 

목차

  1. BigInt란 무엇인가?
  2. BigInt 생성 방법
  3. BigInt 연산
  4. BigInt 비교와 형 변환
  5. BigInt의 실제 활용 사례
  6. BigInt의 한계점
  7. BigInt 사용 시 유의할 점

 

1. BigInt란 무엇인가?

BigInt는 **매우 큰 정수를 저장하고 연산할 수 있는 데이터 타입**입니다. 2018년 ES11(ES2020)에서 도입되었으며, 기존 Number 타입과의 가장 큰 차이점은 **정확도(precision)** 입니다.

 

 

 

2. BigInt 생성 방법

BigInt는 두 가지 방식으로 생성할 수 있습니다.

  • n을 숫자 뒤에 붙이는 방법
  • BigInt() 함수를 사용하는 방법
// 숫자 뒤에 n을 붙여 생성
let bigNumber1 = 1234567890123456789012345678901234567890n;

// BigInt() 함수를 사용하여 생성
let bigNumber2 = BigInt("1234567890123456789012345678901234567890");
    

 

 

 

3. BigInt 연산

BigInt는 **기본적인 산술 연산**을 지원합니다.

연산 예제 결과
덧셈 100n + 50n 150n
뺄셈 100n - 50n 50n
곱셈 100n * 2n 200n
나눗셈 10n / 3n 3n (소수점 이하 버림)

 

 

 

4. BigInt 비교와 형 변환

BigInt와 Number는 서로 **비교할 수 있지만, 직접 연산은 불가능**합니다.

console.log(100n > 50); // true
console.log(100n == 100); // true (자동 변환)
console.log(100n === 100); // false (타입이 다름)

// BigInt ↔ Number 변환
console.log(Number(100n)); // 100
console.log(BigInt(100)); // 100n
    

 

 

 

 

5. BigInt의 실제 활용 사례

BigInt는 기존 Number 타입으로 처리할 수 없는 초대형 정수를 다뤄야 할 때 사용됩니다. 특히, 금융, 암호학, 과학적 계산 등에서 필수적입니다.

① 암호학 (Cryptography)

암호학에서는 **큰 소수(prime number)**를 사용하여 보안 키를 생성합니다. 기존 Number 타입으로는 **253-1** 이상의 정수를 정확히 표현할 수 없지만, BigInt를 사용하면 초대형 수를 손실 없이 연산할 수 있습니다.

// 2048비트 이상의 대형 소수를 BigInt로 표현
const prime1 = 2857532135438213498213489231438213948231n;
const prime2 = 9783429813749281734982138943217894321891n;
const secureKey = prime1 * prime2; // 암호화 키 생성
console.log(secureKey);

② 금융 데이터 처리 (Financial Data Processing)

금융 분야에서는 **소수점 오차 없이 큰 금액을 계산**해야 합니다. JavaScript의 Number는 부동소수점 방식이므로 **큰 정수를 다룰 때 정확성이 떨어질 수 있습니다**.

// 은행 계좌 잔고 계산 (정확한 연산 보장)
const balance = 1000000000000000000000n;
const deposit = 250000000000000000000n;
const newBalance = balance + deposit;
console.log(newBalance); // 1250000000000000000000n

③ 정밀한 수학 계산 (Scientific Computation)

**천문학, 물리학, AI 연구**에서는 **매우 큰 숫자를 다뤄야 하는 경우**가 많습니다. 예를 들어, **광년 단위 거리 계산**이나 **뉴턴의 중력 방정식**을 처리할 때 BigInt가 유용합니다.

// 태양과 안드로메다 은하 사이 거리 (광년)
const distanceInLightYears = 24000000000000000000000000n;
console.log(`태양과 안드로메다 은하 사이 거리: ${distanceInLightYears} 광년`);

 

 

 

6. BigInt의 한계점

BigInt는 강력한 기능을 제공하지만, 몇 가지 **제약 사항**이 있습니다. 이를 이해하고 적절한 상황에서 사용하는 것이 중요합니다.

제한 사항 설명
소수점 연산 불가 BigInt는 정수만 다룰 수 있으며, 소수점이 포함된 연산을 지원하지 않습니다.
JSON 변환 불가능 JSON 직렬화 시 BigInt를 직접 변환할 수 없습니다. toString()을 활용해야 합니다.
기존 Number와 연산 불가 BigInt와 Number를 혼합하여 직접 연산할 수 없습니다. 반드시 변환 후 연산해야 합니다.
일부 브라우저 미지원 최신 브라우저에서만 지원되며, 오래된 환경에서는 사용이 제한될 수 있습니다.

 

 

 

7. BigInt 사용 시 유의할 점

BigInt를 사용할 때 주의해야 할 몇 가지 핵심 사항을 정리했습니다.

① Number와 직접 연산 금지

BigInt와 Number는 서로 직접 연산할 수 없습니다. 필요할 경우, 명시적으로 변환해야 합니다.

const big = 100n;
const num = 50;

// console.log(big + num); // TypeError 발생

console.log(big + BigInt(num)); // 정상 동작
console.log(Number(big) + num); // 정상 동작

② JSON 변환 시 처리 필요

BigInt는 JSON 형식으로 직접 변환할 수 없으므로, 문자열로 변환해야 합니다.

const data = { value: 12345678901234567890n };

// JSON.stringify(data); // TypeError 발생

// 문자열 변환 후 직렬화
const safeData = { value: data.value.toString() };
console.log(JSON.stringify(safeData)); // {"value":"12345678901234567890"}

③ 특정 연산에서 부적절

BigInt는 **소수점 연산이 불가능**하므로, **부동소수점 계산이 필요한 경우에는 사용할 수 없습니다.** 예를 들어, 금융 애플리케이션에서 **소수점을 포함한 금액을 계산할 경우** BigInt는 적절하지 않습니다.

❌ 잘못된 예제: BigInt를 나누는 경우, 소수점 이하 값이 강제로 잘려나갑니다.

console.log(10n / 3n); // 결과: 3n (소수점 이하 버림)

소수점을 유지하려면, **Number 타입을 사용하거나 별도의 정밀도 연산 라이브러리**를 활용해야 합니다.