[๐ŸŽ์ฝ”๋”ฉ์• ํ”Œ ๊ฐ•์˜์š”์•ฝ] Array์™€ Object State ๋ณ€๊ฒฝํ•˜๊ธฐ ๐Ÿ“Š

๐ŸŒˆ KJยท2025๋…„ 5์›” 9์ผ

codingapple

๋ชฉ๋ก ๋ณด๊ธฐ
5/23
post-thumbnail

๊ฐœ์š” ๐Ÿ“‹

์ด ๊ฐ•์˜๋Š” React์—์„œ ๋ฐฐ์—ด(Array)๊ณผ ๊ฐ์ฒด(Object) ํƒ€์ž…์˜ state๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํŠนํžˆ ์ฐธ์กฐ ํƒ€์ž… ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ๊ณผ ๋ถˆ๋ณ€์„ฑ(Immutability) ์›์น™์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋… ๐Ÿ”

๋ฐฐ์—ด State ์ˆ˜์ •ํ•˜๊ธฐ ๐Ÿ“

let [๊ธ€์ œ๋ชฉ, ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ] = useState(['๋‚จ์ž์ฝ”ํŠธ ์ถ”์ฒœ', '๊ฐ•๋‚จ ์šฐ๋™๋ง›์ง‘', 'ํŒŒ์ด์ฌ ๋…ํ•™']);

์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•๊ณผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ• โš ๏ธ

๋ฐฉ๋ฒ• 1: ์ง์ ‘ state ๊ฐ’ ๊ต์ฒด (๊ฐ„๋‹จํ•˜์ง€๋งŒ ํ™•์žฅ์„ฑ ๋ถ€์กฑ)

// ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ ๋ณ€๊ฒฝ
<button onClick={() => {
  ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(['์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ', '๊ฐ•๋‚จ ์šฐ๋™๋ง›์ง‘', 'ํŒŒ์ด์ฌ ๋…ํ•™']);
}}>์ˆ˜์ •๋ฒ„ํŠผ</button>

๋ฐฉ๋ฒ• 2: ๊ธฐ์กด state ์ง์ ‘ ์ˆ˜์ • (์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•)

<button onClick={() => {
  ๊ธ€์ œ๋ชฉ[0] = '์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ';
  ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(๊ธ€์ œ๋ชฉ); // ์ž‘๋™ํ•˜์ง€ ์•Š์Œ!
}}>์ˆ˜์ •๋ฒ„ํŠผ</button>

๋ฐฉ๋ฒ• 3: state ๋ณต์‚ฌ ํ›„ ์ˆ˜์ • (์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•)

<button onClick={() => {
  let copy = ๊ธ€์ œ๋ชฉ;  // ์–•์€ ๋ณต์‚ฌ (๊ฐ™์€ ์ฐธ์กฐ)
  copy[0] = '์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ';
  ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(copy);  // ์ž‘๋™ํ•˜์ง€ ์•Š์Œ!
}}>์ˆ˜์ •๋ฒ„ํŠผ</button>

[๋ฐฉ๋ฒ• 2], [๋ฐฉ๋ฒ• 3] ๋ฌธ์ œ์ :
let copy = ๊ธ€์ œ๋ชฉ์€ ์‹ค์ œ๋กœ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ copy[0]์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ ๊ธ€์ œ๋ชฉ ๋ฐฐ์—ด๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜์ฃ . React๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ด์ „ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์˜ ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•ด์„œ ํŒ๋‹จํ•˜๋Š”๋ฐ, ์ฐธ์กฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 4: ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋กœ ๋ณต์‚ฌ (์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•) โœ…

<button onClick={() => {
  let copy = [...๊ธ€์ œ๋ชฉ];  // ์ƒˆ๋กœ์šด ์ฐธ์กฐ ์ƒ์„ฑ
  copy[0] = '์—ฌ์ž์ฝ”ํŠธ ์ถ”์ฒœ';
  ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(copy);  // ์ œ๋Œ€๋กœ ์ž‘๋™ํ•จ!
}}>์ˆ˜์ •๋ฒ„ํŠผ</button>

์ฐธ์กฐ ํƒ€์ž…(Reference Type)์˜ ์ž‘๋™ ์›๋ฆฌ ๐Ÿ“š

์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ

  1. ๋ฐฐ์—ด/๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ , ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ์ €์žฅ
  2. ์ฐธ์กฐ ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐ(ํ™”์‚ดํ‘œ)๋งŒ ๋ณต์‚ฌ๋จ
  3. ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋“ค์€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•จ
let data1 = [1, 2, 3];
let data2 = data1;   // ์ฐธ์กฐ๋งŒ ๋ณต์‚ฌ๋จ
data2[0] = 1000;     // data1๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋จ
console.log(data1);  // [1000, 2, 3]
console.log(data2 === data1);  // true (๊ฐ™์€ ์ฐธ์กฐ)

๋…๋ฆฝ์ ์ธ ๋ณต์‚ฌ๋ณธ ๋งŒ๋“ค๊ธฐ (๋ถˆ๋ณ€์„ฑ ์œ ์ง€)

// ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ
let copy = [...๊ธฐ์กดstate];  

// ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ
let copy = {...๊ธฐ์กดstate};

State ๋ณ€๊ฒฝํ•จ์ˆ˜ ๋™์ž‘ ์›๋ฆฌ โš™๏ธ

  • React๋Š” state ๋ณ€๊ฒฝ ์‹œ ๊ธฐ์กด state์™€ ์ƒˆ state๋ฅผ ๋น„๊ต (===)
  • ์ฐธ์กฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ณ€๊ฒฝ์œผ๋กœ ์ธ์‹ํ•˜์ง€ ์•Š์Œ
  • ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ์ฐธ์กฐ(๋…๋ฆฝ์  ๋ณต์‚ฌ๋ณธ)๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ

์ •๋ฆฌ ๋ฐ ์‘์šฉ ๐Ÿ“Œ

  1. ๋ฐฐ์—ด/๊ฐ์ฒด state ์ˆ˜์ • ์‹œ ๋…๋ฆฝ์  ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ ํ•„์ˆ˜
  2. ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(...) ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌ
  3. ๋ณต์‚ฌ๋ณธ ์ˆ˜์ • ํ›„ state ๋ณ€๊ฒฝํ•จ์ˆ˜์— ์ „๋‹ฌ

์‘์šฉ ์˜ˆ: ๊ฐ€๋‚˜๋‹ค์ˆœ ์ •๋ ฌ ๊ธฐ๋Šฅ

<button onClick={() => {
  let copy = [...๊ธ€์ œ๋ชฉ];
  copy.sort();  // ์•ŒํŒŒ๋ฒณ/๊ฐ€๋‚˜๋‹ค์ˆœ ์ •๋ ฌ
  ๊ธ€์ œ๋ชฉ๋ณ€๊ฒฝ(copy);
}}>๊ฐ€๋‚˜๋‹ค์ˆœ ์ •๋ ฌ</button>

๊ฐ•์˜ ๋‚ด์šฉ ๊ฒ€ํ†  ๐Ÿ”

Claude.ai ์—์„œ ์ œ์‹œํ•œ ๊ฐ•์˜์—์„œ ๋ณด์ถฉํ•˜๋ฉด ์ข‹์€ ๋‚ด์šฉ

  1. ์ค‘์ฒฉ๋œ ๊ฐ์ฒด/๋ฐฐ์—ด ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ:
    ๊ฐ•์˜์—์„œ๋Š” ๋‹จ์ผ ๋ ˆ๋ฒจ์˜ ๋ฐฐ์—ด/๊ฐ์ฒด๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ(๊ฐ์ฒด ์•ˆ์˜ ๊ฐ์ฒด, ๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ์ฒด ๋“ฑ)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋งŒ์œผ๋กœ๋Š” ๊นŠ์€ ๋ณต์‚ฌ(deep copy)๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    // ์ค‘์ฒฉ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ
    let copy = {
      ...๊ธฐ์กดstate,
      nested: { ...๊ธฐ์กดstate.nested }  // ์ค‘์ฒฉ ๊ฐ์ฒด๋„ ๋ณ„๋„ ๋ณต์‚ฌ ํ•„์š”
    };
  2. ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ ๋ˆ„๋ฝ:
    ํฐ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” useCallback, useMemo, ๋˜๋Š” Immer ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  3. sort ๋ฉ”์„œ๋“œ ์ฃผ์˜์‚ฌํ•ญ:
    ์‘์šฉ ๋ฌธ์ œ์—์„œ ์–ธ๊ธ‰๋œ sort() ๋ฉ”์„œ๋“œ๋Š” ์›๋ณธ ๋ฐฐ์—ด์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ณธ ์ •๋ ฌ์€ ๋ฌธ์ž์—ด ๊ธฐ์ค€์ด๋ฏ€๋กœ ์ˆซ์ž ์ •๋ ฌ ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ถˆ๋ณ€์„ฑ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช… ๋ถ€์กฑ:
    ๊ฐ•์˜์—์„œ๋Š” "์›๋ณธ์ด ๋‚˜์ค‘์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด์„œ" ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•˜์ง€๋งŒ, React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๊ด€๋ จ๋œ ๋” ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ๋น„๊ต๋ฅผ ํ†ตํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ถˆ๋ณ€์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€