SEB FE / Section1 / Unit7 / 간단한 웹앱 만들기
📌 Today I Learned
- 두 숫자의 사칙연산을 할 수 있는 계산기를 구현합니다.
이미 틀이 잡혀진 계산기에 사칙연산자를 입히고 결괏값 도출해내기를 했다.
// TODO : n1과 n2를 operator에 따라 계산하는 함수를 만드세요.
// ex) 입력값이 n1 : '1', operator : '+', n2 : '2' 인 경우, 3이 리턴됩니다.
function calculate(n1, operator, n2) {
let result = 0;
if (operator === '+') {
result = n1 + n2
}
if (operator === '-') {
result = n1 - n2
}
if (operator === '*') {
result = n1 * n2
}
if (operator === '/') {
result = n1 / n2
}
return String(result);
}
아주 간단하고 쉬운 조건문인데도 며칠 만에 다시 해 보려고 하니 헷갈려서 코플릿 초반 문제를 복습하게 만들었다. 역시 복습이 최고인 듯하다. 원리를 이해하면 금방 적용할 수 있다.
buttons.addEventListener('click', function (event) {
// 버튼을 눌렀을 때 작동하는 함수입니다.
const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.
const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.
const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.
// ! 위 코드(Line 19 - 21)는 수정하지 마세요.
if (target.matches('button')) {
if (action === 'number') {
if (firstOperend.textContent !== '0') {
secondOperend.textContent = buttonContent
} else {
firstOperend.textContent = buttonContent
}
console.log('숫자 ' + buttonContent + ' 버튼');
}
if (action === 'operator') {
operator.textContent = buttonContent;
console.log('연산자 ' + buttonContent + ' 버튼');
}
if (action === 'decimal') {
// console.log('소수점 버튼');
operator.textContent = buttonContent;
}
if (action === 'clear') {
firstOperend.textContent = '0';
secondOperend.textContent = '0';
operator.textContent = '+';
calculatedResult = '0';
console.log('초기화 버튼');
}
if (action === 'calculate') {
let n1 = Number(firstOperend.textContent)
let n2 = Number(secondOperend.textContent)
let operator_n1n2 = operator.textContent
calculatedResult.textContent = calculate(n1, operator_n1n2, n2)
console.log('계산 버튼');
}
}
});
}
어드밴스 단계가 추가 되었다.
const calculator = document.querySelector('.calculator'); // calculator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const buttons = calculator.querySelector('.calculator__buttons'); // calculator__keys 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const firstOperend = document.querySelector('.calculator__operend--left'); // calculator__operend--left 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const operator = document.querySelector('.calculator__operator'); // calculator__operator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const secondOperend = document.querySelector('.calculator__operend--right'); // calculator__operend--right 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const calculatedResult = document.querySelector('.calculator__result'); // calculator__result 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
//'7', '-', '5'
function calculate(n1, operator, n2) {
let result = 0;
// TODO : n1과 n2를 operator에 따라 계산하는 함수를 만드세요.
// ex) 입력값이 n1 : '1', operator : '+', n2 : '2' 인 경우, 3이 리턴됩니다.
if(operator === "+") {
result = Number(n1) + Number(n2);
} else if (operator === '-') {
result = Number(n1) - Number(n2); // 7 - 5 // 2
} else if (operator === '*') {
result = Number(n1) * Number(n2);
} else if (operator === '/') {
result = Number(n1) / Number(n2);
}
return String(result); // '2'
}
buttons.addEventListener('click', function (event) {
// 버튼을 눌렀을 때 작동하는 함수입니다.
const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.
const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.
const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.
// ! 위 코드(Line 19 - 21)는 수정하지 마세요.
if (target.matches('button')) {
// TODO : 계산기가 작동할 수 있도록 아래 코드를 수정하세요. 작성되어 있는 조건문과 console.log를 활용하시면 쉽게 문제를 풀 수 있습니다.
// 클릭된 HTML 엘리먼트가 button이면
if (action === 'number') {
// 그리고 버튼의 클레스가 number이면
// 아래 코드가 작동됩니다.
if(firstOperend.textContent === '0') {
firstOperend.textContent = buttonContent;
} else {
secondOperend.textContent = buttonContent;
}
console.log('숫자 ' + buttonContent + ' 버튼');
}
if (action === 'operator') {
operator.textContent = buttonContent;
console.log('연산자 ' + buttonContent + ' 버튼');
}
if (action === 'decimal') {
// console.log('소수점 버튼');
}
if (action === 'clear') {
console.log('초기화 버튼');
firstOperend.textContent = '0';
operator.textContent = '+';
secondOperend.textContent = '0';
calculatedResult.textContent = '0';
}
if (action === 'calculate') {
calculatedResult.textContent = calculate(firstOperend.textContent, operator.textContent, secondOperend.textContent)
console.log('계산 버튼');
}
}
});
// ! Advanced Challenge test와 Nightmare test를 위해서는 아래 주석을 해제하세요.
const display = document.querySelector('.calculator__display--for-advanced'); // calculator__display 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
let firstNum, operatorForAdvanced, previousKey, previousNum;
buttons.addEventListener('click', function (event) {
// 버튼을 눌렀을 때 작동하는 함수입니다.
const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.
const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.
const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.
// ! 위 코드는 수정하지 마세요.
// ! 여기서부터 Advanced Challenge & Nightmare 과제룰 풀어주세요.
if (target.matches('button')) {
if (action === 'number') {
// 방금 누른 키가 연산자면, 새로운 숫자 입력해줘.
if(display.textContent === '0' || previousKey === 'operator') {
display.textContent = buttonContent;
} else {
display.textContent = display.textContent + buttonContent;
}
previousKey = 'number'; // => 방금 전에 누른 키
}
if (action === 'operator') {
// 화면에 있는 첫번째 숫자가 저장되고,
// 방금 누른 operator가 저장되고,
// 방금 누른 키가 어떤 종류인지 저장해야 함.
firstNum = display.textContent;
operatorForAdvanced = buttonContent;
previousKey = 'operator'; // => 방금 전에 누른 키
}
if (action === 'decimal') {
}
if (action === 'clear') {
firstNum = undefined;
operatorForAdvanced = undefined;
previousNum = undefined;
display.textContent = '0';
previousKey = 'clear';
}
if (action === 'calculate') {
// enter다음 또 엔터?
// previousKey -> calculate
previousNum = display.textContent;
display.textContent = calculate(firstNum, operatorForAdvanced, previousNum)
previousKey = 'calculate';
}
}
});
나잇메어 래퍼런스
const calculator = document.querySelector('.calculator'); // calculator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const buttons = calculator.querySelector('.calculator__buttons'); // calculator__keys 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const firstOperend = document.querySelector('.calculator__operend--left'); // calculator__operend--left 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const operator = document.querySelector('.calculator__operator'); // calculator__operator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const secondOperend = document.querySelector('.calculator__operend--right'); // calculator__operend--right 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
const calculatedResult = document.querySelector('.calculator__result'); // calculator__result 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
function calculate(n1, operator, n2) {
let result = 0;
if (operator === '+') {
result = Number(n1) + Number(n2);
}
if (operator === '-') {
result = Number(n1) - Number(n2);
}
if (operator === '*') {
result = Number(n1) * Number(n2);
}
if (operator === '/') {
result = Number(n1) / Number(n2);
}
// TODO : n1과 n2를 operator에 따라 계산하는 함수를 만드세요.
// ex) 입력값이 n1 : '1', operator : '+', n2 : '2' 인 경우, 3이 리턴됩니다.
return String(result);
}
buttons.addEventListener('click', function (event) {
// 버튼을 눌렀을 때 작동하는 함수입니다.
const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.
const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.
const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.
// ! 위 코드(Line 19 - 21)는 수정하지 마세요.
if (target.matches('button')) {
// TODO : 계산기가 작동할 수 있도록 아래 코드를 수정하세요. 작성되어 있는 조건문과 console.log를 활용하시면 쉽게 문제를 풀 수 있습니다.
// 클릭된 HTML 엘리먼트가 button이면
if (action === 'number') {
// 그리고 버튼의 클레스가 number이면
// 아래 코드가 작동됩니다.
if (firstOperend.textContent !== '0') {
secondOperend.textContent = buttonContent;
} else {
firstOperend.textContent = buttonContent;
}
// console.log('숫자 ' + buttonContent + ' 버튼');
}
if (action === 'operator') {
operator.textContent = buttonContent;
// console.log('연산자 ' + buttonContent + ' 버튼');
}
if (action === 'decimal') {
// console.log('소수점 버튼');
}
if (action === 'clear') {
firstOperend.textContent = '0';
operator.textContent = '+';
secondOperend.textContent = '0';
calculatedResult.textContent = '0';
// console.log('초기화 버튼');
}
if (action === 'calculate') {
calculatedResult.textContent = calculate(firstOperend.textContent, operator.textContent, secondOperend.textContent);
// console.log('계산 버튼');
}
}
});
// ! Advanced Challenges, Nightmare를 위한 코드입니다. 도전하신다면 주석을 해제하세요.
const display = document.querySelector('.calculator__display--for-advanced'); // calculator__display 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.
let firstNum, operatorForAdvanced, previousKey, previousNum;
buttons.addEventListener('click', function (event) {
// 버튼을 눌렀을 때 작동하는 함수입니다.
const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.
const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.
const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.
const buttonContainerArray = buttons.children;
// ! 위 코드는 수정하지 마세요.
if (target.matches('button')) {
for (let i = 0; i < buttonContainerArray.length; i++) {
const childrenArray = buttonContainerArray[i].children;
for (let j = 0; j < childrenArray.length; j++) {
childrenArray[j].classList.remove('isPressed');
}
}
if (action === 'number') {
if (display.textContent === '0' || previousKey === 'operator' || previousKey === 'calculate') {
display.textContent = buttonContent;
} else {
display.textContent = display.textContent + buttonContent;
}
previousKey = 'number';
}
if (action === 'operator') {
target.classList.add('isPressed');
if (firstNum && operatorForAdvanced && previousKey !== 'operator' && previousKey !== 'calculate') {
display.textContent = calculate(firstNum, operatorForAdvanced, display.textContent);
}
firstNum = display.textContent;
operatorForAdvanced = buttonContent;
previousKey = 'operator';
}
if (action === 'decimal') {
if (!display.textContent.includes('.') && previousKey !== 'operator') {
display.textContent = display.textContent + '.';
} else if (previousKey === 'operator') {
display.textContent = '0.';
}
previousKey = 'decimal';
}
if (action === 'clear') {
firstNum = undefined;
operatorForAdvanced = undefined;
previousNum = undefined;
previousKey = 'clear';
display.textContent = '0';
}
if (action === 'calculate') {
if (firstNum) {
if (previousKey === 'calculate') {
display.textContent = calculate(display.textContent, operatorForAdvanced, previousNum);
} else {
previousNum = display.textContent;
display.textContent = calculate(firstNum, operatorForAdvanced, display.textContent);
}
}
previousKey = 'calculate';
}
}
});
계산기 결과값을 도출해내는 =
clalulate
버튼에서 왜 Number()
를 작성해야만 결괏값이 도출되는 걸까 고민이 생겼다. 넘버를 제외하고 테스트를 실행해 본 결과, 스트링값으로 입력되는 것인지 4 + 6
을 46
으로 도출해냈다. Number
를 잘 활용해야겠다.