JS ๋ฐฐ์—ด ๊ฐ์ฒด์š”์†Œ ์ˆ˜์ • immutable, mutable

2023. 6. 26. 15:15ยท JavaScript

๊ฐ์ฒด ํ˜•์‹์„ ๊ฐ€์ง„ ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฐฐ์—ด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ๋Š” map() ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ๋„, ์›๋ณธ ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์˜ˆ ์ˆ˜์ •๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. immutable๊ณผ mutable ์ฐจ์ด๋ฅผ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์“ฐ๊ธฐ์œ„ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ คํ•œ๋‹ค.

๋ฐ์ดํ„ฐ

state๋ผ๋Š” ๋ฐฐ์—ด์— ๊ฐ์ฒด ํ˜•์‹์˜ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

 

const state = [
{ id: 1, content: 'a' },
{ id: 2, content: 'b' },
];

๋ชฉํ‘œ

ํŠน์ • id๋กœ ๊ฐ์ฒด ์š”์†Œ๋ฅผ ์ฐพ์•„ ๊ทธ ์š”์†Œ์˜ content ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ state๊ฐ’๊ณผ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„๋•Œ์˜ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’๊ณผ, ๊ทธ ์ดํ›„ state๊ฐ’์ด๋ž‘ ๋น„๊ตํ•ด๋ด„์œผ๋กœ์จ ์›๋ณธ state ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ (mutable), ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š์•˜๋Š”์ง€ (immutable) ์ง์ ‘ ํ™•์ธํ•ด๋ณธ๋‹ค.

Spread operator๋กœ ๊ฐ์ฒด ์ˆ˜์ •

spread ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด์˜ content ๊ฐ’์„ 'aaa'๋กœ ์ˆ˜์ •ํ•œ๋‹ค.

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด { }์„ ์ ์–ด์ฃผ์–ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์•ˆ์— ์›๋ž˜ ์š”์†Œ el { id: 1, content: 'a' }์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ... ๋กœ ํŽผ์ณ์„œ ๋ณต์‚ฌํ•œ๋‹ค. content ๊ฐ’์€ 'aaa'๋กœ ๋ฎ์–ด์”Œ์šฐ๊ธฐํ•˜์—ฌ ์ˆ˜์ •ํ•œ๋‹ค.

 

const updateContent = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return { ...el, content: 'aaa' };
}
return el;
});
};
console.log(updateContent(1)); //id๊ฐ€ 1์ธ ์š”์†Œ๋ฅผ ์ฐพ์•„ ๊ทธ content ๊ฐ’์„ aaa๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
//[{id: 1, content: 'aaa'}, {id: 2, content: 'b'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'b'}]


์›๋ž˜ state ๋ฐฐ์—ด์˜ id๊ฐ€ 1์ธ ์š”์†Œ์˜ content ๊ฐ’์€ 'a'์˜€์ง€๋งŒ, updateContent() ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ 'aaa'๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋กœ ์ˆ˜์ •๋˜์–ด์„œ ๋ฐ˜ํ™˜๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ updateContentํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚œ ์ดํ›„์— state์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค.

state์˜ 1๋ฒˆ content ๊ฐ’์€ ์—ฌ์ „ํžˆ 'a'๋กœ ์ฐํžˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

spread operator๋กœ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ์›๋ณธ state ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, spread operator๋กœ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•  ์‹œ Immutable๋กœ ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋œ๋‹ค.

 

Object.assign()์œผ๋กœ ๊ฐ์ฒด ์ˆ˜์ •

Object.assign() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


Object.assign() ๊ตฌ๋ฌธ

Object.assign(target, ...sources)
๋ณ€๊ฒฝํ•  ํƒ€๊ฒŸ ๊ฐ์ฒด, ์ƒˆ๋กœ์šด ์†์„ฑ์œผ๋กœ ๋ณ‘ํ•ฉํ•  ๊ฐ์ฒด

 

target

์ตœ์ข…์ ์œผ๋กœ ํƒ€๊ฒŸ ๋ชฉํ‘œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ

sources

์†Œ์Šค ๊ฐ์ฒด๋กœ, ํƒ€๊ฒŸ ๊ฐ์ฒด์— ๋ฐ˜์˜ํ•˜๊ณ ์ž ํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด


1)

๋จผ์ € Object.assign() ๋ฉ”์„œ๋“œ target ์ž๋ฆฌ์ธ ๋งจ ์ฒ˜์Œ ์ธ์ž์— ๋นˆ ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด์„ ์ ์–ด์ฃผ๊ณ , ...sources ์ž๋ฆฌ์— ์š”์†Œ์˜ ๋‚ด์šฉ el์„ ํŽผ์ณ์„œ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ์„ธ๋ฒˆ์งธ ์ธ์ž๋กœ๋„ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๋‚ด์šฉ์ธ content ๊ฐ’ 'bbb'๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ ์–ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด์ธ ๋นˆ ๊ฐ์ฒด {}์— ์›๋ž˜ ๊ธฐ์กด el ๋‚ด์šฉ์ธ {id: 2, content: 'b'} ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ , ๋˜ ๊ทธ ๊ฐ์ฒด์— content: 'bbb' ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋กœ ๋ณ‘ํ•ฉํ•ด์ค€๋‹ค๋Š” ๋œป์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ ์„ธ๋ฒˆ์งธ ์ธ์ž์—๋Š” {...el, content: 'bbb'}๋ผ๊ณ  ์ ์–ด์ฃผ์–ด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ชจ๋‘ ๋‹ค ์ ์–ด์ฃผ์–ด๋„ ๋˜๊ณ , ์ˆ˜์ •ํ•˜๋ ค๋Š” ์†์„ฑ๊ฐ’๋งŒ ์ ์–ด์ฃผ์–ด๋„ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

 

const updateContent2 = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return Object.assign({}, el, { ...el, content: 'bbb' });
//return Object.assign({}, el, { content: 'bbb' }); //๋˜‘๊ฐ™์ด ์ž‘๋™
}
return el;
});
};
console.log(updateContent2(2)); //์š”์†Œ id 2๋ฅผ ์ฐพ์•„ content ๊ฐ’์„ 'bbb'๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'b'}]

 

updateContent2()๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณด๋ฉด, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ 'bbb'๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๊ฐ€ ๋ฆฌํ„ด๋˜๋ฉด์„œ ์ˆ˜์ •๋œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

๊ทธ๋Ÿผ ์›๋ณธ ๋ฐฐ์—ด์ธ state๋Š”?

์—ฌ์ „ํžˆ 'b'๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์›๋ณธ๋ฐฐ์—ด์ด ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๋‹ค.

Object.assign() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— {} ๋นˆ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Immutable๋กœ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

 

2)

์ด์ œ Object.assign()์— ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , target ์ž๋ฆฌ์— ๋ฐ”๋กœ el์ด๋ผ๋Š” ๋‚ด๊ฐ€ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ el ๊ฐ์ฒด์˜ sources์ž๋ฆฌ์— ์ƒˆ๋กœ์šด ์†์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฐ’์„ ์ ์–ด์ค€๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ return Object.assign(el, {...el, content: 'bbb'})๊ณผ return Object.assign(el, {content: 'bbb'}) ์€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

 

const updateContent3 = (paramId) => {
return state.map((el) => {
if (el.id === paramId) {
return Object.assign(el, { ...el, content: 'bbb' });
}
return el;
});
};
console.log(updateContent3(2)); //์š”์†Œ id 2๋ฅผ ์ฐพ์•„ content ๊ฐ’์„ 'bbb'๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]
console.log(state);
//[{id: 1, content: 'a'}, {id: 2, content: 'bbb'}]

 

updateContent3() ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ’์€ ๋‹น์—ฐํžˆ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฐ’๋Œ€๋กœ ์ˆ˜์ •๋œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

์ด์ œ ์›๋ž˜ ๋ฐฐ์—ด์ธ state๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด?

state๋ฐฐ์—ด์€ ์ด์ œ 'bbb'๊ฐ€ ๋“ค์–ด์˜จ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์›๋ณธ ๋ฐฐ์—ด์ด ์ˆ˜์ •๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Object.assign()๋ฅผ ์‚ฌ์šฉ์‹œ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ , ๋‘๋ฒˆ์งธ sources ์ธ์ž์— ๊ฐ’์„ ํ• ๋‹นํ•ด์„œ ๋ฐ”๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ”๊พผ ๊ฒƒ์ด๋ฏ€๋กœ ์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” Mutableํ•œ ํŠน์„ฑ์ด ์žˆ๋‹ค. ์ฆ‰, ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒƒ์ด๋‹ค.

'JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JSON.stringify() | JSON.parse() | json()  (3) 2024.09.19
api ์ˆœ์ฐจ์  ์‹คํ–‰ | catch (err) vs catch | throw error vs return error  (0) 2024.05.22
TypeScript index signature ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ณ  (0) 2023.09.08
JS parseInt() vs Number()  (0) 2022.11.13
JS ๊ธฐ์ˆ ๋ฉด์ ‘ | const ํ‚ค์›Œ๋“œ ๊ฐ์ฒด ๊ฐ’ ๋ณ€๊ฒฝ  (0) 2022.11.11
'JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • api ์ˆœ์ฐจ์  ์‹คํ–‰ | catch (err) vs catch | throw error vs return error
  • TypeScript index signature ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ณ
  • JS parseInt() vs Number()
  • JS ๊ธฐ์ˆ ๋ฉด์ ‘ | const ํ‚ค์›Œ๋“œ ๊ฐ์ฒด ๊ฐ’ ๋ณ€๊ฒฝ
hana1203
hana1203
hana1203
hana's lab ๐ŸŒฑ
hana1203
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (94)
    • React (38)
    • JavaScript (7)
    • Firebase (4)
    • Google Cloud Platform (5)
    • Flutter (3)
    • Python (7)
    • Computer Science (6)
    • Problem Solving (3)
    • Git (5)
    • ํšŒ๊ณ  (10)
    • Etc (3)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • ์˜ค๋ธ”์™„

์ตœ๊ทผ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
hana1203
JS ๋ฐฐ์—ด ๊ฐ์ฒด์š”์†Œ ์ˆ˜์ • immutable, mutable
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.