지식
JavaScript
숫자 구분자 (Numeric Separator)
ES2021 숫자 구분자(_)를 사용해 큰 숫자 리터럴의 가독성을 높이는 방법과 허용 규칙, 주의사항을 정리합니다.
지난 글에서 논리 할당 연산자를 살펴봤습니다. 이번에는 같은 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)
읽어주셔서 감사합니다. 😊