-
[React] μ μνκ°μ΄ λ°λλ©΄ 리λ λλ§λ κΉ? (feat. Closure)π§ λ§λ²μ κ³ΌνμΌλ‘ 2023. 2. 20. 15:49
π μλ‘
리μ‘νΈλ₯Ό μ μ¬μ©νλ λ¨κ³λ κ±°μ³€κ³ , λΉμ°ν κ²λ€μ μ?λΌλ μ§λ¬Έλ€ λ§κ΅¬ λμ§λ μμ¦μ,
리μ‘νΈκ° 리λ λλ§ λλ μμ , μ¦ μνκ°κ³Ό νλ‘μ΄ μ λ°μ΄νΈλλ μμ μ μ΄λ ν μΌλ€μ΄ μΌμ΄λλμ§ κΆκΈν΄μ‘λ€.
ν©μ΄μ Έμλ 컨ν μ€νΈ-ν΄λ‘μ Έ-리μ‘νΈ νΌμ¦μ λ§μΆ μ μλ μκ°μ΄μλ€.
π μ¬μ μ§μ
ν΄λ‘μ Έλ 무μμΈκ°? λ΄κ° μκ°νκΈ°μλ μ΄λ ν λͺ¨λ¨ΌνΈμ΄λ€. λ μ컬 μ€μ½ν λ°μμ λ μ컬 μ€μ½ν λ΄λΆλ₯Ό κΈ°μ΅νκ³ μ κ·Όν μ μλ. μ΄ λ§μ λν μ€λͺ μ΄ μλΏμ§ μλ€λ©΄ μλ π μ μ 컨ν μ€νΈ & ν¨μ 컨ν μ€νΈ λΆλΆλΆν° μ½μ΄λ³΄κΈΈ μΆμ²νλ€.
π useState ν μ΄ μ΄λ»κ² μκ²Όλκ°
μλλ λ°λ‘ μ¬μ©μ μ΅μνμ§λ§, μ΄λ»κ² μκ²Όλμ§λ μμν useState ν μ μκΉμμ΄λ€. (μ½λμ°Έκ³ λ§ν¬)
const React = (() => { let val; // -- 1 const useState = (initialValue) => { val = val || initialValue; const setState = (newVal) => { val = newVal; }; return [val, setState]; }; return { useState }; })(); const App = () => { const [state, setState] = React.useState(0); // -- 2 setState(1) return <></> };
React ν¨μλ React λΌμ΄λΈλ¬λ¦¬λ₯Ό, κ·Έ λ΄λΆ useState ν¨μλ useState ν μ μ§μΉνλ€.
μ΄λ μ°μΈ useState ν¨μλ ν΄λ‘μ Έ ν¨μλ‘, κ·Έ μμ μ€μ½νμ μλ let val; λ³μλ₯Ό μ°Έμ‘°νλ€.
App ν¨μλ App μ»΄ν¬λνΈλ₯Ό μλ―Ένλ€.
λ΄λΆμμ μ¬μ©λ stateμ setStateλ React ν¨μ λ΄ useState ν¨μμμ λ°νν μνκ°κ³Ό μΈν° ν¨μλ₯Ό μ§μΉνκ³ , μ΄ λμ κ°μ μ€μ½νλ₯Ό 곡μ νλ€.
setStateλ κ³μν΄μ λμΌν μμ val κ°μ μ λ°μ΄νΈμν€κ² λκ³ , κ·Έ κ°μ setState ν¨μκ° μ¬μ©λ μ€μ½νμμ 곡μ λλ€.
νμ§λ§ state λ³μλ μ λ°μ΄νΈ μ΄μ μ κ°μ΄ μ μ₯λ μνλ‘, stateμμ κ³μν΄μ μ λ°μ΄νΈλ κ°μ 보μ¬μ£ΌκΈ° μν λ°©λ²μ΄ νμνμ‘λ€.
μ΄λ setState ν¨μμμ μνκ° μ¦, λ΄λΆ val λ³μμ λ³νκ° μμ λλ§λ€ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ μμΌμ£Όκ² λλ©΄, useState ν μ΄ μ¬μ©λ μμ μ μ½λ (2)κ° λ νλ² μ€νλκΈ° λλ¬Έμ stateλ₯Ό λκΈ°μ μΌλ‘ μ λ°μ΄νΈ μμΌμ€ μ μκ²λλ€.
π νμ€ μμ½!
리λ λλ§μ μνκ°μ λκΈ°μ μΈ μκ°μ μ λ°μ΄νΈλ₯Ό μν λΆκ°νΌν μ νμΈ κ² κ°λ€! λ λ λ
μ°Έκ³ μλ£:
π μ μ 컨ν μ€νΈ & ν¨μ 컨ν μ€νΈ?
μ½λλ₯Ό μ²μ μ€ννλ μκ° λͺ¨λ κ²(μ μ μ€μ½ν, κ·Έκ³³μμ μ ν¨ν λ³μ λ± μ μμ μΌλ‘ κ΄λ¦¬λλ μ 보)μ κ΄λ¦¬νλ νκ²½μΈ μ μ 컨ν μ€νΈκ° μμ±λκ³ μ΄λ νμ΄μ§κ° μ’ λ£λ λκΉμ§ μ μ§λ©λλ€.
κ·Έλ¦¬κ³ μ½λμμ κ° ν¨μλ₯Ό μ€νν λλ§λ€ ν¨μ 컨ν μ€νΈκ° νλμ© μκΈ°κ² λλλ° κ·Έ μμ ν¨μμ λν μ 보 μ¦, λ³μ, μ€μ½ν 체μΈ, thisκ° μμ±λλ€.
νΉμ ν¨μ 컨ν μ€νΈμμ λ³μλ₯Ό μ°Ύμ λ μ λ¬λ°μ κ°μ²΄μ μλ€λ©΄ μ€μ½ν 체μΈμ λ°λΌ μ¬λΌκ°λ©° μ°Ύκ² λ¨.
ν΄λ‘μ ν¨μλ₯Ό μ μΈνκ³ ν¨μ μ€νμ΄ μλ£λλ©΄ ν΄λΉ ν¨μ 컨ν μ€νΈλ μ¬λΌμ§λλ€.
π μ€μ½ν?
μ°Έμ‘°λ μ μλ μ ν¨ν λ²μλ₯Ό λ»ν©λλ€. μλ₯Ό λ€μ΄ λ³μ Aμ μ€μ½ν == λ³μ Aκ° μ°Έμ‘°λ μ μλ μ ν¨ν λ²μμ λλ€.
μ€μ½νμ κ΄λ ¨ν΄μ κΈ°μ΅ν΄μΌν ν€μλκ° μμ΅λλ€.
- μ묡μ μ μ(implied globals):
λ³μ μμ νμ μ μ§μ ν΄μ£Όμ§ μμΌλ©΄ μ묡μ μ μλ³μκ° λ¨.
function foo() { x = 1; // Throws a ReferenceError in "use strict" mode var y = 2; } foo(); console.log(x); // 1 console.log(y); // ReferenceError: y is not defined
b. λ μ컬 μ€μ½ν(Lexical scoping):
ν¨μλ₯Ό μ²μ μ μΈνλ μκ°μ ν¨μ λ΄λΆμ λ³μλ **μκΈ° μ€μ½νλ‘λΆν° κ°μ₯ κ°κΉμ΄ κ³³(μμ λ²μ)**μ μλ λ³μλ₯Ό κ³μ μ°Έμ‘°νκ² λλ€.
var number = 1234 function printNumber() { console.log(number); } function wrapper() { var number = 4321 printNumber(); } wrapper(); //1234
c. μ€μ½ν 체μΈ(Scope chain):
μ€μ½ν Aμμ μ€μ½ν B, μ€μ½ν Bμμ μ€μ½ν C ← μ΄λ κ² μ²΄μΈ ννμ μ€μ½ν ꡬ쑰λ₯Ό μ§μΉνλλ°, κ°μ₯ μ΄λ μ€μ½νμμ μμ°ν° μ€μ½ν λ³μ μ°Έμ‘° μ μμμ → λ°μΌλ‘ κ²μμ νκ² λλ€.
π ν΄λ‘μ Έ?
ν΄λ‘μ Έμ μ΄μμΈ closedλ, λ«νμλ€, μ¦ μμ λ³μκ° ν¨μμ λ«νμλ€λ μλ―Έλ‘ μ°μ λλ€.
ν΄λ‘μ Έλ νμμ μ§μΉνλ€κ³ μκ°ν©λλ€. (μ΄ νμμ΄ λνλλ ν¨μλ₯Ό ν΄λ‘μ Έ ν¨μλΌ λΆλ₯΄κΈ°λν¨.)
μλ°μ€ν¬λ¦½νΈ μμ§ λ΄μμ λμλ€λλ κ°λΉμ§μ»¬λ ν°κ° μ°Έμ‘°λκ³ μμ§ μμ λ³μλ€μ μμ§ & μμ λ₯Ό νκ³ ,
κ·Έλ μ§ μκ³ μ°Έμ‘°λκ³ μλ λ³μλ€μ μμ§ λμμμ μ μΈκ° λ©λλ€.
κ·Έλ°λ° λ§μ κ²½μ°λ€ μ€μμ μμ°ν°ν¨μκ° μ’ λ£λλλΌλ μ΄λν¨μκ° μμ°ν°ν¨μμ λ³μλ₯Ό κ³μ μ°Έμ‘°νκ³ μλ κ²½μ°
κ°λΉμ§μ»¬λ ν°μ μμ§ λμμμ μ μΈλμ΄ μ κ·Όμ΄ κ°λ₯ν΄μ§λλ°, μ΄ νμ μ체λ₯Ό ν΄λ‘μ ΈλΌ λΆλ¦ λλ€
const counter = function() { // outer ν¨μ let count = 0; function changeCount(number) { // inner ν¨μ count += number; } return { increase: function() { // λ inner ν¨μ changeCount(1); }, decrease: function() { changeCount(-1); }, show: function() { alert(count); } } }; const counterClosure = counter(); // μλ λͺ¨λ λ©μλλ μμ°ν° ν¨μμ λ³μλ₯Ό μ°Έμ‘°νλ―λ‘ ν΄λ‘μ Έ ν¨μλΌ λΆλ₯Ό μ μμ΅λλ€ counterClosure.increase(); counterClosure.show(); // 1 counterClosure.decrease(); counterClosure.show(); // 0
ν΄λ‘μ Έ ν¨μμ ν¨κ» μ λ±μ₯νλ “μ»€λ§ (Currying)”μ΄λΌλ κ°λ μ΄ μμ΅λλ€. μΈμλ₯Ό μ¬λ¬κ° νμλ‘νμ§λ§ λͺ¨λ νλ²μ λ°μμ€μ§ λͺ»νλ κ²½μ°, ν΄λ‘μ Έ ν¨κ³Όλ₯Ό μ΄μ©ν΄μ μΈλΆ ν¨μ λ³μμ κ°μ κ³ μ μν¨ ν νΉμ μΈμλ₯Ό μ¬μ¬μ©ν μ μμ΅λλ€.
function firstRank(a){ return function secondRank(b){ return function thirdRank(c){ return {"1λ±":a, "2λ±": b, "3λ±": c} } } } let secondRank = firstRank("juyeon") let thirdRank = secondRank("songkang") let result = thirdRank("miumiu") console.log(result)