ํ๋์ ํ์ผ์ ์ํ ๋ณํ ๋ณ์, ํจ์๋ค๊ณผ View ๋ถ๋ถ์ด ํผ์ฌ ํ๋ฉด, ์ ์ง ๋ณด์๊ฐ ์ด๋ ต๋ค.
๊ทธ๋์ ์ํ ๋ณํ ๋ณ์, ํจ์๋ค์ ๋ค๋ฅธ ํ์ผ๋ก ๋นผ์ฃผ๊ณ , ๊ทธ ํ์ผ return ๊ฐ์ ํ์์ View part ํ์ผ์๊ฒ ๊ฑด๋ค๋ค ์ฃผ๋ ์์ผ๋ก ํด์ผ์ง ๊ฐ๋ ์ฑ์ด ์ข๋ค.
์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋ Hook๋ค์ ๋ชจ์ ๋๋ง์ Hook file์ ๋ง๋ค ๊ฒ์ด๋ค.
**์ฃผ์์ **
Hook์ ๋ฌด์กฐ๊ฑด use๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ํด์ผํจ. Custom Hook (์ฐ๋ฆฌ๊ฐ ๋ง๋ค๋ ค๋ Hook) file ๋ ์์ธ ์์
์ด๋ฒ์ ๊ณ์ฐ๊ธฐ ๋ง๋๋๋ฐ ์ผ๋ Hook ์ด๋๊น useCalculator๋ผ๊ณ ์ฐ์.
์ด ์์ ๋ด์ฉ ๋ค ๋ฃ๊ณ return {} (๊ฐ์ฒด) ์์ ํ์ ๋ณด๋ธ๋ค. ()๋ ํ๋์ ๊ฐ ๋ฐ์ ๋ชป ๋ณด๋ด๊ธฐ ๋๋ฌธ์ {}๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
()๋ ์๋ฌด ์๋ฏธ ์๊ณ ๊ทธ๋ฅ ์ฌ๋ฌ ์ค์ ๊ฑธ์น ๊ธด ํ๋์ ๋ช ๋ น๋ฌธ์ ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ ๋ฟ์ด๋ค.
๊ฐ์ 2๊ฐ ์ด์ ๋ณด๋ผ ๋๋ {} ๋ก ๋ณด๋ด์ค๋ค!
import { useState } from "react";
export default () => {
const [input, setInput] =useState(0); // ์ฌ์ฉ์๊ฐ ์ฒซ ๋ฒ์งธ๋ก ์
๋ ฅํ ๊ฐ
const [currentOperator, setCurrentOperator] =useState(null); // ์ฌ์ฉ์๊ฐ ์ฒซ๋ฒ์งธ๋ก ์
๋ ฅํ ์ฐ์ฐ์
const [result, setResult] =useState(null); // ์ฌ์ฉ์๊ฐ ๋ ๋ฒ์งธ๋ก ์
๋ ฅํ ๊ฐ
const [tempInput, setTempInput] =useState(null); // ๋ค๋ก ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ ์ ๋ฃ๊ณ , =๋ง ๋๋ฅผ์ ์ต๊ทผ ์
๋ ฅํ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์๊ฒ ์์ ์ ์ฅ
const [tempOperator, setTempOperator] =useState(null); // ์ฌ์ฉ์๊ฐ =๋ง ๋๋ฅผ ์ ์ต๊ทผ ์
๋ ฅํ ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋ ์ ์๊ฒ ์์ ์ ์ฅ
const [isClickedOperator, setIsClickedOperator] = useState(false)
const [isClickedEqual, setIsClickedEqual] = useState(false)
const hasInput = !!input;
const onPressNum = (num) => {
if (currentOperator && isClickedOperator) {
setTempInput(num);
setResult(input);
setInput(num);
setIsClickedOperator(false);
} else{
const newInput = Number(`${input}${num}`);
setInput(newInput);
setTempInput(newInput);
}
}
const OnPressOperator = (operator) => {
if(operator !== "="){
setCurrentOperator(operator);
setTempOperator(operator);
setIsClickedOperator(true);
setIsClickedEqual(false);
}
else{
let finalResult = result;
let finalInput = isClickedEqual? tempInput : input;
let finalOperator = isClickedEqual? tempOperator : currentOperator;
switch (finalOperator){
case "+":
finalResult = result + finalInput;
break;
case "-":
finalResult = result - finalInput;
break;
case "*":
finalResult = result * finalInput;
break;
case "/":
finalResult = result / finalInput;
break;
default:
break;
}
setResult(finalResult);
setInput(finalResult);
setIsClickedEqual(true);
setCurrentOperator(null);
}
}
const onPressReset = () => {
if(hasInput){
setInput(0);
}else{
setInput(0);
setCurrentOperator(null);
setResult(null);
setTempInput(null);
setTempOperator(null);
}
}
return {
input,
currentOperator,
result,
tempInput,
tempOperator,
hasInput,
onPressNum,
OnPressOperator,
onPressReset
}
}
!๋ฐ์์ฌ ๋ ์ฃผ์์ !
return์ {}์ผ๋ก ํ์ผ๋๊น, ๋ฐ์ ์ธ ๋๋ {} ๋ก ํด์ผํ๋ค.
์ฐ๋ฆฌ๊ฐ ํญ์ useState ๋ฐ๋ก ๋ง๋ค ๋ [ ] (๋ฐฐ์ด)์ ์ด์ฉํ๋ ๊ฒ๊ณผ ๋ค๋ฆ์ ์ธ์ง ํ์.
์ํ ๋ณ์๋ก ์ฐ๋ ๋ด์ฉ๋ค์ด ์ ์ญ ๋ณ์๋ก ์ฐ๋ ์๊น์ด๋, ๋ฒํผ ํจ์์ ์๋ฌด ๊ด๋ จ์ด ์์ด์ ๊น๋ํ๊ฒ ์๋ถ์ด ๋์๋ค.
๋ง์ฝ ์ํ๋ณ์์์๋ ํด๋น ์ ์ญ ๋ณ์ ๋ด์ฉ๋ค์ ์ด๋ค๋ฉด, useCalculator์๋ ์ ์ญ๋ณ์๋ฅผ ๋ฃ๋๊ฐ, ์๋๋ฉด import ํด ์ค๋๊ฐ ใท๋ฑ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ ๊ฒ์ด๋ค.