๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

๋ฐ์ดํ„ฐ ํƒ€์ž…

๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๊ธฐ๋ณธํ˜•, ์ฐธ์กฐํ˜• ์ด๋ ‡๊ฒŒ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธํ˜•์€ ํ• ๋‹น์ด๋‚˜ ์—ฐ์‚ฐ์‹œ ๋ณต์ œ๋˜๊ณ  ์ฐธ์กฐํ˜•์€ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.
์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋‘˜ ๋ชจ๋‘ ๋ณต์ œ๋ฅผ ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๋‹ค๋งŒ ๊ธฐ๋ณธํ˜•์€ ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Ÿ๊ฐ’์„ ๋ฐ”๋กœ ๋ณต์ œํ•˜๋Š” ๋ฐ˜๋ฉด ์ฐธ์กฐํ˜•์€ ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Ÿ๊ฐ’๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๋ณต์ œํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ถˆ๋ณ€๊ฐ’(Immutable Value)

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋“ค์€ ๋ชจ๋‘ ๋ถˆ๋ณ€๊ฐ’(immutability์„ ๋•๋‹ˆ๋‹ค.

๊ธฐ๋ณธํ˜•์ด ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด,

 

[JS] ๋ชจ๋˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive - ๋ฐ์ดํ„ฐ ํƒ€์ž…

6์žฅ ๋ฐ์ดํ„ฐ ํƒ€์ž…(Data Type) ES6๋ถ€ํ„ฐ๋Š” 7๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. 7๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์›์‹œ ํƒ€์ž…(Primitive Type)๊ณผ ๊ฐ์ฒด ํƒ€์ž…(Object/Reference Type)์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ˆซ์ž ํƒ€์ž…(Number Type) C์–ธ์–ด..

eun-ng.tistory.com

let a = 'abc'; // ๋ณ€์ˆ˜ a์— ๋ฌธ์ž์—ด 'abc' ํ• ๋‹น
a = a + 'def'; // ๋ณ€์ˆ˜ a์— ๋ฌธ์ž์—ด 'def' ์ถ”๊ฐ€ ํ• ๋‹น
// ๊ธฐ์กด์˜ a๊ฐ’์ด 'abc' ์—์„œ 'abcdef'๋กœ ๋ณ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฌธ์ž์—ด 'abcdef' ์ƒˆ๋กœ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜๊ณ  ๊ทธ ์ฃผ์†Ÿ๊ฐ’์ด a์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
// ์ฆ‰ 'abc'์™€ 'abcdef'๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ์ž ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let b = 5; // ๋ณ€์ˆ˜ b์— ์ˆซ์ž 5 ํ• ๋‹น. ์ผ๋‹จ ์ปดํ“จํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ 5์˜ ๊ฐ’์„ ์ฐพ๊ณ , ์—†์œผ๋ฉด ๊ทธ์ œ์„œ์•ผ ์ƒˆ๋กœ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด ์ €์žฅ์‹œํ‚ต๋‹ˆ๋‹ค.
let c = 5; // ๋ณ€์ˆ˜ b์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆซ์ž 5๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํ“จํ„ฐ๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ์ˆซ์ž ๊ฐ’์„ ๋จผ์ € ์ฐพ๊ธฐ์— ๊ทธ ์ฃผ์†Ÿ๊ฐ’์„ ์žฌํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
b = 7;

์ปดํ“จํ„ฐ๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ง์ ‘ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ, ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ๋ณ€์ˆ˜์—” ๋ฌด์—‡์ด ์ €์žฅ๋ ๊นŒ์š”?
๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Ÿ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜์—” ์‹ค์ œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Ÿ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋˜ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ์ €์žฅ์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ์ง์ ‘ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๋˜์ง€ ์™œ ๊ท€์ฐฎ๊ฒŒ ๋‘ ๊ณผ์ •์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ €์žฅํ• ๊นŒ์š”?
๋ฐ์ดํ„ฐ ๋ณ€ํ™˜๊ณผ, ๋ฉ”๋ชจ๋ฆฌ์˜ ํšจ์œจ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์ œ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ปดํ“จํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’๋“ค์„ ์ €์žฅํ•ด์„œ ์Œ“์•„๋†“๋‹ค๊ฐ€ ๋ณ€์ˆ˜๊ฐ’์ด ๋ณ€ํ™˜๋˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด์ฃ .
๋˜ํ•œ ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ ๊ฐ’์ด '์ง์ ‘' ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์„ ์‚ญ์ œํ•œ ํ›„ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…๋“ค์ด ํ•„์š”ํ•˜๊ธฐ์— ์ปดํ“จํ„ฐ์—๊ฒŒ ๋” ๋ถ€๋‹ด์ด ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ๋ณ€์ˆ˜์— ์ฃผ์†Ÿ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€, ์ฆ‰ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? JavaScript๋Š” '๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(garbage collector)'๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์–ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋“ค์„ ์•Œ์•„์„œ ํฌ์ง‘ํ•ด์„œ ์‚ญ์ œํ•ด์ฃผ์–ด ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์ด ๋ณ€ํ•˜์ง€๋„ ์•Š๊ณ , ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…์„ ๋‹นํ•˜์ง€ ์•Š๋Š” ํ•œ ์‚ญ์ œ๋˜์ง€์•Š๋Š” ๊ฐ’์ด ๋ถˆ๋ณ€๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ฐ€๋ณ€๊ฐ’(mutable value)

๋ถˆ๋ณ€๊ฐ’๊ณผ ๋ฐ˜๋Œ€๋กœ ๊ฐ€๋ณ€๊ฐ’์€ ์›์‹œ ๋ฐ์ดํ„ฐ ํƒ€์ž…(Primitive Type)์ด ์•„๋‹Œ ์ฐธ์กฐ ํ…Œ์ดํ„ฐ ํƒ€์ž…(Reference Type)์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์›์‹œํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ €์žฅ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let obj1 = {
  a: 1,
  b: 'bbb'
};

obj1 ์€ Object ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” 1002 ์ฃผ์†Œ์˜ ๋ณ€์ˆ˜ ์˜์—ญ์— ์ €์žฅ๋˜๊ณ  ๋ฐ์ดํ„ฐ ์˜์—ญ์—๋Š” ์›์‹œํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ Object๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜(ํ”„๋กœํผํ‹ฐ)์˜ ๊ธธ์ด๋งŒํผ ํ”„๋กœํผํ‹ฐ ๋ณ€์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜์—ญ์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” ๋‹ค์‹œ ๊ฐ ๊ฐ’์„ ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์ฃผ์†Œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ–ˆ์„ ๋•Œ obj1 ์˜ ๋ฐ์ดํ„ฐ ์ฐธ์กฐ 5001 ๋ฒˆ์ง€์˜ ์ฃผ์†Œ๊ฐ’์€ ๋ถˆ๋ณ€ํ•˜์ง€๋งŒ ๊ฐ์ฒด ๋ณ€์ˆ˜์˜ a ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด๋‚˜ b ์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ์‹œ ๋ฐ์ดํ„ฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€ํ•˜๋‹คํ•ด์„œ ๊ฐ€๋ณ€๊ฐ’์ด๋ผ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋‹ค๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€, ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ(๊ฐ์ฒด์˜ ๋ณ€์ˆ˜)๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ, ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ๋ณต์‚ฌํ•œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„, ์›๋ณธ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ณต์‚ฌ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด๋˜์ง€ ์›๋ณธ ๊ฐ’์„ ๊ฑด๋“œ๋ฆฐ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ๋„ ์–ด๊ธ‹๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋•Œ '๋ถˆ๋ณ€ ๊ฐ์ฒด'๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

let user = {
  name: "Eun",
  gender: "male"
};

function changeName(user, newName) {
  let newUser = user;
  newUser.name = newName;
  return newUser;
}

let user2 = changeName(user, "Namgung");

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

console.log(user.name, user2.name); // Numgung, Namgung
console.log(user === user2); // true

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „, ๊ฐ์ฒด์˜ ๊ฐ€๋ณ€์„ฑ์œผ๋กœ ์ธํ•ด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ user ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  user ๊ฐ์ฒด์˜ name ํ”„๋กœํผํ‹ฐ๋ฅผ 'Namgung'์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ user2 ๋ณ€์ˆ˜์— ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ user, user2 ๋ณ€์ˆ˜ ๋ชจ๋‘ name ํ”„๋กœํผํ‹ฐ๊ฐ€ 'Namgung'์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์—์„œ๋Š” user์™€ user2๊ฐ€ ์„œ๋กœ ๋™์ผํ•˜๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ user2์™€ user๊ฐ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„, ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๋˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

let user = {
  name: "Eun",
  gender: "male"
};

function changeName(user, newName) {
  return {
    name: newName,
    gender: user.gender
  };
}

let user2 = changeName(user, "Namgung");

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

console.log(user.name, user2.name); // Eun Namgung
console.log(user === user2); // false

์ฒซ ๋ฒˆ์งธ๋Š” changeName ํ•จ์ˆ˜๊ฐ€ ์ •๋ง ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด, user์™€ user2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝ ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. changeName ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ธฐ์กด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(gender)๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ gender ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•˜๋‚˜ ์žˆ์–ด์„œ ์‰ฌ์› ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋งŽ์€ ๊ฐ์ฒด์˜€๋‹ค๋ฉด, ํ•˜๋“œ์ฝ”๋”ฉ์˜ ์–‘์ด ๋”์šฑ ๋งŽ์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋Œ€์ƒ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐœ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ํŽธ์ด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


let user = {
  name: "Eun",
  gender: "male"
};

function copyObject(target) {
  let result = {};
  for(let prop in target) {
    result[prop] = target[prop];
  }
  return result;
}

let user2 = copyObject(user);
user2.name = 'Namgung';

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

console.log(user.name, user2.name); // Eun Namgung
console.log(user === user2); // false

์œ„์—์„œ copyObject ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. copyObject ํ•จ์ˆ˜๋Š” for in ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด result ๊ฐ์ฒด์— target ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. copyObject ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
copyObject ํ•จ์ˆ˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹ ์ƒ์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ , getter/setter๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” ์ , ์–•์€ ๋ณต์‚ฌ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์—์„œ ์•„์‰ฝ์ง€๋งŒ, ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ๋ณด์™„ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋ฌด๊ฑฐ์›Œ์งˆ ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. user ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ผ๋‹จ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
copyObject ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ, ๊ฐ€์žฅ ์•„์‰ฌ์šด ์ ์€ ์ด ํ•จ์ˆ˜๋Š” '์–•์€ ๋ณต์‚ฌ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค'๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ๋Š” ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ทธ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ copyObject ํ•จ์ˆ˜๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. copyObject๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์›๋ณธ๊ณผ ์‚ฌ๋ณธ์ด ๋ชจ๋‘ ๋™์ผํ•œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์–•์€ ๋ณต์‚ฌ์— ๋Œ€ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const obj = { vaule: 1 }
const newObj = obj;

newObj.vaule = 2;

console.log(obj.vaule); // 2
console.log(obj === newObj); // true

obj ๋ณ€์ˆ˜์— object๋ฅผ ํ• ๋‹นํ•˜๊ณ , newObj ๋ณ€์ˆ˜์— obj ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  newObj ํ”„๋กœํผํ‹ฐ์ธ value ๊ฐ’์„ 2๋กœ ์„ค์ •ํ•˜๊ณ , obj.value๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋ฉด, 2๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด, ์–•์€ ๋ณต์‚ฌ ๋•Œ๋ฌธ์—, ์‚ฌ๋ณธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„, ๋™์ผํ•œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ์—, ์›๋ณธ์˜ ๋ฐ์ดํ„ฐ๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊นŠ์€ ๋ณต์‚ฌ

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊นŠ์€ ๋ณต์‚ฌ์— ๋Œ€ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let a = 1;
let b = a;

b = 2;

console.log(a); // 1
console.log(b); // 2
console.log(a === b); // false

๋งŒ์•ฝ ๋ณ€์ˆ˜ a์˜ ๊ฐ’์œผ๋กœ 1์„ ํ• ๋‹นํ•˜๊ณ , ๋ณ€์ˆ˜ b์— a๋ฅผ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜ b์— 2๋ฅผ ์žฌํ• ๋‹นํ•˜๊ณ , a์™€ b๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด, a๋Š” 1, b๋Š” 2๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์›์‹œ ํƒ€์ž…์€ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์›์‹œ ํƒ€์ž…์ด ์•„๋‹Œ, ๊ฐ์ฒด์—์„œ ๊นŠ์€ ๋ณต์‚ฌ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ค„์ง€๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ๊นŠ์€ ๋ณต์‚ฌ์—๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Reference

์ข‹์€ ์ฑ… ์จ์ฃผ์‹  ์ •์žฌ๋‚จ ๊ฐœ๋ฐœ์ž๋‹˜๊ป˜ ํ•ญ์ƒ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ..

๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!