parseInt() & toString()을 활용해 특정 진수의 값으로 변환하기

zwundzwzig·2022년 12월 7일
0

[javascript]

목록 보기
13/13
post-thumbnail

기존에 알고 있던 두 자바스크립트 메소드에 보다 본질적으로 접근해보자.

기존에 내가 parseInt 메소드에 대해 갖고 있던 지식은 그저 특정 숫자형 데이터에서 몫만 가져오고, 이는 주로 알고리즘 문제를 풀 때만 다뤘다.

잠깐, 그 전에 물결 연산자 (Tilte)에 대해 알고 넘어가자~

하지만, 이후 연속 물결 연산자(~~) 이건 내가 지은 이름이다.를 알게 된 이후, 주로 숫자형과 숫자형을 나눌 때는 아래와 같이 코드를 쳤다.

~~(NUMBER / NUMBER) // 몫만 확보 가능

참고로, 물결이 하나만 있는 연산자는 Tilt라고 하며, 이는 C 언어에서 파생된 문법으로 비트로 부정하는 연산자이고, ~n === -(n+1)의 값을 도출할 수 있고, 그 과정에서 소숫점은 벼려진다.

이를 활용해 참, 거짓을 처리할 수 있고, 문자열이나 배열에 아래와 같이 사용되어 특정 값의 유무를 알아낼 수 있다.

// 이터러블 객체를 대상으로, 몇 번째 특정 값이 존재하는지 계산해주는 함수인 indexOf()를 활용하자!

var education = [ '위코드', '스타터스', '유데미' ];
var favorite = '코드'; 
 
if (~education.indexOf(favorite)) {   // 인수 값이 있다면 
    console.log("합격 목걸이"); // 이 코드를 실행하라. 
} else console.log("우리와 못 가게 되었습니다.");

이러한 원리로 물결을 두 번 사용하면,

~~n === ~(-(n+1)) === -(-(n+1)+1) === n + 1 - 1;

결과적으로 소숫점은 사라지고 원래 몫만 남는, 그런 원리이다!

다시 parseInt 메소드로 돌아오자면,

Mozilla에선 이렇게 정의한다.

문자열 인자를 파싱해 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다.

그래서 문자형 인자를 첫 번째 매개변수로 받고, 설령 문자열이 아니더라도 문자열로 강제 변환하여 문자열로 파싱해 소수점을 없앤다.

여기서 몰랐던 건 parseInt 메소드는 인자를 원래 두 개를 받는다는 것이다!

모질라에선 두 번째 인자를 radix로 표현하며 다음과 같이 정의하고 있다.

첫 번째 인자의 진수를 나타내는 2부터 36까지의 정수입니다. Number 자료형이 아닌 경우 Number로 변환합니다. 대신 진수값이 2부터 36을 벗어날 경우, NaN을 반환한다.

두 번째 인자의 역할은 첫 번째 인자를 숫자형으로 파싱한 값을 자신이 할당받은 숫자로 된 진수로 읽은 뒤, 10진수의 정수나 NaN으로 반환하는 것이다.

만약 radix가 10을 초과하는 경우 영문 알파벳으로 대체하는데, 예를 들어 16진수에서는 A부터 F까지를 사용한다. 그리고, 첫 번째 인자에서 숫자가 아닌 문자가 있는 경우 해당 문자 이전까지만 파싱하며 문제의 문자 이후는 모두 무시한다.

그러면서, 주의하세요. 기본 값이 10이 아닙니다!라고 강조했다.

그에 대한 예시로, 6.022e23(6.022 × 10^23)처럼 e 문자를 사용해 숫자형을 나타내는데, 매우 크거나 작은 숫자의 소수점 이하 값을 자르기 위해 사용하면 예기치 못한 결과가 발생한다고 한다. 그래서 Math.floor()과 완전히 같은 맥락의 메소드로 착각하면 안된다고 주의했다.

정리하자면, parseInt는 문자열 리터럴로 감싸진 숫자값을 특정 진수값으로 읽어 10진수 정수로 반환하는 전역 메소드이지만(물론 Number 객체에 상속 받는 동명의 메소드가 있다.), 너무 작거나 큰 숫자에 단순히 몫만 얻기 위해 사용하면 안된다고 자바스크립트는 설명하고있다.

이제는 toString() 메소드를 알아보자

우선적으로 알아둬야 할 건, 원래 toString이라는 메소드는 Object 객체를 포함해 여러 프로토타입에 상속되지만, 여기서 다룰 메소드는 Number 객체에 상속받는 메소드이다! Object 객체를 상속 받는 동명의 메소드를 오버라이딩하는 것이다.

Mozilla에 의하면, 이 메소드 역시 2와 36사이에 radix를 인자로 받는다.

이 메소드가 하는 역할은 parseInt의 그것과 거의 정반대이다.

이 메소드는 숫자형 데이터에 프로퍼티로 존재하며 매개변수 radix가 받은 인자값에 해당 하는 진수로 부모 객체의 구현 값을 변형시켜 준다.

profile
개발이란?

1개의 댓글

comment-user-thumbnail
2022년 12월 7일

메소드와 함수의 차이점이 뭐에요?

답글 달기