원시 유형의 숫자 데이터를 생성해 사용할 수 있도록 지원해 주는 래퍼(wrapper) 객체이다.
여타 언어와 마찬가지로 ECMAScript에서 숫자는 원시형 데이터에 속한다. 즉 객체가 아니다. 그래서 원시형인 숫자 데이터를 런타임에 감싸 마치 객체처럼 동작하게 해주는 객체가 Number
이다. 그리고 이러한 역할을 하는 객체군을 래퍼 객체(wrapper objects)라고 부른다.
Number
객체는 래퍼 객체이면서 Number()
생성자 함수를 지원한다. 이 생성자 함수를 통해서 직접 숫자 데이터를 생성할 수도 있다. 사실 일반적(권장 사항)으로 숫자 데이터는 "문자 표현 그대로"를 의미하는 리터럴(iteral)로 생성한다. 즉 다음과 같이 변수에 할당하는 것만으로 숫자 데이터가 생성이 된다.
var num = 100;
그러나 최종적으로 값을 사용하는 데는 문제가 없지만 각각의 방식으로 생성된 숫자 데이터는 근본적인 차이가 있다. 더 자세한 내용은 Number
객체의 생성자(constructor)를 참고하기 바란다.
Number
객체에서 사용 가능한 정수의 범위는 64
비트 형식의 IEEE-754 표준에 따라 -9007199254740991
부터 9007199254740991
까지이다. 이 범위를 벗어난 정수는 연산 결과에 문제가 발생할 수 있다. 이러한 이유로 ECMAScript에서는 Number
객체의 Number.MIN_SAFE_INTEGER
와 Number.MAX_SAFE_INTEGER
를 지원하고 있다. 소수의 경우는 64
비트 형식의 IEEE-754 표준에 따라 배정밀도 부동 소수를 사용한다. 그래서 사용 가능한 범위는 5e-32
에서 1.7976931348623157e+308
까지이다.
배정밀도(double precision)와 단정밀도(single precision) 그리고 지수부와 가수부
배정밀도와 단정밀도는 비트의 사용 방식에 따라 나뉘어진 개념이라 할 수 있다. 다음 내용을 보면 알겠지만 단정밀도의 두 배 정도를 의미하는 배정밀도라는 이름을 사용한다.
배정밀도 단정밀도
- 64비트(8바이트) 기반
- 부호 1비트 사용
- 지수부 11비트 사용
- 가수부 52비트 사용
- 표현 범위는
2-1022
~21023
- 32비트(4바이트) 기반
- 부호 1비트 사용
- 지수부 8비트 사용
- 가수부는 23비트 사용
- 표현 범위는
2-126
~2127
부동 소수에서 지수부는 지수(exponent)를 표현하는 비트 그룹을 의미한다. 가수(mantissa)부는 실질적인 유효 숫자를 나타내는 비트 그룹을 의미한다.
사실상 ECMAScript가 정수의 범위를 포함하여 정상적인 처리를 보장하는 숫자의 범위라고 할 수 있다. 이 값은 Number
객체의 Number.MIN_VALUE
와 Number.MAX_VALUE
로 확인할 수 있다. 이 범위를 벗어난 숫자는 무한대(Infinity
)로 본다. 하지만 실제로는 그렇지가 않다. 다음과 같은 값을 넘어서야 비로소 무한대로 바뀐다.
Number.MAX_VALUE + 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
사실상 이 정도 크기의 숫자를 다루는 일이 거의 없을 것이라 생각하지만 논리적인 관점에서는 다소 이해가 어려운 부분이다.
안전한 정수는 어떨까? Number.MAX_SAFE_INTEGER
값으로 크롬 웹브라우저의 개발자 도구에서 다음의 코드를 테스트 해본다.
/* 최대 안전한 정수를 확인 */
Number.MAX_SAFE_INTEGER
//<- 9007199254740991
/* 서로 비교 */
Number.MAX_SAFE_INTEGER == Number.MAX_SAFE_INTEGER
//<- true
/* 최대 안전한 정수에 각각 1과 2를 더한 결과 */
Number.MAX_SAFE_INTEGER + 1
//<- 9007199254740992
Number.MAX_SAFE_INTEGER + 2
//<- 9007199254740992
Number.MAX_SAFE_INTEGER + 1 == Number.MAX_SAFE_INTEGER + 2
//<- true
/* 최대 안전한 정수에 각각 1과 2를 뺀 결과 */
Number.MAX_SAFE_INTEGER - 1 == Number.MAX_SAFE_INTEGER - 2
//<- false
/* 최대 안전한 정수에 모두 1을 뺀 결과 */
Number.MAX_SAFE_INTEGER - 1 == Number.MAX_SAFE_INTEGER - 1
//<- true
역시 MAX_SAFE_INTEGER
범위 밖의 숫자는 표현은 가능하되 정상적인 연산이 이루어지지 않음을 알 수 있다. 이 부분은 충분히 이해가 된다. 그럼에도 안전한 정수 밖의 숫자는 다룰 수 없는 걸까? 안타깝게도 ECMAScript에서 Number
객체는 그렇다고 봐야 한다. 하지만 실망은 이르다. 안전한 정수 범위 밖의 숫자를 다룰 일이 얼마나 많이 있을지 모르겠지만 그 마저도 안전하게 처리할 수 있도록 새로운 BigInt
객체가 등장했다. BigInt
객체에 대한 내용은 해당 섹션을 참고하기 바란다.
숫자 데이터를 생성하는 생성자이다. 새로운 숫자 데이터 생성은 리터럴(literal)과 Number
객체의 생성자 함수인 Number()
를 사용하는 방식을 함께 지원한다.
숫자 데이터를 생성하는 생성자 함수이다.
지정된 숫자를 지수 표기법으로 표기한 문자열을 반환한다.
숫자를 고정 소수점 표기법으로 표기해 반환한다.
해당 숫자를 사용 언어에 따른 표현을 포함한 문자열로 반환한다.
해당 숫자를 지정된 정밀도를 나타내는 문자열을 반환한다.
Number
객체를 나타내는 문자열을 반환한다.
Number
래퍼 객체가 감싼 원시타입 값을 반환한다.
정적(static) 멤버를 의미하며 인스턴스(instance)에 상속되어 사용할 수 없고 오로지 하위를 포함하여 객체(object) 또는 인터페이스(interface) 자신에서 해당 멤버에 접근이 가능하다.
Number
형으로 표현될 수 있는 1과 1보다 큰 값 중에서 가장 작은 값의 차를 가진다.
Number
객체에서 처리 가능한 안전한 최대 정수값을 나타낸다.
ECMAScript에서 처리 가능한 최대 숫자 값을 나타낸다.
Number
객체에서 처리 가능한 안전한 최소 정수값을 나타낸다.
ECMAScript에서 처리 가능한 양수의 최소 숫자 값을 나타낸다.
Not-A-Number(숫자가 아님)를 나타낸다.
음수의 무한대를 나타낸다.
양수의 무한대를 나타낸다.
지정된 값이 유한수(finite number)인지 판별한다.
주어진 값이 정수인지를 판별한다.
주어진 값이 NaN
인지를 판별한다.
지정된 값이 안전한 정수인지를 판별한다.
지정된 값을 분석해서 부동 소수점 실수로 반환한다.
지정된 문자열과 진수를 분석하여 정수를 반환한다.