πŸ‘¨πŸ»β€πŸ’» λͺ¨λ˜ λ¦¬μ•‘νŠΈ Deep Dive

pjw__98Β·2023λ…„ 12μ›” 18일
1
post-thumbnail

πŸ“† λ‚ μ§œ

2023/12/18(μ›”)

πŸ“š 챕터

ν΄λ‘œμ €λŠ” μ–΄λ–»κ²Œ ν™œμš©ν•˜λŠ”κ°€


πŸ‘¨πŸ»β€πŸ’»ν•™μŠ΅ λ‚΄μš©

πŸŽ―ν΄λ‘œμ €λŠ” μ–΄λ–»κ²Œ ν™œμš©ν• κΉŒ?

μ „μ—­ μŠ€μ½”ν”„λŠ” μ–΄λ””μ„œλ“  μ›ν•˜λŠ” 값을 κΊΌλ‚΄μ˜¬ 수 μžˆλ‹€λŠ” μž₯μ μ΄μžˆλ‹€.
ν•˜μ§€λ§Œ λˆ„κ΅¬λ“  μ ‘κ·Όν•  수 있고 μˆ˜μ •ν•  수 μžˆλ‹€λŠ” 단점이 μžˆλ‹€.

<script>
var counter = 0

function handleClick(){
counter++
}
</script>

μœ„ μ˜ˆμ œμ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ counter λ³€μˆ˜λŠ” 큰 문제λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
λ¬Έμ œλŠ” μ „μ—­ λ ˆλ²¨μ— 선언돼 μžˆμ–΄μ„œ λˆ„κ΅¬λ‚˜ μˆ˜μ •ν•  수 μžˆλ‹€λŠ” 것이닀.

  • window.counterλ₯Ό ν™œμš©ν•˜λ©΄ μ‰½κ²Œ ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆμ„ 것이닀.
    λ§Œμ•½ λ¦¬μ•‘νŠΈμ˜ useState의 λ³€μˆ˜κ°€ μ „μ—­ λ ˆλ²¨μ— μ €μž₯돼 있으면 μ–΄λ–»κ²Œ 될까?
    μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 쑰금만 μ•„λŠ” μ‚¬λžŒμ΄λΌλ©΄ λˆ„κ΅¬λ‚˜ λ¦¬μ•‘νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ λ§κ°€λœ¨λ¦΄ 것이닀.λ”°λΌμ„œ λ¦¬μ•‘νŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” λ‚΄λΆ€ μƒνƒœ 값은 λ¦¬μ•‘νŠΈκ°€ λ³„λ„λ‘œ κ΄€λ¦¬ν•˜λŠ” ν΄λ‘œμ € λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ‹€.
    JSμ—μ„œ ν΄λ‘œμ € ν™œμš©μ„ μ–΄λ–»κ²Œ ν•˜λŠ”μ§€ μ˜ˆμ œμ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄μž

πŸ“Œ JSμ—μ„œμ˜ ν΄λ‘œμ € ν™œμš©λ²•

<script>
function Counter() {
	var counter = 0
    
    return{
    	increase: function() {
        	return ++counter
        },
        decrease : function () {
        return --counter
        },
        counter: function() {
        console.log('counter에 접근함')
        return counter
        },
    }
}

var c = Counter()

console.log(c.increase()) // 1
console.log(c.increase()) // 2
console.log(c.increase()) // 3
console.log(c.decrease()) // 2
console.log(c.counter()) // 2
</script>

μœ„μ˜ μ˜ˆμ œμ½”λ“œμ™€ 같이 μ½”λ“œλ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΄μ μ—λŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μžˆλ‹€..
λ¨Όμ € counter λ³€μˆ˜λ₯Ό μ§μ ‘μ μœΌλ‘œ λ…ΈμΆœν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ μ‚¬μš©μžκ°€ 직접 μˆ˜μ •ν•˜λŠ” 것을 λ§‰μ•˜μŒμ€ λ¬Όλ‘ ,μ ‘κ·Όν•˜λŠ” 경우λ₯Ό μ œν•œν•΄ 둜그λ₯Ό λ‚¨κΈ°λŠ” λ“±μ˜
뢀차적인 μž‘μ—…λ„ μˆ˜ν–‰ν•  수 있게 됐닀.
λ˜ν•œ counter λ³€μˆ˜μ˜ μ—…λ°μ΄νŠΈλ₯Ό increase와 decrease둜 μ œν•œν•΄ λ¬΄λΆ„λ³„ν•˜κ²Œ λ³€κ²½λ˜λŠ” 것을 λ§‰μ•˜λ‹€. 이처럼 ν΄λ‘œμ €λ₯Ό ν™œμš©ν•˜λ©΄ μ „μ—­ μŠ€μ½”ν”„μ˜ μ‚¬μš©μ„ 막고, κ°œλ°œμžκ°€ μ›ν•˜λŠ” μ •λ³΄λ§Œ κ°œλ°œμžκ°€ μ›ν•˜λŠ” λ°©ν–₯으둜 λ…ΈμΆœμ‹œν‚¬ 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ λ¦¬μ•‘νŠΈ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ ν›…μ—μ„œ ν΄λ‘œμ €λŠ” μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

πŸ“Œ Reactμ—μ„œμ˜ ν΄λ‘œμ € ν™œμš©λ²•

ν΄λ‘œμ €μ˜ 원리λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” λŒ€ν‘œμ μΈ 것 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ useStateλ‹€.

<script>
function Component() {
 const [state,setState] = useState()
 
 function handleClick(){
 	//useState ν˜ΈμΆœμ€ μœ„μ—μ„œ λλ‚¬μ§€λ§Œ,
    // setStateλŠ” 계속 λ‚΄λΆ€μ˜ μ΅œμ‹ κ°’(prev)을 μ•Œκ³ μžˆλ‹€.
    //μ΄λŠ” ν΄λ‘œμ €λ₯Ό ν™œμš©ν–ˆκΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ‹€.
    setState((prev) => prev +1)
 }
 
}
</script>

useState ν•¨μˆ˜μ˜ ν˜ΈμΆœμ€ Component λ‚΄λΆ€ 첫 μ€„μ—μ„œ μ’…λ£ŒλλŠ”λ°, setStateλŠ”
useState λ‚΄λΆ€μ˜ μ΅œμ‹  값을 μ–΄λ–»κ²Œ κ³„μ†ν•΄μ„œ 확인할 수 μžˆμ„κΉŒ?
λ°”λ‘œ ν΄λ‘œμ €κ°€ useState λ‚΄λΆ€μ—μ„œ ν™œμš©λκΈ° λ•Œλ¬Έμ΄λ‹€.
μ™ΈλΆ€ ν•¨μˆ˜(useState)κ°€ λ°˜ν™˜ν•œ λ‚΄λΆ€ ν•¨μˆ˜(setState)λŠ” μ™ΈλΆ€ ν•¨μˆ˜(useState)의 호좜이 λλ‚¬μŒμ—λ„ μžμ‹ μ΄ μ„ μ–Έλœ μ™ΈλΆ€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ ν™˜κ²½(stateκ°€ μ €μž₯돼 μžˆλŠ” μ–΄λ”˜κ°€)을 κΈ°μ–΅ν•˜κΈ° λ•Œλ¬Έμ— κ³„μ†ν•΄μ„œ state 값을 μ‚¬μš©ν•  수 μžˆλŠ”κ²ƒμ΄λ‹€.

➑️ λ‹€μŒ κΈ€μ—μ„œλŠ” ν΄λ‘œμ €λ₯Ό ν™œμš©ν•  λ•Œ μ£Όμ˜ν•  사항에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μž.

profile
β˜„οΈ

0개의 λŒ“κΈ€