[JavaScript] 계산기 기능 구현

daun·2022년 5월 8일
0
const calculator = document.querySelector(".calculator");
const buttons = calculator.querySelector(".calculator__buttons");
const firstOperend = document.querySelector(".calculator__operend--left");
const operator = document.querySelector(".calculator__operator");
const secondOperend = document.querySelector(".calculator__operend--right");
const calculatedResult = document.querySelector(".calculator__result");

function calculate(n1, operator, n2) {
  let result = 0;
  let num1 = Number(n1);
  let num2 = Number(n2);

  if (operator === "+") {
    result = num1 + num2;
  } else if (operator === "-") {
    result = num1 - num2;
  } else if (operator === "*") {
    result = num1 * num2;
  } else if (operator === "/") {
    result = num1 / num2;
  }

  return String((calculatedResult.textContent = result));
}

buttons.addEventListener("click", function (event) {
  const target = event.target;
  //이따 콘솔로 각각 찍어보자,숫자 0번 버튼,
  // console.log("target은", target);
  const action = target.classList[0];
  // console.log("action은", action);
  const buttonContent = target.textContent;
  // console.log("버튼콘텐츠는", buttonContent);
  // ! 위 코드(Line 19 - 21)는 수정하지 마세요.
  // 아래함수는 클릭하는 버튼의 종류에 따라 각기 다른 함수를 작동시킨다.

  if (target.matches("button")) {
    if (action === "number") {
      if (firstOperend.textContent === "0") {
        firstOperend.textContent = buttonContent;
      } else {
        secondOperend.textContent = buttonContent;
      }
      // console.log("숫자 " + buttonContent + " 버튼");
    }

    if (action === "operator") {
      operator.textContent = buttonContent;
    }

    if (action === "decimal") {
      //console.log("소수점 버튼");
    }

    if (action === "clear") {
      console.log("초기화 버튼");
      //첫번째 자리 리셋
      firstOperend.textContent = 0;
      //연산자 리셋
      operator.textContent = "+";
      //세번째 자리 리셋
      secondOperend.textContent = 0;
      //결과창 리셋
      calculatedResult.textContent = 0;
      //유저플로우 결과장 리셋
      display.textContent = 0;
    }

    if (action === "calculate") {
      console.log("계산 버튼");
      // = 버튼이 눌러지면 칼큐레이트 함수가 작동되고, 그 안에 전달되는 요소는 첫번째, 연산자, 두번째 자리수이다.
      calculate(
        firstOperend.textContent,
        operator.textContent,
        secondOperend.textContent
      );
    }
  }
});

// ! Advanced Challenge test와 Nightmare test를 위해서는 아래 주석을 해제하세요.

const display = document.querySelector(".calculator__display--for-advanced");
let firstNum; //계산기에서 보여줄 첫번째 숫자
let operatorForAdvanced; // 이전에 입력한 연산자 기호를 저장
let previousKey; // 이전에 누른 버튼이 숫자/연산자 인지 저장
let previousNum;

buttons.addEventListener("click", function (event) {
  const target = event.target;
  const action = target.classList[0];
  const buttonContent = target.textContent;
  // ! 위 코드는 수정하지 마세요.

  // ! 여기서부터 Advanced Challenge & Nightmare 과제룰 풀어주세요.
  if (target.matches("button")) {
    if (action === "number") {
      if (display.textContent === "0" && operatorForAdvanced === "") {
        display.textContent = buttonContent;
        firstNum = display.textContent;
      } else if (display.textContent !== "0" && operatorForAdvanced === "") {
        display.textContent = display.textContent + buttonContent;
        firstNum = display.textContent;
      } else if (display.textContent !== "0" && operatorForAdvanced !== "") {
        if (previousKey === operatorForAdvanced) {
          // 연산자 + 넘버 버튼을 누른 경우,
          // 디스플레이 창은 방금 누른 넘버 버튼으로 바꾸고
          display.textContent = buttonContent;
          // 프리비어스 키에 => 방금 누른 넘버 버튼 값으로 바꾼다.
          previousKey = display.textContent;
          // 프리비어스 넘버에 => 방금 누른 넘버 버튼 값 넣는다.
          previousNum = display.textContent;

          console.log("연산자+숫자btn=> 프리비어스 key :", previousKey);
          console.log("연산자+숫자btn=> 프리비어스 Num : ", previousNum);
        } else if (previousKey !== operatorForAdvanced) {
          //두번째 숫자를 누를때, 값을 이어서 받는다.
          display.textContent = display.textContent + buttonContent;
          //프리비어스 넘버도 결과값으로 갱신한다.
          previousNum = display.textContent;
        }
      }
    }
    if (action === "operator") {
      // 방금 누른 버튼이 오퍼레이터라면,
      operatorForAdvanced = buttonContent;
      previousKey = operatorForAdvanced;
      console.log("연산자btn => 프리비어스 key : ", previousKey);
      console.log("연산자btn => 오퍼레이터 key :", operatorForAdvanced);
    }
    if (action === "decimal") {
    }
    if (action === "clear") {
      display.textContent = "0";
      firstNum = "";
      previousNum = "";
      operatorForAdvanced = "";
      previousKey = "";
    }
    if (action === "calculate") {
      if (firstNum !== "" && operatorForAdvanced === "") {
        display.textContent = firstNum;
      } else if (firstNum !== "" && previousNum === "") {
        display.textContent = calculate(
          display.textContent,
          operatorForAdvanced,
          display.textContent
        );
      } else if (previousKey === display.textContent) {
        display.textContent = calculate(
          firstNum,
          operatorForAdvanced,
          previousNum
        );
      } else if (previousKey !== display.textContent && previousNum === "") {
        display.textContent = firstNum;
      }
    }
  }
});

사전에 넘겨준
operatorForAdvanced
previousNum
previousKey 에 대해서 이해가 안되서
일요일 오전 내내 돌려보고
콘솔에 찍어보고 별짓을 다한 결과
ㅠㅠ 이해가 간다.
옆에 주석처리로 텍스트 해놨으니
내일 다시 봐야겠어
이제 장보러 간다 으아!!

profile
Hello world!

0개의 댓글