카테고리 없음

Number()와 parseInt()는 무엇이 같고 다를까?

John' 2023. 11. 14. 18:00

인간은 망각의 동물이다. 특정한 행동이나 생각을 자주 하지 않으면 우리 뇌 속에서는 신경의 가지치기 현상이 일어난다고 한다. 우리가 어떤 생각, 기분, 행동을 수행하지 않으면 뇌는 그와 연관된 뉴런들을 발화시키지 않는데, 그 결과 그러한 생각, 기분, 행동이 점점 약해지다가 결국 시들어버리고 잊게 되는 것을 신경 가지치기라고 한다. 그렇기 때문에 우리는 초등학교 시절처럼 리코더를 연주할 수 없는거고, 곡면의 부피를 구하는 적분 공식이나 근의 공식등에 대해 더는 기억하지 못하는 것이다. 쉽건 어렵건 지금 나는 무조건 많이 생각하고 자꾸 써보고 사용해보는 것 밖에 방도가 없다 생각한다.

 

 

自初至終(자초지정)
숫자형으로의 형변환이 필요한 경우 나는 무의식적으로 줄 곧 Number() 메서드만 사용해 왔다. 공부를 하면서 parseInt()라는 메서드로도 숫자형으로 형변환할 수 있다는 걸 알게 되었고, "아니 같은 기능을 하는거면 뭐하러 두개씩이나 있는거지?" 라는 의구심으로 좀 더 자세히 알아보았다.

 

 

parseInt(String, [radix])

 

radix 파라미터는 사용하려는 숫자 시스템을 지정하는데 쓰이는데, 예를 들어 radix 파라미터 값이 16이면, 16진수로 String 파라미터의 구문을 분석한다.

두번째 radix 파라미터에는 2부터 36까지 입력할 수 있으며, 입력하지 않으면 일반적으로 10(10진수)으로 구문 분석을 하지만, Javascript는 다음과 같은 작업을 한다.

  1. String 파라미터의 문자열이 "0x"로 시작하는 경우 radix 파라미터는 16(16진수)이 된다.
  2. String 파라미터의 문자열이 "0"으로 시작하는 경우 radix 파라미터는 8(8진수)이 된다.
  3. String 파라미터의 문자열이 다른 값으로 시작되는 경우 radix 파라미터는 10(10진수)이 된다.

 

 

Number(object)

 

Number() 함수는 객체 인자 값을 숫자형으로 변환을 한다.

  1. 전달받은 객체 인자 값이 숫자형으로 변환할 수 없는 경우엔 NaN을 반환한다.

아래 예시를 통해 대략적으로 Number()와 parseInt()의 특징을 살펴 보자.

 

parseInt("나는 100원이나 있다!") // NaN 
parseInt("100원이나 있다고!") // 100 
parseInt("100", 2) // 4 
parseInt("100e1") // 100 
parseInt(true) // NaN 
parseInt("") // NaN 
parseInt("123.45") // 123 
Number("나는 100원이나 있다!") // NaN 
Number("100원이나 있다고!") // NaN 
Number("100e1") // 1000 
Number(true) // 1 
Number("") // 0 
Number("123.45") // 123.45

 

 

위 예시 중에 아래의 내용을 좀 더 살펴보면,

parseInt("123.45") // 123 
Number("123.45") // 123.45

 

위 내용을 보고 parseInt()는 소수부분은 버리고 정수부분만 반환해주는 특징이 있구나라고 생각했지만, 이건 parseInt()의 작동 방식을 모르고 말한 애먼 소리였다.

 

parseInt()는 변환할 수 있는 숫자형이 확인 되는 순간부터 숫자형으로 변환할 수 없는 값(Non-digit)이 나오기 전까지만 구문 분석하고 해당 값을 반환하기 때문에 숫자형 가운데 떡하니 있는 소숫점(.)이 확인되면 변환할 수 없는 값이라 판단하고 그 앞에 값까지만 반환하는 것 뿐이었다.

 

소수부분도 필요할 경우에는 parseFloat(string)를 사용하자.

 

parseFloat(String)
파라미터로 입력받은 문자열을 실수로 변환 한 값을 리턴한다.

parseInt()처럼 숫자형으로 변환할 수 없는 경우와 첫 글자가 숫자로 변환할 수 있는 값인 0 부터 9, 부호(+,-), 소수점(.), 지수가 아닌 경우에는 NaN을 리턴한다.

parseInt()와는 다르게 소수점(.)은 인정한다.

 

 

추가적으로 선행 0으로 시작되는 경우에는 8진수로 강제 변환이 되기 때문에 사용 시 조심해야 한다는 답변을 보았고 좀 더 확인해 보았다.

 


확인 결과, ECMAScript3 이전에 8진수로 강제적으로 실행되었던 것이 ECMAScipt5 이후부터 선행된 0이 무시되어 10진수로 파싱된다.(strict모드에서도 동일)

#ES3이하 버전 parseInt("080") // 120 (8진수로 변환) #ES5이상 버전 parseInt("080") // 80 (10진수로 변환)

 

 

정리
1. 숫자형으로 변환하려고 할때는 Number()를 통해서만 하자.
2. parseInt()를 사용할 경우, 반드시 radix 파라미터를 통해 진수를 명시적으로 지정하자.

 

참고


 

Number - JavaScript | MDN

Number 객체는 숫자 값으로 작업할 수 있게 해주는 래퍼(wrapper) 객체입니다. Number 객체는 Number() 생성자를 사용하여 만듭니다. 원시 숫자 자료형은 Number() 함수를 사용해 생성합니다.

developer.mozilla.org

 

parseInt() - JavaScript | MDN

parseInt() 함수는 문자열 인자를 구문분석하여 특정 진수(수의 진법 체계에 기준이 되는 값)의 정수를 반환합니다.

developer.mozilla.org