코딩이야기𖦹/오답노트

📝 [250321~0325/오답노트] 자바스크립트 4일 걸린 계산기 만들며 겪은 오답노트

Dev디자인 2025. 3. 27. 16:47

조별과제로 만든 계산기...! 다행히 코드는 각자 짰지만 서로 상부상조하며 짰다.

다행히 구성단계가 있어 코드짜는 거에는 어려움이 없었지만, 요구사항들이 있어서 머리가 아팠다..

4일걸려 만든 내 계산기 기록을 적어보겠다..!

💡 목표

HTML, CSS, JavaScript를 활용해
기본적인 사칙연산이 가능한 계산기를 만들기.

✅ 전체 구성 요약

  • 숫자 버튼: .number
  • 연산자 버튼: .operator
  • 기능 버튼(C, ±, %): .function
  • 디스플레이: .num_text

버튼은 querySelectorAll로 가져와 forEach()를 이용해 반복 처리했고,
상태 관리는 firstOperand, operator, newNumber라는 3개의 변수로 만듬.

🧩 1. 상태 저장 변수 헷갈림

❌ 오답

let firstOperand;

✅ 정답과 개념

let firstOperand = null;
let operator = null;
let newNumber = false;
  • firstOperand: 연산을 위해 첫 번째 숫자 저장
  • operator: 누른 연산자 기호 저장
  • newNumber: 연산자 누른 다음 숫자 입력할 때 덮어쓸지 이어붙일지 판단
  • 사실 오타다.......

🧩 2. 숫자 입력 흐름 오류

❌ 문제 상황

  • 연산자 누른 뒤 숫자를 누르면 숫자가 이어붙음
    예: 5 + 2 누르고 싶었는데 52 됨

✅ 원인

  • newNumber 상태관리를 안 해줬음
if (newNumber) {
  numberDisplay.textContent = clickedValue;
  newNumber = false;
} else {
  if (numberDisplay.textContent === "0") {
    numberDisplay.textContent = clickedValue;
  } else {
    numberDisplay.textContent += clickedValue;
  }
}

👉 newNumber가 true면 새로 입력 false면 기존 숫자에 이어붙이기

🧩 3. 계산이 안 되는 문제

❌ 문제

  • = 버튼을 눌렀는데 계산이 안 됨

✅ 원인

  • 연산자, 숫자 저장 안 돼 있음
  • 계산 함수 없음

✅ 해결 코드 흐름

if (clickedOperator === "=") {
  if (operator && firstOperand !== null) {
    const secondOperand = parseFloat(numberDisplay.textContent);
    let result = calculate(firstOperand, operator, secondOperand);
    numberDisplay.textContent = result;
    firstOperand = result;
    operator = null;
    newNumber = true;
  }
  return;
}

🧩 4. 계산 로직 하드코딩

❌ 오답

if (operator === "+") {
  numberDisplay.textContent = firstOperand + secondOperand;
}
  • 계산 로직이 중복되고 복잡해짐

✅ 정답: calculate() 함수로 분리

function calculate(firstOperand, operator, secondOperand) {
    if (operator === "+") {
        return firstOperand + secondOperand;
    } else if (operator === "-") {
        return firstOperand - secondOperand;
    } else if (operator === "*") {
        return firstOperand * secondOperand;
    } else if (operator === "/") {
        return firstOperand / secondOperand;
    }
    return secondOperand;
}
  • 계산은 조건문으로 분리
  • return으로 결과를 보냄

✅ 배우고 느낀 점

  • 계산기 만들기는 단순한 숫자 연산이 아니라,
    입력 흐름 + 상태 관리 + 조건 처리 + 함수 분리까지 연습되는 구조적인 과제였다.
  • 특히 변수 하나(newNumber)가 얼마나 흐름 제어에 중요한지 알게 되었음.
  • 함수로 분리하면서 코드의 재사용성과 가독성이 좋아졌음을 체감했다.