ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈμμ μ€μν κ°λ μΌλ‘ μΈλΆμμ μ κ·Όν μ μλ λΉκ³΅κ° λ³μλ₯Ό μμ±ν΄ λ°μ΄ν° μλμ κ°λ₯νκ² ν©λλ€. λν, λΉλκΈ° μμ μ΄λ μ΄λ²€νΈ νΈλ€λ¬μμ μνλ₯Ό ν¨κ³Όμ μΌλ‘ μ μ§νλ©° νμ©ν μ μμ΄ μ μ©ν©λλ€.
μ΄ κΈμμλ ν΄λ‘μ μ μ₯μ κ·Έλ¦¬κ³ μ΄λ₯Ό νμ©ν΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄λ λ°©λ²κ³Ό μΆκ°λ‘, Reactμ μνκ΄λ¦¬ useStateμ ν΄λ‘μ μ κ΄κ³μ λν΄μλ μ 리νμμ΅λλ€.
1. ν΄λ‘μ λ 무μμΌκΉβ
ν΄λ‘μ λ λ΄λΆ ν¨μκ° μΈλΆ ν¨μμ λ³μ(λ μ컬 νκ²½)μ μ κ·Όν μ μλ κΈ°λ₯μ μ 곡ν©λλ€.
μ΄λ‘ μΈν΄ ν¨μκ° νΈμΆλ μ΄νμλ μΈλΆ ν¨μμ μν(λ³μ)λ₯Ό μ μ§ν μ μμ΅λλ€.
- ν΄λ‘μ λ μΈλΆ λ³μ κ° μνλ₯Ό ν¨μ νΈμΆ μ΄νμλ μ μ§ν©λλ€.
- μ΄ μνλ μΈλΆμμ μ§μ μ κ·Όν μ μκ³ , λ΄λΆ ν¨μλ‘λ§ μ κ·Όμ΄ κ°λ₯ν©λλ€.
2. ν΄λ‘μ μμ μ½λ
μλλ ν΄λ‘μ μ κΈ°λ³Έ λμμ μ€λͺ νλ μμ μ½λμ λλ€. ν¨μκ° μ€μ²©λμ΄ μμ λ, λ΄λΆ ν¨μκ° μΈλΆ ν¨μμ λ³μμ μ κ·Όνλ μλ₯Ό 보μ¬μ€λλ€.
function outerFunction(){
let outerVariable = "λλ μΈλΆ λ³μ!";
function innerFunction(){
console.log(outerVariable); // μΈλΆ ν¨μμ λ³μμ μ κ·Ό
}
return innerFunction;
}
const closureFunction = outerFunction();
closureFunction(); // "λλ μΈλΆ λ³μ!" μΆλ ₯
- innerFunctionμ outerFunction() λ΄λΆμμ μ μΈλμμΌλ©°, outerFunction()μ μ€μ½νμ μ κ·Όν μ μμ΅λλ€.
- outerFunction()μ΄ μ€νλ μ΄νμλ, innerFunction()μ μΈλΆ λ³μ(outerFunction)μ μ κ·Όν μ μμ΅λλ€. μ΄λ₯Ό ν΄λ‘μ (Closure) λΌκ³ ν©λλ€.
3. ν΄λ‘μ λ μ΄λμ νμ©ν μ μμκΉ?
ν΄λ‘μ λ μ£Όλ‘ λ΄λΆ μ 보λ₯Ό μλνκ±°λ, μνλ₯Ό μ μ§νλ λ° μ¬μ©λ©λλ€. μλλ λͺ κ°μ§ νμ© μμ μ½λ μ λλ€.
1οΈβ£ λ°μ΄ν° μλ λ° μΊ‘μν
ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ μΈλΆμμ μ κ·Όν μ μλ λΉκ³΅κ° λ³μλ₯Ό λ§λ€κ³ , κ³΅κ° ν¨μ(public function)λ₯Ό ν΅ν΄ λ³μ κ°μ μ μ΄ν μ μμ΅λλ€.
function createCounter() {
let count = 0; // λΉκ³΅κ° λ³μ
return {
increment: function () {
count++;
console.log(`νμ¬ μΉ΄μ΄νΈ: ${count}`);
},
decrement: function () {
count--;
console.log(`νμ¬ μΉ΄μ΄νΈ: ${count}`);
},
getCount: function () {
return count;
},
};
}
const counter = createCounter();
counter.increment(); // νμ¬ μΉ΄μ΄νΈ: 1
counter.increment(); // νμ¬ μΉ΄μ΄νΈ: 2
console.log(counter.getCount()); // 2
counter.decrement(); // νμ¬ μΉ΄μ΄νΈ: 1
- countλ μΈλΆμμ μ§μ μ κ·Όν μ μμ΅λλ€.
- increment, decrement, getCount ν¨μλ§ ν΅ν΄ count κ°μ μ‘°μν μ μμ΅λλ€.
2οΈβ£ μν μ μ§
ν΄λ‘μ λ μ΄λ²€νΈ νΈλ€λ¬λ λΉλκΈ° μμ μμλ μνλ₯Ό μ μ§νλ λ° μ μ©ν©λλ€.
function createBtnHandler(btnId) {
let clickCount = 0;
return function () {
clickCount++;
console.log(`${btnId} ν΄λ¦ μ: ${clickCount}`);
};
}
const btn1Handler = createBtnHandler('btn1');
const btn2Handler = createBtnHandler('btn2');
btn1Handler(); // btn1 ν΄λ¦ μ: 1
btn1Handler(); // btn1 ν΄λ¦ μ: 2
btn2Handler(); // btn2 ν΄λ¦ μ: 1
- κ°κ°μ λ²νΌ νΈλ€λ¬λ λ 립μ μΈ μν(clickCount)λ₯Ό μ μ§ν©λλ€.
- ν΄λ‘μ λλΆμ clickCount λ³μλ ν¨μ νΈμΆ μλ§λ€ μ΄μ κ°μ κΈ°μ΅ν©λλ€.
3οΈβ£ once ν¨μ ꡬν
ν΄λ‘μ λ₯Ό μ¬μ©νμ¬ ν¨μκ° ν λ²λ§ μ€νλλλ‘ μ νν μ μμ΅λλ€.
function once(fn) {
let executed = false;
return function (...args) {
if (!executed) {
executed = true;
return fn(...args);
} else {
console.log('μ΄λ―Έ μ€νλ ν¨μμ
λλ€.');
}
};
}
const initialize = once(() => console.log('μ΄κΈ°ν μλ£!'));
initialize(); // μ΄κΈ°ν μλ£!
initialize(); // μ΄λ―Έ μ€νλ ν¨μμ
λλ€.
- executedλ λ΄λΆμμλ§ κ΄λ¦¬λλ λ³μλ‘, ν¨μκ° ν λ²λ§ μ€νλλλ‘ μ μ΄ν©λλ€.
4. Reactμμ ν΄λ‘μ μ useStateμ κ΄κ³ β
Reactμ useStateλ ν΄λ‘μ μ νΉμ±μ νμ©νμ¬ μνλ₯Ό μ μ§ ν©λλ€.
- useStateλ ν΄λ‘μ λ₯Ό κΈ°λ°μΌλ‘ μνμ λ λλ§μ κ΄λ¦¬ν©λλ€.
- λ΄λΆ ν¨μκ° λ λλ§ μμ μ μν κ°μ μΊ‘μ²νλ λ°©μμΌλ‘ λμν©λλ€.
- 리μ‘νΈμ μνκ΄λ¦¬μμ ν΄λ‘μ κ° μ€μνμ΄μ :
- μ»΄ν¬λνΈκ° μνλ₯Ό μ μ§νκ³ , λ λλ§ κ°μ λ°μ΄ν° λΆμΌμΉλ₯Ό λ°©μ§ν μ μμ΅λλ€.
- μ΅μ μν κΈ°λ° μ
λ°μ΄νΈ:
- ν΄λ‘μ λ‘ μΈν κ° λΆμΌμΉ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄, setStateμ ν¨μν μ λ°μ΄νΈ λ°©μμ μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
1οΈβ£ λ λλ§κ³Ό ν΄λ‘μ μ κ΄κ³
리μ‘νΈ μ»΄ν¬λνΈκ° λ λλ§λ λλ§λ€ μλ‘μ΄ λλλ§ μ€μ½νκ° μμ±λ©λλ€. μ΄λ, useStateκ° λ°νν count λ³μλ νΉμ λ λλ§ μμ μ κ°μ ν΄λ‘μ λ‘ μΊ‘μ²ν©λλ€. μλ μμ μ½λμ λλ€.
const { useState } = require('react');
export default function CounterRender() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1); // ν΄λ‘μ λ‘ μΊ‘μ²λ count κ° μ¬μ©
console.log('ν΄λ‘μ μμ μΊ‘μ²λ κ°:', count);
}
return (
<>
<p>Count: {count}</p>
<button onClick={handleClick}>Increase +</button>
</>
);
}
- ν΄λ‘μ λμ: handleClick ν¨μλ λ λλ§ μμ μ count κ°μ ν΄λ‘μ λ‘ μΊ‘μ²ν©λλ€. λ°λΌμ setCountλ₯Ό νΈμΆν΄ μνλ₯Ό μ λ°μ΄νΈν΄λ, μΊ‘μ²λ κ°μ λ³κ²½λμ§ μμ΅λλ€.
- μν μ λ°μ΄νΈ: setCountκ° νΈμΆλλ©΄, 리μ‘νΈλ μ»΄ν¬λνΈλ₯Ό λ€μ λ λλ§νκ³ μλ‘μ΄ λ λλ§ μ€μ½νλ₯Ό μμ±ν©λλ€. μ΄λ‘ μΈν΄ countλ μ λ°μ΄νΈ λ μ΅μ κ°μ μ°Έμ‘°νκ² λ©λλ€.
2οΈβ£ μ΅μ μν κ° μ¬μ©
useStateμ μνλ₯Ό μ λ°μ΄νΈν λ μ΅μ μνλ₯Ό κΈ°λ°μΌλ‘ μμ νλ €λ©΄, μ λ°μ΄νΈ ν¨μ ννμ setCountλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
const { useState } = require('react');
export default function CounterRender() {
const [count, setCount] = useState(0);
function handleClick() {
setCount((prevCount) => prevCount + 1); // μ΅μ μν κ°μ κΈ°λ°μΌλ‘
console.log('μ΅μ κ° κΈ°λ°:', count); // μ¬μ ν μ΄μ κ°
}
return (
<>
<p>Count: {count}</p>
<button onClick={handleClick}>Increase +</button>
</>
);
}
- setCount((prevCount) => prevCount +1) λ μ΄μ μνλ₯Ό ν΄λ‘μ λ‘ μΊ‘μ²νκ³ , μ΄λ₯Ό μ΅μ κ°μΌλ‘ νμ©ν©λλ€.
- μ΄ λ°©μμ λΉλκΈ° μν μ λ°μ΄νΈ λ° λ λλ§ κ°μ λΆμΌμΉ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
3οΈβ£ ν΄λ‘μ μ useState 곡ν΅μ κ³Ό μ°¨μ΄μ
κ΅¬λΆ | JavaScript ν΄λ‘μ | React useState |
μν μ μ§ λ°©μ | ν¨μμ λ μ컬 νκ²½μ ν΅ν΄ λ³μ μνλ₯Ό μ μ§ | 리μ‘νΈ λ΄λΆμμ μνλ₯Ό κ΄λ¦¬νκ³ μ»΄ν¬λνΈ λ λλ§ μ μ΅μ κ° μ 곡 |
μ λ°μ΄νΈ λ°©μ | μΈλΆμμ λ΄λΆ ν¨μ νΈμΆμ ν΅ν΄ μ§μ μνλ₯Ό μ‘°μ | setState ν¨μλ₯Ό μ¬μ©νμ¬ μνλ₯Ό μ λ°μ΄νΈ |
μ μ© λ²μ | λͺ¨λ μλ°μ€ν¬λ¦½νΈ μ½λμμ μ¬μ© κ°λ₯ | 리μ‘νΈ μ»΄ν¬λνΈ λ΄μμλ§ μ¬μ© κ°λ₯ |
μΊ‘μ²λ κ° | ν¨μ μ μΈ μμ λ μ컬 νκ²½μ κΈ°μ΅ | λ λλ§ μμ μ μν κ°μ ν΄λ‘μ λ‘ μΊ‘μ² |
ν΄λ‘μ λ ν¨μμ μ€ν 컨ν μ€νΈκ° μ’ λ£λ μ΄νμλ μμ μ€μ½νμ λ³μμ μ κ·Όν μ μκ² ν΄μ€λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° μλ, μν μ μ§, μ½λ μ¬μ¬μ© λ±μ λ€μν μ₯μ μ μ 곡νλ©°, ν¨μ¨μ μΈ κ°λ°μ΄ κ°λ₯ν©λλ€.
νΉν, 리μ‘νΈμ useStateμ κ°μ μνκ΄λ¦¬μ μ΄λ²€νΈ νΈλ€λ§ κ°μ ν΅μ¬ κ°λ μ μ΄ν΄νλλ° μ€μν μν μ ν©λλ€. ν΄λ‘μ λ₯Ό μ νμ©νλ©΄ μμ μ μ΄κ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.