문자열 타입의 연산자를 일반 연산자로 바꾸어 계산하기

박상록(Sangrok Park)·2020년 10월 8일
0

아래와 같은 함수가 있고,

function microCalculator(n1, n2, operator) {


}

만약에 숫자 n1, n2을 입력받은 문자열로 된 연산자 operator로 계산한 결과값을 리턴해야 한다면.

이를 테면,

let result = microCalculator(6, 3, '-');
console.log(result); // ==> 3

이 되게 해야 한다면.

나의 첫번째 답은 이랬다.

function microCalculator(n1, n2, operator) {
  if(operator === '+') {
    return num1 + num2;
  } else if(operator === '-') {
    return num1 - num2;
  } else if(operator === '*') {
    return num1 * num2;
  } else if(operator === '/') {
    return num1 / num2;
  }
}

문자열로 들어오는 연산자를 일반 연산자로 바꾸어 계산하는 식 자체를 리턴 한 것이다.
추후에 이걸 좀더 짧게, 조금 유연한 코드로 바꿀 수 없을까? 생각해봤고.

이 방법을 써봤다.

function microCalculator(n1, n2, operator) {
  return eval(`${n1} ${operator} ${n2}`);
}

문자열로 된 연산자를 일반 연산자로 바꾸려는 여러가지 시도 끝에
eval()이라는, 문자열로 된 수식을 계산해 주는 함수를 이용해보기로 했다.

짠,

결과는 성공.

그러나, eval()함수자체의 속도느림, 안전성, 보안문제, 직접 호출했을 때 Scope관련해서 코드가 길어졌을 때 혼란을 줄수 있는 여지가 포함되있다는 것을 발견했다. 그래서 사용을 지양하고, 직접적인 코드들을 사용하는 것이 성능면, 안정성, 보안이슈 관련해서도 더 좋은 선택이라는 글을 봤다(출처 MDN - eval(): https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval)

위와 같은 짧은 함수에서는 사용하기가 용이할 것 같고, 어쩌면 프로젝트에서도 간간히 쓰일 수 있는 순간이 있을 것 같다는 생각이 든다. 어쨌든 판단하는 것은 프로그래머이기 때문에, 그 판단하는 것 자체도 프로그래머로서 갖춰야 할 덕목이 아닌가 하는 생각이 든다.

지금과 같이 라이브러리가 많이 발달한 상황에서, 어쩌면 남이 만들어놓은 코드를 써야 하는데, 이게 과연 제품 성능에 어떤 영향을 미칠 것인지, 보안, 안정성 측면에서도 어떤 영향을 미칠 것인지 알고 써야 할텐데, 그런 의미에서 코드를 더 다각도에서 볼 수 있으면 좋겠다는 생각을 했다. 그러면 나중에 프로그래밍을 작성할 때도 좀 더 좋은 코드가 되지 않을까?

어쨌든 위의 코드는 조금 더 짧게 작성하긴 했지만, eval()이 정확히 어떻게 영향을 미치는지, 어디까지 영향을 미치는지 알아보고 써야겠다.

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글