Experience/[Javascript] Calculator

[Javascript] Calculator ③Calculate

winCow 2021. 4. 27. 23:21

계산 기능을 만들면서 Display Process도 약간 수정했다.

 

1. Calculate

const inputs = document.querySelectorAll('.keyButtons');

let givenKeys = [];
function getValue () {
  if (isNaN(this.value)) {
    saveOrCalc(this.value);
  } else {
    givenKeys.push(this.value);
    givenKeys.splice(-8, givenKeys.length - 7);
  }
}

let numStorage = [];
function saveOrCalc(calculator) {
  numStorage.push(
    {
    value: parseFloat(givenKeys.join('')),
    calculator: calculator
    }
  );
  givenKeys = [];

  if (calculator == '=') {
    let result = numStorage[0]['value'];
    for ( index = 1; index < numStorage.length; index++ ) {
      if (numStorage[index - 1]['calculator'] == '+') {
        result = result + numStorage[index]['value'];
      } else if (numStorage[index - 1]['calculator'] == '-') {
        result = result - numStorage[index]['value'];
      } else if (numStorage[index - 1]['calculator'] == '×') {
        result = result * numStorage[index]['value'];
      } else if (numStorage[index - 1]['calculator'] == '÷') {
        result = result / numStorage[index]['value'];
      }
    }
    numStorage = [];
    givenKeys.push(result);
  }
}

inputs.forEach(input => input.addEventListener('click', getValue));

먼저, 지난 번에 만들었던 최대 7글자까지만을 표시하는 기능은, 7글자까지만을 저장하는 기능으로 바꾸었다. 계산을 수행하기 위해서는 값을 표시하는 것뿐만 아니라 저장해야 할 필요도 있다고 생각했기 때문이다.

모든 input에 대하여 클릭되면 getValue를 실행하도록 이벤트 리스너를 걸었다. getValue는 숫자가 아닌 경우, saveOrCalc 함수를 실행하고, 숫자인 경우에는 최근 누른 7글자를 배열에 저장한다.

saveOrCalc 함수는 numStorage라는 빈 배열에, 연산자가 눌러지기 전까지 저장된 숫자들의 배열을 실수 형태로 바꾼 값을 value로, 전달된 연산자를 calculator로 하는 객체의 형태로 값을 저장한다. 이후 다음 숫자를 저장하기 위하여 givenKeys를 비운다.

전달된 연산자가 '='인 경우에는 계산을 수행해야 한다. 첫 번째 입력된 숫자를 result에 할당하고, 이후 연산자를 구분하여 다음에 입력된 숫자와 계산하도록 작성하였다. 이 계산을 인덱스 변수가 numStorage에 저장된 갯수, 즉 length와 같아지는 지점에서 중지하도록 하고, 계산이 끝난 후 numStorage를 비웠다. 계산된 값인 result를 givenKeys에 저장했다.

 

 

2. Display

function displayProcess(e) {
  const process = document.querySelector('.process');
  process.textContent = givenKeys.join('');
}

inputs.forEach(input => input.addEventListener('click', displayProcess));

displayProcess는 givenkeys를 표시하도록 변경하였다.

 

 

3. 개선점

 - 숫자와 숫자가 아닌 값으로 나누어 if문을 작성했으나, NaN에서도 연산자와 연산자 외의 값이 있으므로 여기에 대해서는 추가적으로 생각해 보아야 한다. 현재는 사칙연산만이 구현된 상태다.

 - 첫 번째 계산 결과를 대상으로 다음 계산을 실행하려면 로직을 조금 변경해야 할 필요가 있다. 객체에 저장되는 값은 {숫자1, 연산자1}, {숫자2, 연산자2}, ...와 같은데, 첫 번째 계산 결과는 연산자를 동반하지 않기 때문이다.