숫자 구분자 (Numeric Separator)

ES2021 숫자 구분자(_)를 사용해 큰 숫자 리터럴의 가독성을 높이는 방법과 허용 규칙, 주의사항을 정리합니다.

· 4 min read · PALDYN Team

지난 글에서 논리 할당 연산자를 살펴봤습니다. 이번에는 같은 ES2021 스펙에 포함된 **숫자 구분자(Numeric Separator)**를 다룹니다. 기능 자체는 단순하지만, 대규모 수치를 다루는 코드에서 실수를 줄이는 데 의외로 큰 역할을 합니다.

숫자 구분자란?

숫자 리터럴 내부에 밑줄 _을 구분자로 삽입할 수 있는 문법입니다. 이 밑줄은 런타임에 완전히 무시되며, 값 자체에는 아무런 영향을 주지 않습니다.

const million = 1_000_000;
console.log(million); // 1000000
console.log(1_000_000 === 1000000); // true

변수 이름에 쓰는 _와는 다릅니다. 변수 이름의 _는 식별자 문자이지만, 숫자 리터럴 내부의 _는 순수 시각적 분리 역할입니다.

모든 숫자 리터럴 형식에서 사용 가능

숫자 구분자 가독성 비교

10진수뿐만 아니라 16진수, 8진수, 2진수, 소수, BigInt 모두에 사용할 수 있습니다.

// 10진수
const budget = 1_000_000_000;

// 16진수 (색상값, 주소 등)
const color = 0xFF_EC_D8;
const addr  = 0xDEAD_BEEF;

// 2진수 (비트 마스크)
const flags = 0b1101_0111;
const byte  = 0b0000_0001;

// 8진수
const perm = 0o755;       // 구분자 없어도 짧음

// BigInt
const bigNum = 9_007_199_254_740_991n;

// 소수
const pi = 3.141_592_653_589_793;

사용 규칙

숫자 구분자 사용 규칙

_를 어디에나 쓸 수 있는 건 아닙니다. 몇 가지 규칙이 있습니다.

// 허용: 숫자 사이 어디든
1_000_000
0xFF_00
3.14_159

// SyntaxError: 맨 앞/맨 뒤
_1000     // 식별자로 해석됨
1000_     // SyntaxError

// SyntaxError: 연속 사용
1__000    // SyntaxError

// SyntaxError: 소수점 앞뒤
3._14     // SyntaxError
3_.14     // SyntaxError

// SyntaxError: 접두어(0x, 0b, 0o) 직후
0x_FF     // SyntaxError

문자열 변환 시 제거됨

Number(), parseInt() 같은 변환 함수는 문자열을 입력으로 받습니다. _가 포함된 문자열은 올바르게 파싱되지 않습니다.

// 숫자 리터럴 → 그냥 사용
const n = 1_000;             // OK

// 문자열 → 함수 변환은 안 됨
Number('1_000');             // NaN
parseInt('1_000');           // 1  ← 1에서 파싱 멈춤

// JSON에도 사용 불가
JSON.parse('{"n": 1_000}'); // SyntaxError

사용자 입력값이나 외부 데이터를 파싱할 때는 _를 제거한 뒤 변환해야 합니다.

실전 활용

숫자 구분자가 특히 빛나는 곳은 다음과 같습니다.

// 재무/통계 상수
const GDP_KR = 1_721_000_000_000_000; // 조 단위

// 비트 마스크
const READ  = 0b0000_0100;
const WRITE = 0b0000_0010;
const EXEC  = 0b0000_0001;

// 초/밀리초 단위 타임아웃
const ONE_HOUR_MS = 3_600_000;

// 암호/해시 관련 상수
const PBKDF2_ITERATIONS = 100_000;

단 하나의 문자 _만으로도 열 자리 이상의 숫자를 즉시 파악할 수 있게 됩니다.


지난 글: 논리 할당 연산자 (&&=, ||=, ??=)

다음 글: 최상위 await (Top-level await)


읽어주셔서 감사합니다. 😊