useState๋Š” ์ปดํฌ๋„ŒํŠธ์— state ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” React Hook์ž…๋‹ˆ๋‹ค.

const [state, setState] = useState(initialState);

๋ ˆํผ๋Ÿฐ์Šค

useState(initialState)

์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ useState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

import { useState } from 'react';

function MyComponent() {
const [age, setAge] = useState(28);
const [name, setName] = useState('Taylor');
const [todos, setTodos] = useState(() => createTodos());
// ...

๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [something, setSomething]๊ณผ ๊ฐ™์€ state ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ ๋” ๋งŽ์€ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜

  • initialState: state์˜ ์ดˆ๊ธฐ ์„ค์ •๊ฐ’์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์œ ํ˜•์˜ ๊ฐ’์ด๋“  ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ดํ›„์—๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ initialState๋กœ ์ „๋‹ฌํ•˜๋ฉด ์ด๋ฅผ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•ด์•ผ ํ•˜๊ณ  ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ ์ดˆ๊ธฐ state๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

useState๋Š” ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ state์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ์ค‘์—๋Š” ์ „๋‹ฌํ•œ initialState์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. state๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” set ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

  • useState๋Š” Hook์ด๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์ด๋‚˜ ์ง์ ‘ ๋งŒ๋“  Hook์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ณ  state๋ฅผ ๊ทธ ์•ˆ์œผ๋กœ ์˜ฎ๊ธฐ์„ธ์š”.
  • Strict Mode์—์„œ React๋Š” ์˜๋„์น˜ ์•Š์€ ๋ถˆ์ˆœ๋ฌผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋™์ž‘์ด๋ฉฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•˜๋‹ค๋ฉด(๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค) ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

setSomething(nextState)๊ณผ ๊ฐ™์€ set ํ•จ์ˆ˜

useState๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” set ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด state๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ state๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ์ด์ „ state๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•œ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

const [name, setName] = useState('Edward');

function handleClick() {
setName('Taylor');
setAge(a => a + 1);
// ...

ํŒŒ๋ผ๋ฏธํ„ฐ

  • nextState: state๊ฐ€ ๋  ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ํ—ˆ์šฉ๋˜์ง€๋งŒ, ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ํŠน๋ณ„ํ•œ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ nextState๋กœ ์ „๋‹ฌํ•˜๋ฉด ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•ด์•ผ ํ•˜๊ณ , ๋Œ€๊ธฐ ์ค‘์ธ state๋ฅผ ์œ ์ผํ•œ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ state๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React๋Š” ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ Œ๋”๋ง ์ค‘์— React๋Š” ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์—…๋ฐ์ดํ„ฐ๋ฅผ ์ด์ „ state์— ์ ์šฉํ•˜์—ฌ ๋‹ค์Œ state๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

set ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

  • set ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ state ๋ณ€์ˆ˜๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์—๋„ state ๋ณ€์ˆ˜์—๋Š” ์—ฌ์ „ํžˆ ํ˜ธ์ถœ ์ „ ํ™”๋ฉด์— ์žˆ๋˜ ์ด์ „ ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ƒˆ๋กœ์šด ๊ฐ’์ด Object.is์— ์˜ํ•ด ํ˜„์žฌ state์™€ ๋™์ผํ•˜๋‹ค๊ณ  ํŒ์ •๋˜๋ฉด, React๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ ์ž์‹๋“ค์„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ React๊ฐ€ ์ž์‹์„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์ „์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • React๋Š” state ์—…๋ฐ์ดํŠธ๋ฅผ batch ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ณ  set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹จ์ผ ์ด๋ฒคํŠธ ์ค‘์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ฌผ์ง€๋งŒ DOM์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด React๊ฐ€ ํ™”๋ฉด์„ ๋” ์ผ์ฐ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๊ฐ•์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, flushSync๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ Œ๋”๋ง ๋„์ค‘ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ๋ Œ๋”๋ง ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. React๋Š” ํ•ด๋‹น ์ถœ๋ ฅ์„ ๋ฒ„๋ฆฌ๊ณ  ์ฆ‰์‹œ ์ƒˆ๋กœ์šด state๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ „ ๋ Œ๋”๋ง์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • Strict Mode์—์„œ React๋Š” ์˜๋„์น˜์•Š์€ ๋ถˆ์ˆœ๋ฌผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋™์ž‘์ด๋ฉฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•˜๋‹ค๋ฉด(๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค) ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ๋ฒ•

์ปดํฌ๋„ŒํŠธ์— state ์ถ”๊ฐ€ํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ useState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์„ธ์š”.

import { useState } from 'react';

function MyComponent() {
const [age, setAge] = useState(42);
const [name, setName] = useState('Taylor');
// ...

๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [something, setSomething]๊ณผ ๊ฐ™์€ state ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค.

useState๋Š” ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ state๋กœ, ์ฒ˜์Œ์— ์ œ๊ณตํ•œ ์ดˆ๊ธฐ state๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  2. ์ƒํ˜ธ์ž‘์šฉ์— ๋ฐ˜์‘ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” set ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ™”๋ฉด์˜ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ state๋กœ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

function handleClick() {
setName('Robin');
}

React๋Š” ๋‹ค์Œ state๋ฅผ ์ €์žฅํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ ํ›„ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ํ•˜์„ธ์š”!

set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ ํ˜„์žฌ state๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function handleClick() {
setName('Robin');
console.log(name); // ์•„์ง "Taylor"์ž…๋‹ˆ๋‹ค!
}

setํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๋ Œ๋”๋ง์—์„œ ๋ฐ˜ํ™˜ํ•  useState์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

useState ๊ธฐ๋ณธ ์˜ˆ์‹œ

์˜ˆ์ œ 1 of 4:
์นด์šดํ„ฐ (์ˆซ์ž)

์˜ˆ์‹œ์—์„œ count state ๋ณ€์ˆ˜๋Š” ์ˆซ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      You pressed me {count} times
    </button>
  );
}


์ด์ „ state๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ state ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

age๊ฐ€ 42๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” setAge(age + 1)๋ฅผ ์„ธ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

function handleClick() {
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
}

ํ•˜์ง€๋งŒ ํด๋ฆญํ•ด๋ณด๋ฉด age๋Š” 45๊ฐ€ ์•„๋‹ˆ๋ผ 43์ด ๋ฉ๋‹ˆ๋‹ค! ์ด๋Š” set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์—์„œ age state ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ setAge(age + 1) ํ˜ธ์ถœ์€ setAge(43)์ด ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ state ๋Œ€์‹  setAge์— ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function handleClick() {
setAge(a => a + 1); // setAge(42 => 43)
setAge(a => a + 1); // setAge(43 => 44)
setAge(a => a + 1); // setAge(44 => 45)
}

์—ฌ๊ธฐ์„œ a => a + 1์€ ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋Œ€๊ธฐ ์ค‘์ธ state๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ค์Œ state๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

React๋Š” ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ๋ Œ๋”๋ง ์ค‘์— ๋™์ผํ•œ ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  1. a => a + 1์€ ๋Œ€๊ธฐ ์ค‘์ธ state๋กœ 42๋ฅผ ๋ฐ›๊ณ  ๋‹ค์Œ state๋กœ 43์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. a => a + 1์€ ๋Œ€๊ธฐ ์ค‘์ธ state๋กœ 43์„ ๋ฐ›๊ณ  ๋‹ค์Œ state๋กœ 44๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. a => a + 1์€ ๋Œ€๊ธฐ ์ค‘์ธ state๋กœ 44๋ฅผ ๋ฐ›๊ณ  ๋‹ค์Œ state๋กœ 45๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ ์ค‘์ธ ๋‹ค๋ฅธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, React๋Š” ๊ฒฐ๊ตญ 45๋ฅผ ํ˜„์žฌ state๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทœ์น™์ƒ ๋Œ€๊ธฐ ์ค‘์ธ state ์ธ์ˆ˜์˜ ์ด๋ฆ„์„ age์˜ a์™€ ๊ฐ™์ด state ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ prevAge ๋˜๋Š” ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

React๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ˆœ์ˆ˜ํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์—…๋ฐ์ดํ„ฐ๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Deep Dive

ํ•ญ์ƒ ์—…๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€๊ฐ€์š”?

์„ค์ •ํ•˜๋ ค๋Š” state๊ฐ€ ์ด์ „ state์—์„œ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ setAge(a => a + 1)์ฒ˜๋Ÿผ ์—…๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ ์ถ”์ฒœํ•œ๋‹ค๋Š” ๋ง์„ ๋“ค์–ด๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์  ๊ฑด ์—†์ง€๋งŒ ํ•ญ์ƒ ๊ทธ๋ž˜์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ ์‚ฌ์ด์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. React๋Š” ํด๋ฆญ๊ณผ ๊ฐ™์€ ์˜๋„์ ์ธ ์‚ฌ์šฉ์ž ์•ก์…˜์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋‹ค์Œ ํด๋ฆญ ์ „์— age state ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ โ€œ์˜ค๋ž˜๋œโ€ age๋ฅผ ๋ณผ ์œ„ํ—˜์€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ๋™์ผํ•œ ์ด๋ฒคํŠธ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—…๋ฐ์ดํ„ฐ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. state ๋ณ€์ˆ˜ ์ž์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์นœ์ ˆํ•œ ๋ฌธ๋ฒ•๋ณด๋‹ค ์ผ๊ด€์„ฑ์„ ๋” ์„ ํ˜ธํ•œ๋‹ค๋ฉด ์„ค์ •ํ•˜๋ ค๋Š” state๊ฐ€ ์ด์ „ state์—์„œ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์—…๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค state๊ฐ€ ๋‹ค๋ฅธ state ๋ณ€์ˆ˜์˜ ์ด์ „ state๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์ด๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ฒฐํ•ฉํ•˜๊ณ  reducer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค์Œ state๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ 

์˜ˆ์ œ 1 of 2:
์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜ ์ „๋‹ฌํ•˜๊ธฐ

์ด ์˜ˆ์‹œ๋Š” ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ โ€œ+3โ€ ๋ฒ„ํŠผ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

import { useState } from 'react';

export default function Counter() {
  const [age, setAge] = useState(42);

  function increment() {
    setAge(a => a + 1);
  }

  return (
    <>
      <h1>Your age: {age}</h1>
      <button onClick={() => {
        increment();
        increment();
        increment();
      }}>+3</button>
      <button onClick={() => {
        increment();
      }}>+1</button>
    </>
  );
}


๊ฐ์ฒด ๋ฐ ๋ฐฐ์—ด state ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

state์—๋Š” ๊ฐ์ฒด์™€ ๋ฐฐ์—ด๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React์—์„œ state๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๊ต์ฒด ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, state์— form ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”.

// ๐Ÿšฉ state ์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”.
form.firstName = 'Taylor';

๋Œ€์‹  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๊ต์ฒดํ•˜์„ธ์š”.

// โœ… ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ state๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
setForm({
...form,
firstName: 'Taylor'
});

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ์ฒด state ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋ฐ ๋ฐฐ์—ด state ์—…๋ฐ์ดํŠธํ•˜๊ธฐ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๊ฐ์ฒด ๋ฐ ๋ฐฐ์—ด state ์˜ˆ์‹œ

์˜ˆ์ œ 1 of 4:
ํผ (๊ฐ์ฒด)

์ด ์˜ˆ์‹œ์—์„œ form state ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ input์—๋Š” ์ „์ฒด form์˜ ๋‹ค์Œ state๋กœ setForm์„ ํ˜ธ์ถœํ•˜๋Š” change ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๊ฐœ ๊ตฌ๋ฌธ์ธ { ...form }์€ state ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

import { useState } from 'react';

export default function Form() {
  const [form, setForm] = useState({
    firstName: 'Barbara',
    lastName: 'Hepworth',
    email: 'bhepworth@sculpture.com',
  });

  return (
    <>
      <label>
        First name:
        <input
          value={form.firstName}
          onChange={e => {
            setForm({
              ...form,
              firstName: e.target.value
            });
          }}
        />
      </label>
      <label>
        Last name:
        <input
          value={form.lastName}
          onChange={e => {
            setForm({
              ...form,
              lastName: e.target.value
            });
          }}
        />
      </label>
      <label>
        Email:
        <input
          value={form.email}
          onChange={e => {
            setForm({
              ...form,
              email: e.target.value
            });
          }}
        />
      </label>
      <p>
        {form.firstName}{' '}
        {form.lastName}{' '}
        ({form.email})
      </p>
    </>
  );
}


์ดˆ๊ธฐ state ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ

React๋Š” ์ดˆ๊ธฐ state๋ฅผ ํ•œ ๋ฒˆ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ Œ๋”๋ง๋ถ€ํ„ฐ๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

function TodoList() {
const [todos, setTodos] = useState(createInitialTodos());
// ...

createInitialTodos()์˜ ๊ฒฐ๊ณผ๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง์—๋งŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋ชจ๋“  ๋ Œ๋”๋ง์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํฐ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฐ’๋น„์‹ผ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ญ๋น„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, useState์— ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์„ธ์š”.

function TodoList() {
const [todos, setTodos] = useState(createInitialTodos);
// ...

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ์ธ createInitialTodos()๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ์ž์ฒด์ธ createInitialTodos๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ํ•จ์ˆ˜๋ฅผ useState์— ์ „๋‹ฌํ•˜๋ฉด React๋Š” ์ดˆ๊ธฐํ™” ์ค‘์—๋งŒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” React๊ฐ€ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ์ดˆ๊ธฐ state๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ 

์˜ˆ์ œ 1 of 2:
์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ์ „๋‹ฌํ•˜๊ธฐ

์ด ์˜ˆ์‹œ์—์„œ๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ, createInitialTodos ํ•จ์ˆ˜๋Š” ์ดˆ๊ธฐํ™” ์ค‘์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. input์— ํƒ€์ดํ•‘ํ•  ๋•Œ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋งํ•  ๋•Œ์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import { useState } from 'react';

function createInitialTodos() {
  const initialTodos = [];
  for (let i = 0; i < 50; i++) {
    initialTodos.push({
      id: i,
      text: 'Item ' + (i + 1)
    });
  }
  return initialTodos;
}

export default function TodoList() {
  const [todos, setTodos] = useState(createInitialTodos);
  const [text, setText] = useState('');

  return (
    <>
      <input
        value={text}
        onChange={e => setText(e.target.value)}
      />
      <button onClick={() => {
        setText('');
        setTodos([{
          id: todos.length,
          text: text
        }, ...todos]);
      }}>Add</button>
      <ul>
        {todos.map(item => (
          <li key={item.id}>
            {item.text}
          </li>
        ))}
      </ul>
    </>
  );
}


key๋กœ state ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•  ๋•Œ key ์†์„ฑ์„ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ key ์†์„ฑ์€ ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ์— ๋‹ค๋ฅธ key๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” Reset ๋ฒ„ํŠผ์ด version state ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ด๋ฅผ Form์— key๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. key๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” Form ์ปดํฌ๋„ŒํŠธ(๋ฐ ๊ทธ ๋ชจ๋“  ์ž์‹)๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ฏ€๋กœ state๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด State๋ฅผ ๋ณด์กดํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

import { useState } from 'react';

export default function App() {
  const [version, setVersion] = useState(0);

  function handleReset() {
    setVersion(version + 1);
  }

  return (
    <>
      <button onClick={handleReset}>Reset</button>
      <Form key={version} />
    </>
  );
}

function Form() {
  const [name, setName] = useState('Taylor');

  return (
    <>
      <input
        value={name}
        onChange={e => setName(e.target.value)}
      />
      <p>Hello, {name}.</p>
    </>
  );
}


์ด์ „ ๋ Œ๋”๋ง์—์„œ ์–ป์€ ์ •๋ณด ์ €์žฅํ•˜๊ธฐ

๋ณดํ†ต์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ state๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋“œ๋ฌผ๊ฒŒ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ state๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ state ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ค‘ ์–ด๋Š ๊ฒƒ์—๋„ ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ํฌ๊ท€ํ•œ ๊ฒฝ์šฐ์—๋Š”, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๋™์•ˆ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ง€๊ธˆ๊นŒ์ง€ ๋ Œ๋”๋ง๋œ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. CountLabel ์ปดํฌ๋„ŒํŠธ๋Š” ์ „๋‹ฌ๋œ count props๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

export default function CountLabel({ count }) {
return <h1>{count}</h1>
}

์นด์šดํ„ฐ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ ์ดํ›„ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œํ–ˆ๋Š”์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. count prop๋Š” ์ด๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด์ „ ๊ฐ’์„ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด prevCount state ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. trend๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ state ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ count์˜ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. prevCount์™€ count๋ฅผ ๋น„๊ตํ•ด์„œ, ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ prevCount์™€ trend๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ํ˜„์žฌ count props์™€ ๋งˆ์ง€๋ง‰ ๋ Œ๋”๋ง ์ดํ›„ count๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋ชจ๋‘ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { useState } from 'react';

export default function CountLabel({ count }) {
  const [prevCount, setPrevCount] = useState(count);
  const [trend, setTrend] = useState(null);
  if (prevCount !== count) {
    setPrevCount(count);
    setTrend(count > prevCount ? 'increasing' : 'decreasing');
  }
  return (
    <>
      <h1>{count}</h1>
      {trend && <p>The count is {trend}</p>}
    </>
  );
}

๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ set ํ•จ์ˆ˜๋Š” prevCount !== count์™€ ๊ฐ™์€ ์กฐ๊ฑด ์•ˆ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์กฐ๊ฑด ๋‚ด๋ถ€์— setPrevCount(count)์™€ ๊ฐ™์€ ํ˜ธ์ถœ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๊นจ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฐฉ์‹์€ ์˜ค์ง ํ˜„์žฌ ๋ Œ๋”๋ง ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ์˜ state๋งŒ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ค‘์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ๊ฒฝ์šฐ์—๋„ set ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์—ฌ์ „ํžˆ ๋ณ€๊ฒฝ์ด ์•„๋‹Œ state ์—…๋ฐ์ดํŠธ์—ฌ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ๊ทœ์น™์„ ์–ด๊ฒจ๋„ ๋œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Effect์—์„œ state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋„์ค‘ set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด React๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ return๋ฌธ์œผ๋กœ ์ข…๋ฃŒ๋œ ์งํ›„, ์ž์‹์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋Š” ๊ณ„์† ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋Š” ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ๋ชจ๋“  Hook ํ˜ธ์ถœ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ์œผ๋ฉด ์ด๋ฅธ(early) return;์„ ํ†ตํ•ด ๋ Œ๋”๋ง์„ ๋” ์ผ์ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฌธ์ œ ํ•ด๊ฒฐ

state๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์ง€๋งŒ ๋กœ๊ทธ์—๋Š” ๊ณ„์† ์ด์ „ ๊ฐ’์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค

set ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ state๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function handleClick() {
console.log(count); // 0

setCount(count + 1); // 1๋กœ ๋ฆฌ๋ Œ๋”๋ง ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
console.log(count); // ์•„์ง 0์ž…๋‹ˆ๋‹ค!

setTimeout(() => {
console.log(count); // ์—ฌ๊ธฐ๋„ 0์ด๊ณ ์š”!
}, 5000);
}

๊ทธ ์ด์œ ๋Š” state๊ฐ€ ์Šค๋ƒ…์ƒท์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ƒˆ๋กœ์šด state ๊ฐ’์œผ๋กœ ๋‹ค๋ฅธ ๋ Œ๋”๋ง์„ ์š”์ฒญํ•˜์ง€๋งŒ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ count ๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ state๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, set ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const nextCount = count + 1;
setCount(nextCount);

console.log(count); // 0
console.log(nextCount); // 1

state๋ฅผ ์—…๋ฐ์ดํŠธํ•ด๋„ ํ™”๋ฉด์ด ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

React๋Š” Object.is๋กœ ๋น„๊ตํ•œ ๋’ค ๋‹ค์Œ state๊ฐ€ ์ด์ „ state์™€ ๊ฐ™์œผ๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณดํ†ต ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ state๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

obj.x = 10; // ๐Ÿšฉ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•: ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝ
setObj(obj); // ๐Ÿšฉ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด obj ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ๋‹ค์‹œ setObj๋กœ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— React๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฌด์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  ํ•ญ์ƒ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•: ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
setObj({
...obj,
x: 10
});

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: โ€œ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹คโ€

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. React๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜•์ ์œผ๋กœ ์ด๋Š” ๋ Œ๋”๋ง ์ค‘์— state๋ฅผ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง, state ์„ค์ •(๋ Œ๋”๋ง ์œ ๋ฐœ), ๋ Œ๋”๋ง, state ์„ค์ •(๋ Œ๋”๋ง ์œ ๋ฐœ) ๋“ฑ์˜ ๋ฃจํ”„์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

// ๐Ÿšฉ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•: ๋ Œ๋”๋ง ๋™์•ˆ ํ•ธ๋“ค๋Ÿฌ ์š”์ฒญ
return <button onClick={handleClick()}>Click me</button>

// โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „๋‹ฌ
return <button onClick={handleClick}>Click me</button>

// โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•: ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
return <button onClick={(e) => handleClick(e)}>Click me</button>

์ด ์—๋Ÿฌ์˜ ์›์ธ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ฝ˜์†”์—์„œ ์—๋Ÿฌ ์˜†์— ์žˆ๋Š” ํ™”์‚ดํ‘œ๋ฅผ ํด๋ฆญํ•œ ๋’ค JavaScript ์Šคํƒ์—์„œ ์—๋Ÿฌ์˜ ์›์ธ์ด ๋˜๋Š” ํŠน์ • set ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ฐพ์•„๋ณด์„ธ์š”.


์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ๋˜๋Š” ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ๋‘ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค

Strict Mode์—์„œ React๋Š” ์ผ๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ์ด ์•„๋‹Œ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

function TodoList() {
// ํ•ด๋‹น ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

const [todos, setTodos] = useState(() => {
// ํ•ด๋‹น ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋Š” ์ดˆ๊ธฐํ™” ๋™์•ˆ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
return createTodos();
});

function handleClick() {
setTodos(prevTodos => {
// ํ•ด๋‹น ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
return [...prevTodos, createTodo()];
});
}
// ...

์ด๋Š” ์ •์ƒ์ ์ธ ํ˜„์ƒ์ด๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋™์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. React๋Š” ํ˜ธ์ถœ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ, ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜, ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•˜๋‹ค๋ฉด ์ด ๋™์ž‘์ด ๋กœ์ง์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์˜๋„์น˜ ์•Š๊ฒŒ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ˆ˜๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋Š” state์˜ ๋ฐฐ์—ด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

setTodos(prevTodos => {
// ๐Ÿšฉ ์‹ค์ˆ˜: state ๋ณ€๊ฒฝ
prevTodos.push(createTodo());
});

React๋Š” ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ผ์ด ๋‘ ๋ฒˆ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‹ค์ˆ˜๊ฐ€ ์žˆ์Œ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  ๊ต์ฒดํ•˜์—ฌ ์‹ค์ˆ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

setTodos(prevTodos => {
// โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•: ์ƒˆ๋กœ์šด state๋กœ ๊ต์ฒด
return [...prevTodos, createTodo()];
});

์ด์ œ ์ด ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•˜๋ฏ€๋กœ ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•ด๋„ ๋™์ž‘์— ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— React๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ, ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜, ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ˆœ์ˆ˜ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ React๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.


state์˜ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์„ค์ • ๋Œ€์‹  ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค

state์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

const [fn, setFn] = useState(someFunction);

function handleClick() {
setFn(someOtherFunction);
}

ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด React๋Š” someFunction์„ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋กœ ์—ฌ๊ธฐ๊ณ , someOtherFunction์€ ์—…๋ฐ์ดํ„ฐ ํ•จ์ˆ˜๋ผ๊ณ  ์—ฌ๊น๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค์„ ํ˜ธ์ถœํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง๋กœ ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด, ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ํ•จ์ˆ˜ ์•ž์— () =>๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด React๋Š” ์ „๋‹ฌํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

const [fn, setFn] = useState(() => someFunction);

function handleClick() {
setFn(() => someOtherFunction);
}