NATIVE

settings_applicationsObject

NATIVE

Editing
  • account_tree
  • bug_report

ObjectNumber

원시 유형의 숫자 데이터를 생성해 사용할 수 있도록 지원해 주는 래퍼(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_VALUENumber.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 객체에 대한 내용은 해당 섹션을 참고하기 바란다.

하위 트리 탐색

  • Constructor

    숫자 데이터를 생성하는 생성자이다. 새로운 숫자 데이터 생성은 리터럴(literal)과 Number 객체의 생성자 함수인 Number()를 사용하는 방식을 함께 지원한다.

    • Number()

      숫자 데이터를 생성하는 생성자 함수이다.

  • [[Prototype]]

    • Methods

      • toExponential()

        지정된 숫자를 지수 표기법으로 표기한 문자열을 반환한다.

      • toFixed()

        숫자를 고정 소수점 표기법으로 표기해 반환한다.

      • toLocaleString()

        해당 숫자를 사용 언어에 따른 표현을 포함한 문자열로 반환한다.

      • toPrecision()

        해당 숫자를 지정된 정밀도를 나타내는 문자열을 반환한다.

      • toString()

        Number 객체를 나타내는 문자열을 반환한다.

      • valueOf()

        Number 래퍼 객체가 감싼 원시타입 값을 반환한다.

  • Static

    정적(static) 멤버를 의미하며 인스턴스(instance)에 상속되어 사용할 수 없고 오로지 하위를 포함하여 객체(object) 또는 인터페이스(interface) 자신에서 해당 멤버에 접근이 가능하다. 

    • Properties

      • EPSILON

        Number 형으로 표현될 수 있는 1과 1보다 큰 값 중에서 가장 작은 값의 차를 가진다.

      • MAX_SAFE_INTEGER

        Number 객체에서 처리 가능한 안전한 최대 정수값을 나타낸다.

      • MAX_VALUE

        ECMAScript에서 처리 가능한 최대 숫자 값을 나타낸다.

      • MIN_SAFE_INTEGER

        Number 객체에서 처리 가능한 안전한 최소 정수값을 나타낸다.

      • MIN_VALUE

        ECMAScript에서 처리 가능한 양수의 최소 숫자 값을 나타낸다.

      • NaN

        Not-A-Number(숫자가 아님)를 나타낸다.

      • NEGATIVE_INFINITY

        음수의 무한대를 나타낸다.

      • POSITIVE_INFINITY

        양수의 무한대를 나타낸다.

    • Methods

      • isFinite()

        지정된 값이 유한수(finite number)인지 판별한다.

      • isInteger()

        주어진 값이 정수인지를 판별한다.

      • isNaN()

        주어진 값이 NaN인지를 판별한다.

      • isSafeInteger()

        지정된 값이 안전한 정수인지를 판별한다.

      • parseFloat()

        지정된 값을 분석해서 부동 소수점 실수로 반환한다.

      • parseInt()

        지정된 문자열과 진수를 분석하여 정수를 반환한다.

버전 명세

ECMAScript 2024(15th Edition)
#sec-number-objects

지원 웹브라우저