[JS] 문자열을 숫자로 변환할 때 가장 좋은 방법은 무엇일까?

boyon99·2023년 9월 4일
0

algorithm

목록 보기
1/4
post-thumbnail

문자열을 숫자로 변환하는 방법

문자열을 숫자로 변환하는 방법에는 여러 가지 방법들이 있다. 우선 대표적인 방법들을 알아보자.

parseInt()

문자열을 정수로 변환한다. 두 번째 인수로 기수(진법)를 지정할 수 있다.

const str = "12345";
const num = parseInt(str, 10); // 10진수로 변환

Number()

문자열을 숫자로 변환한다. 정수나 부동 소수점 수로 변환할 수 있다.

const str1 = "42";
const str2 = "3.14";
const num1 = Number(str1); // 정수로 변환
const num2 = Number(str2); // 부동 소수점 수로 변환

단항 덧셈 연산자

단항 덧셈 연산자를 사용하여 문자열을 숫자로 변환하는 암묵적 타입 변환을 사용할 수 있다.

const str = "42";
const num = +str; // 숫자로 변환

속도 비교

그럼 이러한 방법들 중 속도면에서 가장 우수한 방법은 무엇일까? 테스트를 해보았다.

// 성능 측정용 함수
function measurePerformance(fn) {
  const startTime = performance.now();
  for (let i = 0; i < 1000000; i++) {
    fn("12345");
  }
  const endTime = performance.now();
  return endTime - startTime;
}

// parseInt 사용 성능 측정
const parseIntTime = measurePerformance((str) => {
  parseInt(str, 10);
});


// Number() 사용 성능 측정
const numberTime = measurePerformance((str) => {
  Number(str);
});

// 단항 덧셈 연산자 사용 성능 측정
const unaryPlusTime = measurePerformance((str) => {
  +str;
});


console.log(`parseInt 소요 시간: ${parseIntTime}ms`); // parseInt 소요 시간: 11.038416862487793ms
console.log(`Number() 소요 시간: ${numberTime}ms`); // Number() 소요 시간: 7.853625297546387ms
console.log(`단항 덧셈 연산자 소요 시간: ${unaryPlusTime}ms`); // 단항 덧셈 연산자 소요 시간: 6.693416595458984ms

각 방법별로 문자열을 숫자로 변환하는 작업을 100만 번 반복한 후 소요된 시간을 측정해보았다.

실행결과를 보면 실행 결과를 보면, 성능 측면에서는 단항 덧셈 연산자 -> Number() -> parseInt() 순으로 더 빠른 것으로 나타난다. 물론 이러한 결과는 실행 환경에 따라 다를 수 있고, 일반적으로 성능 차이가 크게 느껴지지는 않을 것이라고 생각된다.

다만 알고리즘 문제를 풀이할 때는 암묵적 타입 변환인 단항 덧셈 연산자 보다는 단항 덧셈 연산자과 속도 차이가 크게 나지 않으면서도 명시적 타입 변환인 Number()함수를 사용하는 것이 바람직해보인다.

Number()이 더 빠를까?

그렇다면 왜 parseInt()보다 Number()함수가 더 빠르게 처리될까? 100만 번이나 수행한 결과 값이기 때문에 실제의 경우 그리 큰 차이가 나지는 않겠지만 그래도 약 8초와 11초면 두 함수 간의 유의미한 차이가 있다고 생각될 수 밖에 없다.

1. 내부 처리 방식의 차이

먼저Number() 함수는 문자열을 숫자로 변환할 때, 정확하게 숫자로 변환하는 것이 목적이다. 즉, 문자열의 시작부터 끝까지 모든 문자를 분석하고, 부동 소수점 숫자 또는 정수로 변환한다.

parseInt() 함수는 문자열을 정수로 변환할 때 기수(진법)를 고려한다. 따라서 parseInt()는 문자열을 왼쪽부터 분석하며, 숫자 이외의 문자를 만나면 변환을 중단한다. 또한, 기수를 지정해야 하는 추가적인 작업이 필요하다.

2. 최적화

대부분의 JavaScript 엔진은 Number() 함수 호출을 최적화하는 경향이 있다. 이는 Number() 함수가 간단하고 일반적으로 사용되는 연산이기 때문이다. 엔진은 이러한 연산을 빠르게 수행하기 위해 특별한 최적화를 적용할 수 있다.

반면에 parseInt() 함수는 복잡한 파싱 과정과 기수 지정을 고려해야 하므로, 최적화하기에 상대적으로 어려운 경우가 있을 수 있다.

결론

항상 위와 같은 결과가 나오는 것은 아니다. 작업의 복잡성, 브라우저 엔진, 실행 환경에 따라 성능 차이가 변할 수 있다. 하지만 일반적으로 Number() 함수가 parseInt() 함수보다 간단하고 빠르게 동작하므로, 단순한 문자열에서 숫자로 변환할 때는 Number() 함수를 사용하는 것이 좋을 것 같다.

0개의 댓글