0. Test ํ๋ ๊ฐ๋ค์ด ๋์ ๋ณด์ด๋๋ก UI์ test ๊ฒฐ๊ณผ ์ฐฝ ๋ง๋ค๊ธฐ
test ๊ฒฐ๊ณผ์ฐฝ์ ๋ง๋ค์ด test ๋ด์ฉ์ ํญ์์ ์ผ๋ก ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
main ํจ์์๋ค๊ฐ ๋ง๋ค์ด์ค๋ค.
1. Button์์ ํจ์ ์ด์ฉํด ์ค๋ณต ์ฝ๋ ์ ๊ฑฐ
๋ฐฐ์ด์ Map ํจ์ ์ด์ฉ
ํ๋์ row์ ๋ค์ด๊ฐ๋ ์ซ์ ๊ฐ๋ค๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ - [7,8,9]
๋ฐฐ์ด์ ๋ด์ฅ ํจ์ map์ ์ด์ฉ
(num)์ ๋ฐฐ์ด์ ์์๊ฐ ์ฐจ๋ก๋๋ก ๋์ ๋๋ ์ธ์
text๋ String ๊ฐ์ ๋ฐ์์ผ ํ๋ฏ๋ก `${}`์ด์ฉํด์ number ๋ณ์์ธ num์ String์ผ๋ก ํ ๋ณํ
์ด๋ฐ ์์ผ๋ก 789, 456, 123์ ์ฝ๋๋ฅผ ์ค์ด์.
2. ์ซ์ ํด๋ฆญ ์ ๊ฒฐ๊ณผ์ฐฝ์ ์ฐํ๋๋ก
const onPressNum = (num) => {
setInput(num);
}
ํด๋น num ํด๋ฆญ์ ์ํ์ฐฝ์์ ๋ณด์ฌ์ฃผ๋ ์ํ๋ณ์ input์ด ๋ฐ๋๋๋ก ์ค์ .
3. ์ซ์๋ฅผ ์ฐ์ด์ด ํด๋ฆญํ ์ ๊ผฌ๋ฆฌ ๋ฌผ๊ณ ๊ฒฐ๊ณผ์ฐฝ์ ์ฐํ๋๋ก (1 , 2 ๋๋ฅด๋ฉด 12๊ฐ ๋๋๋ก)
**Bad Case 1: ๋๋ฅด๋ฉด ๊ฐ์ด ๋ํด์ ธ ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ
// onPressNum ๋ด๋ถ
const newInput = input + num;
setInput(newInput);
์ด๋ฌ๋ฉด ๋๋ฅผ ๋๋ง๋ค ํด๋น ์ซ์๊ฐ ์ฐ์ด์ด ์ฐํ์ง ์๊ณ ๋ฐ๋ก ๋ํด์ ธ์ ๋์๋ฒ๋ฆฐ๋ค.
์ฐ์ด์ด ์ ํ๋ ค๋ฉด Input๊ณผ num์ ํ๋์ String์ด๋ผ ์ธ์ํ ํ์๊ฐ ์๋ค.
**Bad Case 2: 0 ๋๋ฅด๊ณ 9 ๋๋ฅด๋ฉด 9๊ฐ ์๋๋ผ 09๊ฐ ์ฐํ๋ ๊ฒฝ์ฐ
// onPressNum ๋ด๋ถ
const newInput = `${input}${num}`;
setInput(newInput);
์ด๋ฌ๋ฉด ์์ ๋ฌธ์ ๋ ํด๊ฒฐ๋๊ณ ์ฐ์ด์ด ์ฐํ๊ธด ํ์ง๋ง, 0 9 ๋ฅผ ์ฐ์ผ๋ฉด 9๊ฐ ์๋๋ผ 09๊ฐ ๋์๋ฒ๋ฆฐ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด
**Good Case:
const onPressNum = (num) => {
const newInput = Number(`${input}${num}`);
setInput(newInput);
}
String์ผ๋ก ์ฐ์ด์ด์ง ๊ฐ์ ํ๋ฒ ๋ Number ๋ณ์๋ก ํ ๋ณํ ์์ผ์ฃผ๋ฉด ๋๋ค. 09๋ ์ซ์๋ ํ์ฉ์ด ์๋๋ฏ๋ก Number ํ ๋ณํ ์ ์์ 0์ด ๋น ์ง๋ค.
4. ์ฐ์ฐ์ ๋ถ๋ถ ํด๋ฆญ์ boarder ๊ฐ ๊ตต์ด์ง๋๋ก ๋ฐ๊พธ๊ธฐ
๋ฒํผ ๋ถ๋ถ์ isSelected ์์ฑ์ ๋ฐ์์ ์ผํญ ์ฐ์ฐ์ ์งํํ๋ฉด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ซ์ ๋ถ๋ถ ๋ฒํผ ํ๊ทธ์๋ ์ผ์ผํ isSelected ์์ฑ์ ๋ฌ๊ณ false ๊ฐ์ ์ค์ผ ํ๋? No!
๊ทธ๋ฅ isSelected๋ฅผ ํ๊ทธ์์ ์ ์จ์ฃผ๋ฉด ์ธ์๊ฐ ํจ์๋ก ๋์ด๊ฐ ๋, isSelected์ ๊ฐ์ undefined๋ก ๋์ด๊ฐ๋ค.
5. ์ฐ์ฐ์ ๋ถ๋ถ ํด๋ฆญ ํ ๋ค์ ์ซ์๋ฅผ ํด๋ฆญํ๋ฉด ๊ฒฐ๊ณผ์ฐฝ์ด ์ด๊ธฐํ ๋์ด ํด๋น ์ซ์๋ถํฐ ๋ค์ ์์ํ๋๋ก ๋ฐ๊พธ๊ธฐ
๋ฒํผ ๋๋ฅด๊ธฐ ํจ์ ๋ฐ๊พธ๊ธฐ
๋ง์ฝ์ currentOperator์ ๊ฐ์ด ๋ค์ด์๋ค๋ฉด, ์ง๊ธ๊น์ง์ input ๋ด์ฉ์ result๋ก ์ฎ๊ธฐ๊ณ , input์ ๊ฐ ์๋ก ๋ฐ๊ณ
currentOperator์ ๊ฐ์ด ์๋ค๋ฉด ์๋์ฒ๋ผ ๊ณ์ ์ซ์ ์ด์ด๋ถ์ด๊ธฐ
6. ์ฐ์ฐ์ ๋ก์ง ๋ง๋ค๊ธฐ (= ๋๋ ์ ๋ ๊ณ์ฐ์ด ๋๋๋ก, = ์๋๋ฉด currentOperator์ ํด๋น ๊ฐ์ด ๋ค์ด๊ฐ๋๋ก)
๋ง์ฝ operator๊ฐ =์ด ์๋๋ผ๋ฉด ์ฐ์ฐ์ ์ํ ๋ณ์์ ํ์ฌ ์ฐ์ฐ์๋ฅผ ์ง์ด๋ฃ๊ณ ,
๋ง์ฝ = ์ด๋ผ๋ฉด switch ๊ตฌ๋ฌธ์ผ๋ก ๊ณ์ฐ์ ์งํ!
** ์ฃผ์ **
๊ฐ Case ๋ง๋ค break ํด์ค์ผ ํ๋ ๊ฑฐ ๊น๋จน์ง ๋ง์. ํด๋น ๊ณ์ฐ๋ง ํ๊ณ Switch-Case๋ฌธ ๋น ์ ธ๋์ค๊ฒ, ์๋๋ฉด ๋ฐ์ผ๋ก ์ญ ๋ด๋ ค๊ฐ์ ์ ๋ถ ๊ณ์ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ
์ธํ ์ํ ๋ณ์ (ํ๋ฉด์ ๋์ค๋ ๋ณ์)์ ์ง์ด๋ฃ๊ณ , result์๋ ์ง์ด๋ฃ๋๋ค.
7. ์ด๊ธฐํ ํจ์ ๋ง๋ค๊ธฐ
์ ๋ถ ๋ฆฌ์ ์์ผ์ฃผ๋ฉด ๋๋ค.
** ์ก๋ค ์ง์ **
/*ํจ์ ํํ๋ก ๊ฒฐ๊ณผ ๋ถ๋ถ์ ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ์ ธ์ ์จ๋ ๋๊ณ ๊ทธ๋ฅ ๋ฐ๋ก ํจ์ ์จ๋ฒ๋ ค๋ ๋๋ค.*/
onPress={() => onPressReset()}
/*onPress = {OnPressReset} ๋์ ๊ฐ์ ๋ง*/
-> ๊ฐ์ฌ๋ ๋ง์์ ์๋ชป ์ดํดํจ.
๋ง์ง๋ง ์ด๊ธฐํ ํจ์๋ ์ธ์๋ฅผ ๋ฃ์ด ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์
๋ฌดํ ๋ฃจํ๊ฐ ๋ ์ผ์ด ์์ด์
{() => onPress()}๋
{onPress}๋ ๊ฐ์ ๊ฒ์ด์์
์ธ์๋ฅผ ๋ฃ์ด ํ๋ ๊ฒฝ์ฐ ํด๋ฆญ์์๋ง ํ์ฑํ ๋๋ผ๋ ์๋ฏธ์์
{() => onPress(num)}์ผ๋ก ์ ์ด์ค์ผ ํ๋ค.
{onPress(num)} ์ด๋ ๊ฒ ์ ์ผ๋ฉด ํด๋ฆญ์ ์ํด์ค๋ ๊ณ์ ํด๋ฆญํ ๊ฒ์ฒ๋ผ ๋์๊ฐ๋ ๊ฒ์ด๋ค!
8. ์ค์ค๋ก ํด๋ณด๊ธฐ
(1) ๋ฒํผ ์ฝ๋ ์ค๋ณต ์ ๊ฑฐ
--> ํ๋ฆฐ ์ :
๋ฐฐ์ด์ ์ด์ฉํ map ํจ์ ์ด์ฉ๋ ์ด๋ ํ ๊ธฐ๋ฅ์ ํตํด ๊ฐ์ ๋ด ๋ณด๋ด๋ ๊ฒ์ด๋๊น ๊ฐ์ ์ธ๋ ค๋ฉด ์ ์ฒด๋ฅผ {} ๋ก ๋ฌถ์ด์ผ ํ๋ค.
() => {}์ด๊ฑธ๋ก ๊ฒฐ๊ณผ ๋ด๋ณด์ผ๋ ค๋ฉด {return}์ ์จ์ผ ํ๋ค. () ์ด๊ฑธ๋ก ๋ฌถ์ผ๋ฉด ํด๋น ๊ฐ ์ ์ฒด๋ฅผ ํ์ค๋ก ์ฝ๊ณ retrun ์์ด ์จ๋ ๋๋ค.
์ต๋ช
ํจ์์์ () => ๋ช
๋ น์ด ํ ์ค ์ด๋ () => {return ๋ช
๋ น์ด}๋ ๊ฐ์ ๊ฒ์ ์ด์ฉํ ๊ฒ์ด๋ค.
(2) ์ซ์ ํด๋ฆญ์ ๊ฒฐ๊ณผ์ฐฝ์ ์ฐํ๋๋ก
--> ํ๋ฆฐ ์ :
Button ํจ์๊ฐ ๋์๊ฐ๋ ์๋ฆฌ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. ๋ชจ๋ ํจ์๋ ๋ฐํ ๊ฐ์ด ๊ณง ๊ฒฐ๊ณผ์ด๋ค. OnPress๋ ๋๋ฅด๋ฉด ๋ฐ์ํ๋ TouchableOpacity์ ์์ฑ์ผ๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
๋๋ Button์ด ๋ด๊ฐ ๋ง๋ ๋ถ๋ถ๊ณผ ๊ธฐ๋ณธ ์ฝ๋๊ฐ ํผ์ฌํ๊ณ ์๋ค๊ณ ์๊ฐํ์๊ณ , ๊ตฌํํ์ง ์์ ๋ถ๋ถ์ Button์ ๋ด์ฅ ์ฝ๋๊ฐ ํด๊ฒฐํด์ค๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ ์๋ชป๋ ์๊ฐ์ด๋ค.
Button์ด๋ ์ด๋ฆ์ ํจ์๋ฅผ ๋ง๋ค์์ผ๋ฉด ์ ๋ถ ์์ ์ด ๋ค ๊ตฌํํด์ผ ํ๋ค.
Too Many Re-Render ์ค๋ฅ๊ฐ ๋ฌ๋ค.
์ด๋ react๊ฐ state ๋ณํ ํจ์๋ฅผ ๊ณ์ ๋ฐ๋ณตํด์ ๋ฆฌ๋๋๋ง ํ ๋
๋ฌดํ ๋ฃจํ์ ๋น ์ ธ์ ์ผ์ด๋๋ ์ค๋ฅ์ด๋ค.
๋ฐ๊ณผ ๊ฐ์ด ์ ์์ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
onPress={onPressNum(num)}
์ด๋ ๊ฒ ์ ์ผ๋ฉด ํด๋ฆญํ์ง ์์๋, num๊ฐ์ ์ํ๋ณํ ํจ์์ ๋ฌดํํ ์ง์ด ๋ฃ๋ ๊ฒ์ด ๋๋ค.
ํด๋น ์ฝ๋์ ํด๊ฒฐ๋ฒ์
์ฌ์ฉ์๊ฐ ํด๋ฆญํ์ ๋๋ง ๋ฐ์ํ๋๋ก ๋ฐ๊ณผ ๊ฐ์ด ๋ฐ๊พธ๋ ๊ฒ์ด๋ค.
onPress={() => onPressNum(0)}
(3). ์ซ์ ์ฐ๋ฌ์ ํด๋ฆญ์ ๊ทธ๋๋ก ์ซ์์ฐฝ์ ์ฐํ๋๋ก
(4). ์ฐ์ฐ์ ํด๋ฆญ ์ boarder ๊ฐ ๊ตต์ด์ง๋๋ก
(5). ์ฐ์ฐ์ ํด๋ฆญ ํ ๋ค์ ์ซ์ ํด๋ฆญํ๋ฉด
์ซ์ ์นธ ์ด๊ธฐํ ๋๋ฉด์ ๊ธ๋ฐฉ ์ฐ์ ๊ฒ๋ง ์ฐํ๋๋ก
(6). ์ฐ์ฐ์ ๋ก์ง ๋ง๋ค๊ธฐ.
---> ์๊ฐ์น ๋ชปํ ์ :
์ฐ์ฐ์ ์ํ ๋ณ์์ ํจ์์ ์ธ์๋ก ๋ค์ด์ค๋ ์คํผ๋ ์ดํฐ๊ฐ์
๋ฐ๋ก ์ธ ์ ์๋ค๋ ์๊ฐ์ ๋ชปํ๋ค.
switch (๋ช
๋ น ์ํ ๊ธฐ์ค์ด ๋๋ ๊ฐ) {
์ฌ๋ฌ๊ฐ๋ฅผ ๋ํ๋ด์ผ ํ๋๊น {}๋ฅผ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ case "๊ธฐ์ค๊ฐ": ~~ ๊ฐ์ฒด ํํ์ด๋ค.
}
switch ์์ ๊ทธ๋ฅ operator๋ฅผ ์ผ๋ค.
๊ทธ๋ฌ๋ฉด =์ ๋๋ฅด๋ ์๊ฐ operator๋ = ์ด ๋๋๊น
default๋ก ๋์ด๊ฐ์ ๊ทธ๋ฅ ๊ฐ ์ถ๋ ฅํ๋ ๊ฒ ๋ฐ์ ์๋ค.
(7). ์ด๊ธฐํ ํจ์ ๋ง๋ค๊ธฐ
-> ํด๋น ๋ด์ฉ์ ์ ์ ํ๋ฆฐ์