ํด๋กœ์ €์™€ useState

 

์˜ค๋Š˜์€ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฐœ๋…์ธ ํด๋กœ์ €์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ดค๋‹ค.

 


 

 

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์ƒ์„ฑ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋Š” ํŠน์„ฑ์ด๋‹ค.

์ฆ‰, ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์—ฌ๊ธฐ์„œ innerํ•จ์ˆ˜๋Š” outerํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

์ด๋•Œ innerํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑ๋œ ์Šค์ฝ”ํ”„, ์ฆ‰ outer์„ ๊ธฐ์–ตํ•˜๊ณ , outerํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋œ ์ดํ›„์—๋„ ๊ทธ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ outer์— 10์ด ํ• ๋‹น๋˜๋ฉฐ inner๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ›„ outer ํ•จ์ˆ˜๋Š” ์ข…๋ฃŒํ•œ๋‹ค.

inner๋ฅผ ํ• ๋‹น๋ฐ›์€ fn์— 5๋ฅผ ํ• ๋‹นํ•˜๋ฉด inner(5)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

inner์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ x๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ, ์ž์‹ ์ด ์ƒ์„ฑ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•ด outer์˜ x๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

function outer(x) {
    function inner(y) {
        return x + y; // inner๋Š” outer์˜ x๋ฅผ ๊ธฐ์–ต
    }
    return inner;
}

const fn = outer(10); // outer ์‹คํ–‰ -> inner ๋ฐ˜ํ™˜ -> fn์€ inner๋ฅผ ์ฐธ์กฐ
console.log(fn(5));   // inner(5) ํ˜ธ์ถœ -> x = 10, y = 5 -> 10 + 5 = 15

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ

  • fn์€ inner ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • fn(5)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด inner(5)๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • inner๋Š” outer๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด outer์˜ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— x๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ํด๋กœ์ € ๋ฌธ์ œ

 

 

useState์—์„œ ํด๋กœ์ €๋Š” ์–ด๋–ค์‹์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์„๊นŒ?

๋ฆฌ์•กํŠธ์˜ useStateํ›…์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

useState๋ฅผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค.

function useState(initialValue) {
  let storedValue = initialValue;

  const getState = () => {
    return storedValue;
  };

  const setState = (newValue) => {
    storedValue = newValue;
  };

  return [getState, setState];
}
  1. getState: ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ๋ฐ˜ํ™˜
  2. setState: ์ƒํƒœ ๊ฐ’ ์—…๋ฐ์ดํŠธ

 

 

 

๋ฆฌ์•กํŠธ์—์„œ useState ์‚ฌ์šฉ ์˜ˆ์‹œ

const [count, setCount] = useState(0)

count๋Š” ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 0์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  setCount๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  1. ์ดˆ๊ธฐ ๊ฐ’ ํ• ๋‹น: useState(0)์ด ์‹คํ–‰๋˜๋ฉด, storedValue๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
  2. ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ: ๋งŒ์•ฝ setCount(1)์„ ์‹คํ–‰ํ•˜๋ฉด, storedValue๊ฐ€ 1๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด๋•Œ getState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์ธ 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

ํด๋กœ์ €์˜ ์—ญํ• 

์œ„ ์ฝ”๋“œ์—์„œ ์ƒํƒœ๋Š” storedValue๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋œ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” useStateํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ๊ณ ์œ ํ•˜๊ฒŒ ์ƒ์„ฑ๋˜๋ฉฐ, ๊ทธ ๊ฐ’์„ getState์™€ setState ํ•จ์ˆ˜๊ฐ€ ๊ธฐ์–ตํ•œ๋‹ค.

  • ์™ธ๋ถ€์—์„œ ์ง์ ‘ storedValue์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • getState์™€ setState๋Š” useStateํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €์ด๋ฏ€๋กœ, storedValue์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์ƒํƒœ ๊ฐ’์€ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ณ , setState๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Deep Dive ์ฑ…์—์„œ๋Š” ํด๋กœ์ €์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•œ๋‹ค.

 

ํด๋กœ์ €๋Š” ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.”

 

๋ฆฌ์•กํŠธ์—์„œ useState ํ›…์€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๊ฐ’์„ setState๋กœ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฉฐ, ์ƒํƒœ ๊ฐ’์€ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค.