Skip to content

๐Ÿ”ฃ Data Types โ€‹

01. ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜ โ€‹

plaintext
Primitive Type ๊ธฐ๋ณธํ˜•
โ”œโ”€โ”€ Number
โ”œโ”€โ”€ String
โ”œโ”€โ”€ Boolean
โ”œโ”€โ”€ null
โ”œโ”€โ”€ undefined
โ””โ”€โ”€ Symbol
plaintext
Reference Type ์ฐธ์กฐํ˜•
โ””โ”€โ”€ Object
    โ”œโ”€โ”€ Array
    โ”œโ”€โ”€ Function
    โ”œโ”€โ”€ RegExp(Regular Expression)
    โ”œโ”€โ”€ Set / WeakSet
    โ”œโ”€โ”€ Map / WeakMap
    โ””โ”€โ”€ ...

โ€ป ํ‘œ์‹œ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ES6(ECMAScript 2015)์—์„œ ๋„์ž…๋œ ๊ฒƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ธฐ๋ณธํ˜•์€ ์‹ค์ œ ๊ฐ’์„ ์ง์ ‘ ์ €์žฅ
  • ์ฐธ์กฐํ˜•์€ ๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(์ฐธ์กฐ)๋ฅผ ์ €์žฅ

์ด ์ฐจ์ด๋Š” ๋ณ€์ˆ˜ ๋ณต์‚ฌ, ๋น„๊ต ์—ฐ์‚ฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—์„œ ์ค‘์š”ํ•œ ์ฐจ์ด๋ฅผ ๋งŒ๋“ ๋‹ค.


Primitive Type vs Reference Type โ€‹

ํ•ญ๋ชฉPrimitive TypeReference Type
์ €์žฅ ๋ฐฉ์‹๊ฐ’ ์ž์ฒด๋ฅผ ์ €์žฅ์ฐธ์กฐ(์ฃผ์†Œ)๋ฅผ ์ €์žฅ
๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ ์œ„์น˜StackHeap (์ฐธ์กฐ๋Š” Stack์— ์ €์žฅ)
๋ณต์‚ฌ ์‹œ ๋™์ž‘๊ฐ’ ๋ณต์‚ฌ (๊นŠ์€ ๋ณต์‚ฌ)์ฐธ์กฐ ๋ณต์‚ฌ (์–•์€ ๋ณต์‚ฌ)
๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ๋ถˆ๋ณ€ (Immutable)๊ฐ€๋ณ€ (Mutable)
๋น„๊ต ๋ฐฉ์‹๊ฐ’ ์ž์ฒด๋ฅผ ๋น„๊ต (===)์ฃผ์†Œ(์ฐธ์กฐ๊ฐ’)๋ฅผ ๋น„๊ต (===)
typeof ๊ฒฐ๊ณผ ์˜ˆ์‹œ"number", "string" ๋“ฑ"object" ๋˜๋Š” "function"
๋Œ€ํ‘œ ์˜ˆ์‹œ42, "text", true, null{}, [], function() {}, new Map()
๐Ÿ’ก null์€ ์™œ typeof ๊ฒฐ๊ณผ๊ฐ€ "object"์ผ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ typeof null์€ "object"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ž˜๋œ ๋ฒ„๊ทธ๋กœ, null์€ ์‹ค์ œ๋กœ ๊ฐ์ฒด๊ฐ€ ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  object๋กœ ์ธ์‹ํ•œ๋‹ค.

js
typeof null === "object"; // true

์ด ๋ฒ„๊ทธ๋Š” ์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜์–ด ์žˆ์–ด์„œ ์ง€๊ธˆ๊นŒ์ง€๋„ ๊ณ ์ณ์ง€์ง€ ์•Š๊ณ  ์œ ์ง€๋˜๊ณ  ์žˆ๋‹ค.

js
const value = null;

value === null; // true

์ •ํ™•ํ•˜๊ฒŒ 'null'์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด typeof ๋Œ€์‹  === null ๋น„๊ต๋ฅผ ํ•˜๋Š” ๊ฒŒ ์ •ํ™•ํ•˜๋‹ค.


๐Ÿ“Ž The history of โ€œtypeof nullโ€


โš ๏ธ ๊ธฐ๋ณธํ˜•์€ ๋ถˆ๋ณ€ํ•˜๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ๋ณ€์ˆ˜์— ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
์™œ ๋ถˆ๋ณ€์ธ๋ฐ๋„ ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ?

js
let a = 10;
let b = a;

b = 20;

console.log(a); // 10
console.log(b); // 20

์ด ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๊ณ ,
๋ณ€์ˆ˜(์‹๋ณ„์ž)๊ฐ€ ๊ทธ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ•„์š”ํ•˜๋‹ค.

02. ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๊ด€ํ•œ ๋ฐฐ๊ฒฝ์ง€์‹ โ€‹

2-1. ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฐ์ดํ„ฐ โ€‹

์ปดํ“จํ„ฐ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ 0๊ณผ 1๋กœ ์ €์žฅํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด์ง„์ˆ˜์ธ ๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋น„ํŠธ๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์†Œ ๋‹จ์œ„์ธ ๋น„ํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ, ์—ฌ๋Ÿฌ ๋น„ํŠธ๋ฅผ ๋ฌถ์–ด ๋ฐ”์ดํŠธ๋ผ๋Š” ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 1๋ฐ”์ดํŠธ๋Š” 8๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, 256(2โธ)๊ฐœ์˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณผ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋”ฐ๋ผ์„œ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

less
 1bit (= 0 or 1)
  โ†“
| 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | โ† 1byte (=8 bits)
  • ๋น„ํŠธ (bit): 0 ๋˜๋Š” 1๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ์†Œ ๋‹จ์œ„
  • ๋ฐ”์ดํŠธ (byte): 1 ๋ฐ”์ดํŠธ๋Š” 8๊ฐœ์˜ ๋น„ํŠธ๋กœ ๊ตฌ์„ฑ

๐Ÿ’ก

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ number ํƒ€์ž…์€ 64๋น„ํŠธ(8๋ฐ”์ดํŠธ)๋ฅผ ํ™•๋ณดํ•œ๋‹ค.


2-2. ์‹๋ณ„์ž์™€ ๋ณ€์ˆ˜ โ€‹

js
// age๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— 30 ์ด๋ผ๋Š” ๊ฐ’์„ ์ €์žฅ
let age = 30;
  • ๋ณ€์ˆ˜ variable: ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ(์ˆซ์ž, ๋ฌธ์ž์—ด, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ)๊ฐ€ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„(๋ฉ”๋ชจ๋ฆฌ)

  • ์‹๋ณ„์ž identifier: ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„, ๋ณ€์ˆ˜๋ช…

03. ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋ฐ์ดํ„ฐ ํ• ๋‹น โ€‹

3-1. ๋ณ€์ˆ˜ ์„ ์–ธ โ€‹

js
var a;
  • a๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • ์„ ์–ธ ์‹œ์—๋Š” ์•„์ง ์–ด๋–ค ๊ฐ’๋„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— undefined๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • ๋‚˜์ค‘์— ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

1-3

var a; ๋ณ€์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”

  • โ‘  ์ปดํ“จํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์„(@1003)๋ฅผ ํ™•๋ณดํ•œ๋‹ค.
  • โ‘ก ํ™•๋ณดํ•œ ๊ณต๊ฐ„์˜ ์‹๋ณ„์ž๋ฅผ a๋ผ๊ณ  ์ง€์ •ํ•œ๋‹ค.

์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ a์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋ฉด ์ปดํ“จํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ 'a๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ฃผ์†Œ'๋ฅผ ๊ฒ€์ƒ‰ํ•ด 'ํ•ด๋‹น ๊ณต๊ฐ„์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ'๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


3-2. ๋ฐ์ดํ„ฐ ํ• ๋‹น โ€‹

js
// ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋ถ„๋ฆฌํ•œ ๊ฒฝ์šฐ
var a;
a = "abc";

// ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ํ•œ ๊ฒฝ์šฐ
var a = "abc";

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


1-4

๋ฐ์ดํ„ฐ ํ• ๋‹น์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”

  • โ‘  ๋ณ€์ˆ˜ ์˜์—ญ์˜ ๋นˆ ๊ณต๊ฐ„ @1003์„ ํ™•๋ณดํ•œ๋‹ค.
  • โ‘ก ํ•ด๋‹น ๊ณต๊ฐ„์˜ ์‹๋ณ„์ž๋ฅผ a๋ผ๊ณ  ์ง€์ •ํ•œ๋‹ค.
  • โ‘ข ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๋นˆ ๊ณต๊ฐ„ @5004์— ๋ฌธ์ž์—ด 'abc'๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • โ‘ฃ ๋ณ€์ˆ˜ ์˜์—ญ์—์„œ a ์‹๋ณ„์ž๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  • โ‘ค ์•ž์„œ ์ €์žฅํ•œ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ @5004๋ฅผ @1003์˜ ๊ณต๊ฐ„์— ๋Œ€์ž…ํ•œ๋‹ค.

โš ๏ธ ๊ฐ’์„ ๋ณ€์ˆ˜ ์˜์—ญ์— ์ง์ ‘ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ์ด์œ  โ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜ ๊ณต๊ฐ„์— ์ง์ ‘ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ด๋‹ค.

js
var a = "abc";
a = a + "defg";
console.log(a); // abcdefg

์œ„์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋” ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ•„์š” โ†’ ์ƒˆ ๊ณต๊ฐ„ ํ™•๋ณด โ†’ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์ด ๋ฐ˜๋ณต๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋‚˜๋ˆ„์–ด ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ž์œ ๋กญ๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.


1-5

๋ฌธ์ž์—ด ๋ณ€ํ™˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”

  • ๊ธฐ์กด ๋ฌธ์ž์—ด 'abc'๋Š” ์ฃผ์†Œ @5004์— ์ €์žฅ๋˜์–ด ์žˆ์—ˆ์ง€๋งŒ, 'abcdefg'๋Š” ๊ธฐ์กด ๊ณต๊ฐ„์— ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ƒˆ๋กญ๊ฒŒ ํ™•๋ณด๋œ @5005์— ์ €์žฅ๋œ๋‹ค.
  • ๋ณ€์ˆ˜ a๋Š” ๊ธฐ์กด์— ์ฐธ์กฐํ•˜๋˜ @5004 ๋Œ€์‹ , @5005๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” @5004๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)์— ์˜ํ•ด ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋‹ค.

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

4-1. ๋ถˆ๋ณ€๊ฐ’ โ€‹

๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜์˜ ์ฐจ์ด์ ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์— ์žˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์˜ ๋Œ€์ƒ์€ ๋ณ€์ˆ˜ ์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค.

  • ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ณ€์ˆ˜
  • ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉด ์ƒ์ˆ˜

๋ถˆ๋ณ€์„ฑ ์—ฌ๋ถ€๋ฅผ ๊ตฌ๋ถ„ํ•  ๋•Œ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๋Œ€์ƒ์€ ๋ฐ์ดํ„ฐ ์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค.

๊ตฌ๋ถ„๊ธฐ์ค€์ด ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ค๋ช…
๋ณ€์ˆ˜/์ƒ์ˆ˜๋ณ€์ˆ˜ ์˜์—ญ (Variable Memory)๋ณ€์ˆ˜ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋‹ค์‹œ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€
๋ถˆ๋ณ€๊ฐ’๋ฐ์ดํ„ฐ ์˜์—ญ (Data Memory)๊ฐ’ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋ถˆ๋ณ€๊ฐ’ โ€‹

js
var a = "abc";
a = a + "def";

var b = 5;
var c = 5;
b = 7;

1-6


  • b = 7์€ ๋ณ€์ˆ˜ b์— ์ €์žฅ๋œ ๊ฐ’ '5'๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๊ฐ’ '7'์„ ๋ณ€์ˆ˜์— ๋‹ค์‹œ ํ• ๋‹นํ•˜๋Š” ๋™์ž‘์ด๋‹ค. ์ฆ‰, ๊ธฐ์กด์˜ 5๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • 'abc'์— 'def'๋ฅผ ๋”ํ•ด๋„ 'abc' ๋ฌธ์ž์—ด์€ ๊ทธ๋Œ€๋กœ ๋‚จ๊ณ , 'abcdef'๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ์ˆซ์ž, ๋ฌธ์ž์—ด์€ ์ง์ ‘ ์ˆ˜์ •๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ค์–ด ๊ธฐ์กด ๊ฐ’์„ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
  • ์ฆ‰, ๊ฐ’์˜ ๋ณ€๊ฒฝ์€ ํ•ญ์ƒ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ด๋ค„์ง€๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ถˆ๋ณ€๊ฐ’์˜ ๋ณธ์งˆ์ด๋‹ค.

๋ถˆ๋ณ€๊ฐ’์˜ ํŠน์ง• โ€‹

  • ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ’๋งŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ œ๊ฑฐ๋œ๋‹ค.
  • ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์œ ์ง€๋˜๋ฉฐ, ์ฐธ์กฐ๊ฐ€ ๋Š๊ธฐ๊ธฐ ์ „๊นŒ์ง€๋Š” ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

4-2. ๊ฐ€๋ณ€๊ฐ’ โ€‹

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด ์ž์ฒด๋Š” ๋ถˆ๋ณ€๊ฐ’์ด์ง€๋งŒ, ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ์ฐธ์กฐ๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€๋ณ€๊ฐ’์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.


์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํ• ๋‹น ๊ณผ์ • โ€‹

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ณ€์ˆ˜ ์˜์—ญ์„ ์‚ฌ์šฉํ•œ๋‹ค.
๊ฐ์ฒด ์ž์ฒด๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋˜๋ฉฐ, ๋‚ด๋ถ€ ๊ฐ’๋“ค์€ ๋ชจ๋‘ ๋ถˆ๋ณ€๊ฐ’์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ณ€์ˆ˜๋Š” ์–ธ์ œ๋“  ๋‹ค๋ฅธ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด, ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๋‹ค โ†’ ๊ฐ€๋ณ€๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค.

js
var obj1 = {
  a: 1,
  b: "bbb",
};

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ํ• ๋‹น


  • โ‘  ๋ณ€์ˆ˜ obj1๋Š” ๋ณ€์ˆ˜ ์˜์—ญ @1002์— ์„ ์–ธ, ํ• ๋‹น๋œ ๊ฐ์ฒด ์ „์ฒด๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ @5001์— ์ €์žฅํ•œ๋‹ค.
  • โ‘ก ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(a, b)๋Š” ๊ฐ์ฒด ์ „์šฉ ๋ณ€์ˆ˜ ์˜์—ญ @7103~์— ๋”ฐ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ณ„๋„ ๋ณ€์ˆ˜ ํ…Œ์ด๋ธ”์ด๋‹ค.
  • โ‘ข ๊ฐ ๊ฐ’ 1, "bbb"๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ @5003, @5004์— ์ €์žฅ๋œ๋‹ค.
  • โ‘ฃ ๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜ @7103, @7104์—์„œ ์ด ๊ฐ’์„ ์ฐธ์กฐ(์—ฐ๊ฒฐ)ํ•œ๋‹ค.

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ํ”„๋กœํผํ‹ฐ ์žฌํ• ๋‹น โ€‹

js
var obj1 = {
  a: 1,
  b: "bbb",
};

obj1.a = 2;

์ฐธ์กฐํ˜•๋ฐ์ดํ„ฐ์˜ํ”„๋กœํผํ‹ฐ์žฌํ• ๋‹น


  • โ‘  ๋ฐ์ดํ„ฐ ์˜์—ญ์— @5005์— 2๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด ์ฃผ์†Œ๋ฅผ @7103์— ์ €์žฅํ•œ๋‹ค.
  • ๋ณ€์ˆ˜ obj๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ์ฃผ์†Œ๋Š” @5001๋กœ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’๋งŒ ๋ฐ”๋€ ๊ฒƒ์ด๋‹ค.

์ค‘์ฒฉ๋œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์˜ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น โ€‹

js
var obj = {
  x: 3,
  arr: [3, 4, 5],
};

์ค‘์ฒฉ๋œ์ฐธ์กฐํ˜•๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์˜ํ”„๋กœํผํ‹ฐํ• ๋‹น

  • โ‘  ๋ณ€์ˆ˜ obj๋Š” ๋ณ€์ˆ˜ ์˜์—ญ @1002์— ์„ ์–ธ, ํ• ๋‹น๋œ ๊ฐ์ฒด ์ „์ฒด๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ @5001์— ์ €์žฅํ•œ๋‹ค.
  • โ‘ก ๊ฐ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ์ „์šฉ ๋ณ€์ˆ˜ ์˜์—ญ @7103~์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ฃผ์†Œ๋ฅผ @5001์— ์ €์žฅํ•œ๋‹ค.
  • โ‘ข @7104์— ์ €์žฅํ•œ ๋ฐฐ์—ด ์—ญ์‹œ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ณ€์ˆ˜ ์˜์—ญ @8104~์„ ์ƒ์„ฑํ•œ๋‹ค.
  • โ‘ฃ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ 3๊ฐœ ์ด๋ฏ€๋กœ 3๊ฐœ์˜ ๋ณ€์ˆ˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๊ฐ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.(0, 1, 2)
๐Ÿ’ก obj.arr[1]์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?
  1. obj ๊ฒ€์ƒ‰
  • obj๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค. @1002
  • ๊ฐ’์ด ์ฃผ์†Œ์ด๋ฏ€๋กœ ๊ทธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. @5001
  • ๊ฐ’์ด ์ฃผ์†Œ์ด๋ฏ€๋กœ ๊ทธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. @7103 ~

  1. obj.arr ๊ฒ€์ƒ‰
  • arr์ด๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค. @7104
  • ๊ฐ’์ด ์ฃผ์†Œ์ด๋ฏ€๋กœ ๊ทธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. @5003
  • ๊ฐ’์ด ์ฃผ์†Œ์ด๋ฏ€๋กœ ๊ทธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. @8104 ~

  1. obj.arr[1] ๊ฒ€์ƒ‰
  • ์ธ๋ฑ์Šค 1์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค. @8105
  • ๊ฐ’์ด ์ฃผ์†Œ์ด๋ฏ€๋กœ ๊ทธ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. @5004
  • ๊ฐ’์ด ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ 4๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ค‘์ฒฉ๋œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์˜ ํ”„๋กœํผํ‹ฐ ์žฌํ• ๋‹น โ€‹

js
var obj = {
  x: 3,
  arr: [3, 4, 5],
};

obj.arr = "str";

์ค‘์ฒฉ๋œ์ฐธ์กฐํ˜•๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์˜ํ”„๋กœํผํ‹ฐ์žฌํ• ๋‹น

  • @5006์— ๋ฌธ์ž์—ด 'str'์„ ์ €์žฅํ•˜๊ณ , ๊ทธ ์ฃผ์†Œ๋ฅผ @7104์— ์ €์žฅํ•œ๋‹ค.
  • @5003์€ ๋”์ด์ƒ ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†๊ฒŒ๋œ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐธ์กฐ ์นด์šดํŠธ๋ผ๊ณ  ํ•œ๋‹ค. @5003์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋Š” 1์—์„œ @7104์— @5006์ด ์ €์žฅ๋˜๋Š” ์ˆœ๊ฐ„ 0์ด ๋œ๋‹ค.
  • ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜๊ฑฐ ๋Œ€์ƒ์ด ๋œ๋‹ค.
  • @5003์— ๋‹ด๊ฒจ ์žˆ๋˜ ๋ฐ์ดํ„ฐ @8104~ ๊ฐ’๋„ ์‚ฌ๋ผ์ง€๊ณ , ์—ฐ์‡„์ ์œผ๋กœ @8104~์˜ ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋„ 0์ด ๋˜๊ณ  ์ด๋˜ํ•œ GC์˜ ๋Œ€์ƒ์ด ๋˜์–ด ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.

๐Ÿ—‘๏ธ Garbage Collector

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ํŠน์ • ์‹œ์ ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌํ™”์ƒํƒœ์— ์ž„๋ฐ•ํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ˆ˜๊ฑฐ ๋Œ€์ƒ๋“ค์„ ์ˆ˜๊ฑฐํ•œ๋‹ค.
์ˆ˜๊ฑฐ๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ ๊ณต๊ฐ„์ด ๋œ๋‹ค.

๐Ÿ’ก ๊ฐ€๋ณ€๊ฐ’์˜ ํ•ต์‹ฌ

๊ฐ์ฒด ๋‚ด๋ถ€ ๊ฐ’์€ ๋ถˆ๋ณ€์ด์ง€๋งŒ, ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์–ธ์ œ๋“  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


4-3 ๋ณ€์ˆ˜ ๋ณต์‚ฌ ๋น„๊ต โ€‹

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜ ๋ณต์‚ฌ ๋น„๊ต

js
var a = 10;
var b = a;

var obj1 = { c: 10, d: "ddd" };
var obj2 = obj1;

05. ๋ถˆ๋ณ€ ๊ฐ์ฒด โ€‹

๋ถˆ๋ณ€ ๊ฐ์ฒด(Immutable Object)๋ž€, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ทธ ์ƒํƒœ(state)๊ฐ€ ์ ˆ๋Œ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.

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

๐Ÿ’ก ๋ถˆ๋ณ€ ๊ฐ์ฒด ์›์น™

ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” ์ ˆ๋Œ€ ๋ฐ”๋€Œ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
๋Œ€์‹ , ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์›๋ณธ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  โ€˜๋ณต์‚ฌ๋ณธโ€™์„ ๋งŒ๋“ค์–ด ์ž‘์—…ํ•œ๋‹ค.

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

๐Ÿ’ก ์™œ ์ค‘์š”ํ• ๊นŒ?

โœ… ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

โœ… ํ˜‘์—…์— ์•ˆ์ „

๊ณต์œ ๋œ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ๊ณณ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

โœ… ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ์—ฐ๊ณ„

React๋‚˜ Redux์ฒ˜๋Ÿผ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด ์›์น™์ด ํ•„์ˆ˜์ด๋‹ค.

  • React: ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•จ (useState, setState)
  • Redux: ์ƒํƒœ๋ฅผ ์ ˆ๋Œ€๋กœ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๋ฆฌ๋“€์„œ๋ฅผ ํ†ตํ•ด ์ƒˆ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜
  • Immer: ๋‚ด๋ถ€์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํŽธํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

5-1. ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• โ€‹

๐Ÿšจ ๊ฐ์ฒด์˜ ๊ฐ€๋ณ€์„ฑ์— ๋”ฐ๋ฅธ ๋ฌธ์ œ์  โ€‹

js
var user = {
  name: "Jaenam",
  gender: "male",
};

var changeName = function (user, newName) {
  var newUser = user; // ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐ
  newUser.name = newName; // ๊ธฐ์กด ๊ฐ์ฒด์˜ name์ด ๋ณ€๊ฒฝ
  return newUser;
};

var user2 = changeName(user, "Jung");

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}
console.log(user.name, user2.name); // Jung Jung
console.log(user === user2); // true
  • user์™€ user2๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋‚ด๋ถ€ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ์›๋ณธ ๊ฐ์ฒด๊นŒ์ง€ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • changeName() ํ•จ์ˆ˜๋Š” ๋งˆ์น˜ ์ƒˆ๋กœ์šด ์œ ์ € ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ธฐ์กด ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ณต์‚ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ๋‚ด ๋ณ€๊ฒฝ์ด ์™ธ๋ถ€ ๊ฐ์ฒด์ธ user๊นŒ์ง€ ์˜ํ–ฅ์„ ์ค€๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ๊ฐ์ฒด์˜ ๊ฐ€๋ณ€์„ฑ์— ๋”ฐ๋ฅธ ๋ฌธ์ œ์ ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• โ€‹

js
var user = {
  name: "Jaenam",
  gender: "male",
};

var changeName = function (user, newName) {
  return {
    name: newName, // name๋งŒ ์ƒˆ ๊ฐ’์œผ๋กœ
    gender: user.gender, // gender๋Š” ๊ธฐ์กด ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ
  };
};

var user2 = changeName(user, "Jung");

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
}
console.log(user.name, user2.name); // Jaenam Jung
console.log(user === user2); // false
  • changeName() ํ•จ์ˆ˜๋Š” ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋“ฏ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๋‹จ, name์€ newName์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , gender: user.gender๋Š” ๊ธฐ์กด ๊ฐ’์„ ์–•์€ ๋ณต์‚ฌ ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์™€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • user, user2๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. user2๋งŒ ๋ฐ”๋€Œ์—ˆ๊ณ , user๋Š” ์›๋ž˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

๊ธฐ์กด ์ •๋ณด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(์–•์€ ๋ณต์‚ฌ) โ€‹

js
var copyObject = function (target) {
  var result = {};
  for (var prop in target) {
    result[prop] = target[prop];
  }
  return result;
};
  • result๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • for-in ๋ฌธ์œผ๋กœ target ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ(prop)์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ, ๊ฐ ์†์„ฑ์˜ ๊ฐ’์„ result์— ๋ณต์‚ฌํ•œ๋‹ค.

๐Ÿ’ก ์™œ ์ด๋ ‡๊ฒŒ copyObject() ๋ณต์‚ฌ ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊นŒ?

  • ์†์„ฑ์ด ๋งŽ์„ ๊ฒฝ์šฐ ์ง์ ‘ { a: x, b: y, c: z }์ฒ˜๋Ÿผ ์ผ์ผ์ด ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์–ด๋–ค ๊ฐ์ฒด๋“  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

copyObject๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ๋ณต์‚ฌ โ€‹

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

var user = {
  name: "Jaenam",
  gender: "male",
};

var user2 = copyObject(user);
user2.name = "Jung"; // ๋ณต์‚ฌ๋ณธ๋งŒ ์ˆ˜์ •

if (user !== user2) {
  console.log("์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
}
console.log(user.name, user2.name); // Jaenam Jung
console.log(user === user2); // false
๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”๋ณด๊ธฐ

copyObject๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ๋ณต์‚ฌ

  • ํ˜‘์—… ์‹œ user ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ๋Š” copyObject() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ•˜๊ณ  ๊ทธ ๊ทœ์น™์„ ์ง€ํ‚จ๋‹ค๋ฉด user ๊ฐ์ฒด๊ฐ€ ๊ณง ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • copyObject()๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ์ค‘์ฒฉ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

5-2. ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ โ€‹

  • ์–•์€ ๋ณต์‚ฌ(shallow copy): ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๊นŠ์€ ๋ณต์‚ฌ(deep copy): ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ค‘์ฒฉ๋œ ๊ฐ’๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์ค‘์ฒฉ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์–•์€ ๋ณต์‚ฌ โ€‹

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

var user = {
  name: "Jaenam",
  urls: {
    portfolio: "http://github.com/abc",
    blog: "http://blog.com",
    facebook: "http://facebook.com/abc",
  },
};
var user2 = copyObject(user);

user2.name = "Jung";
console.log(user.name === user2.name); // false

user.urls.portfolio = "http://portfolio.com";
console.log(user.urls.portfolio === user2.urls.portfolio); // true

user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); // true
๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”๋ณด๊ธฐ

์ค‘์ฒฉ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์–•์€ ๋ณต์‚ฌ

  • ์–•์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ์ตœ์ƒ์œ„ ํ”„๋กœํผํ‹ฐ๋งŒ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, user ๊ฐ์ฒด์— ์ง์ ‘ ์†ํ•œ ํ”„๋กœํผํ‹ฐ์ธ name์€ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ๋œ๋‹ค.
  • ๋ฐ˜๋ฉด, ์ค‘์ฒฉ ๊ฐ์ฒด์ธ urls๋Š” ์ฃผ์†Œ(์ฐธ์กฐ๊ฐ’)๋งŒ ๋ณต์‚ฌ๋˜์–ด user์™€ user2๊ฐ€ ๊ฐ™์€ urls ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ urls ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋“ค์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ , ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

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


์ค‘์ฒฉ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊นŠ์€ ๋ณต์‚ฌ โ€‹

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

var user = {
  name: "Jaenam",
  urls: {
    portfolio: "http://github.com/abc",
    blog: "http://blog.com",
    facebook: "http://facebook.com/abc",
  },
};

var user2 = copyObject(user);
user2.urls = copyObject(user.urls);

user.urls.portfolio = "http://portfolio.com";
console.log(user.urls.portfolio === user2.urls.portfolio); // false

user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); // false
๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ณ€ํ™”๋ณด๊ธฐ

์ค‘์ฒฉ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊นŠ์€ ๋ณต์‚ฌ

  • user2 = copyObject(user) โ†’ user์˜ 1๋‹จ๊ณ„ ํ”„๋กœํผํ‹ฐ(name, urls)๋งŒ ์–•๊ฒŒ ๋ณต์‚ฌํ•œ๋‹ค.
  • user2.urls = copyObject(user.urls)โ†’ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ค‘ ๊ฐ’์ด ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์ธ ๊ฒฝ์šฐ ๋‹ค์‹œ ๊ทธ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋“ค๋„ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ user.urls์™€ user2.urls๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜์–ด, ์ดํ›„ ๊ฐ๊ฐ์˜ ๋ณ€๊ฒฝ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ๋„ ์‚ฌ๋ผ์ง„๋‹ค.

๐Ÿ“Œ ์š”์•ฝ

์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ๋Š” ์ฐธ์กฐํ˜• ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด์„œ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•ด ์ฃผ์–ด์•ผ, ์›๋ณธ๊ณผ ๋ณต์‚ฌ๋ณธ์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ” ์žฌ๊ท€(Recursion)๋ž€?

"์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋™์ž‘ ๋ฐฉ์‹"์„ ์˜๋ฏธํ•œ๋‹ค. ์žฌ๊ท€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋‚˜ ์ค‘์ฒฉ๋œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.


๊ฐ์ฒด ๋ณต์‚ฌ์— ์“ฐ์ด๋Š” ์žฌ๊ท€

js
var user = {
  name: "Hyebin",
  urls: {
    blog: "http://blog.com",
    github: {
      main: "http://github.com",
    },
  },
};

์œ„์ฒ˜๋Ÿผ ๊ฐ์ฒด ์•ˆ์— ๋˜ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ์ค‘์ฒฉ ๊ตฌ์กฐ์—์„œ๋Š”, ์–•์€ ๋ณต์‚ฌ๋กœ๋Š” ๋‚ด๋ถ€๊นŒ์ง€ ๋ชจ๋‘ ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— "๊นŠ์€ ๋ณต์‚ฌ"๋ฅผ ํ•˜๋ ค๋ฉด ์ด ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋ฅผ ์ „๋ถ€ ํ•˜๋‚˜ํ•˜๋‚˜ ๋”ฐ๋ผ ๋“ค์–ด๊ฐ€์„œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์žฌ๊ท€(recursion)์ด๋‹ค.


์žฌ๊ท€ ํ•จ์ˆ˜์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ (์ข…๋ฃŒ ์กฐ๊ฑด์ด ๊ผญ ํ•„์š”ํ•จ)
์žฌ๊ท€์  ๋ณต์‚ฌ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ

๊ฐ์ฒด์˜ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฒ”์šฉ ํ•จ์ˆ˜ โ€‹

js
var copyObjectDeep = function (target) {
  var result = {};
  if (typeof target === "object" && target !== null) {
    for (var prop in target) {
      result[prop] = copyObjectDeep(target[prop]);
    }
  } else {
    result = target;
  }
  return result;
};
  • copyObjectDeep()๋Š” ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜์ด๋‹ค.
  • typeof target === "object" && target !== null ์กฐ๊ฑด์„ ํ†ตํ•ด null์€ ์ œ์™ธํ•˜๊ณ  ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ๋ณต์‚ฌ ๋Œ€์ƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • for-in ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ, ๊ทธ ๊ฐ’์— ๋Œ€ํ•ด ๋‹ค์‹œ copyObjectDeep()์„์„ ํ˜ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€์— ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  • ๋ณต์‚ฌ ๋Œ€์ƒ์ด ์›์‹œ๊ฐ’์ผ ๊ฒฝ์šฐ์—๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์—†์ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋œ๋‹ค.
js
// ๊นŠ์€ ๋ณต์‚ฌ ๊ฒฐ๊ณผ ํ™•์ธ
var obj = {
  a: 1,
  b: {
    c: null,
    d: [1, 2],
  },
};
var obj2 = copyObjectDeep(obj);

obj2.a = 3;
obj2.b.c = 4;
obj.b.d[1] = 3;

console.log(obj); // { a: 1. b: { c: null, d: [1, 3] } }
console.log(obj2); // { a: 3. b: { c: 4, d: { 0: 1, 1: 2 } } }

JSON์„ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ ๊นŠ์€ ๋ณต์‚ฌ โ€‹

JSON.stringify() JSON.parse()

js
var copyObjectViaJSON = function (target) {
  return JSON.parse(JSON.stringify(target));
};

var obj = {
  a: 1,
  b: {
    c: null,
    d: [1, 2],
    func1: function () {
      console.log(3);
    },
  },
  func2: function () {
    console.log(4);
  },
};

var obj2 = copyObjectViaJSON(obj);

obj2.a = 3;
obj2.b.c = 4;
obj.b.d[1] = 3;

console.log(obj); // { a: 1. b: { c: null, d: [1, 3], func1: f() }, func2: f() }
console.log(obj2); // { a: 3. b: { c: 4,    d: [1, 2] } }
  • copyObjectViaJSON() ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • JSON.stringify(target)์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•œ ๋’ค, JSON.parse()๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ๊ฐ์ฒด์˜ ์ค‘์ฒฉ ๊ตฌ์กฐ๋Š” ์ „๋ถ€ ๋ฌธ์ž์—ด๋กœ ํ’€์–ด์กŒ๋‹ค๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์žฌ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ, ์›๋ณธ ๊ฐ์ฒด์™€๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

โš ๏ธ ์ฃผ์˜ํ•  ์ 

JSON.stringify()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค์„ ์ง๋ ฌํ™”ํ•˜์ง€ ๋ชปํ•œ๋‹ค:

  • function, undefined, Symbol, Date, Map, Set, ์ˆœํ™˜ ์ฐธ์กฐ ๋“ฑ
  • ์œ„ ์˜ˆ์ œ์—์„œ๋„ func1, func2๋Š” obj2์— ํฌํ•จ๋˜์ง€ ์•Š๊ณ  ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜๊ณ  ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

๐ŸŽฏ Tip

๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋ณต์žกํ•œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ค์ˆ˜๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์Šต๊ด€์ด๋‹ค.

โ€œ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ๋ง๊ณ , ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.โ€ ์ด ์›์น™๋งŒ ๊ธฐ์–ตํ•ด๋„ ๋งŽ์€ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฐธ๊ณ  ์ถœ์ฒ˜: ใ€Ž์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธใ€, ์œ„ํ‚ค๋ถ์Šค ์˜ˆ์ œ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ โ€‹

plaintext
JavaScript Memory
โ”œโ”€โ”€ Stack Memory
โ”‚   โ”œโ”€โ”€ ๋ณ€์ˆ˜
โ”‚   โ”œโ”€โ”€ Primitive Type: ๊ฐ’ ์ž์ฒด ์ €์žฅ
โ”‚   โ””โ”€โ”€ ์ •์  ํ• ๋‹น: ์‹คํ–‰ ์‹œ ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
โ””โ”€โ”€ Heap Memory
    โ”œโ”€โ”€ Reference Type: ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฐธ์กฐ
    โ””โ”€โ”€ ๋™์  ํ• ๋‹น: ๋Ÿฐํƒ€์ž„ ์ค‘ ํ•„์š”์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด
  • ๊ธฐ๋ณธํ˜•์€ Stack์— ๊ฐ’ ์ž์ฒด๊ฐ€ ์ €์žฅ๋˜๊ณ , ์ฐธ์กฐํ˜•์€ Heap์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  Stack์—” ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • Stack์€ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ๊ณต๊ฐ„์ด ์ œํ•œ์ ์ด๊ณ , Heap์€ ์œ ์—ฐํ•˜์ง€๋งŒ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.
  • ์ด ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    : ๊ธฐ๋ณธํ˜•์€ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ๋‹ค.
    : ์ฐธ์กฐํ˜•์€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ๋ณต์‚ฌํ•ด๋„ ํ•จ๊ป˜ ๋ฐ”๋€๋‹ค.
    : ์ฐธ์กฐํ˜•์€ Heap์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  Stack์—๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ณผ์ •์—์„œ ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ๊ฑฐ์นœ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ธฐ๋ณธํ˜•์€ ์ง์ ‘ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ๋ฐ˜๋ฉด, ์ฐธ์กฐํ˜•์€ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

๊ธฐ๋ณธํ˜•์€ ์™œ ๋ณ€์ˆ˜ ๊ฐ„ ์˜ํ–ฅ์ด ์—†์„๊นŒ? (Stack์— ๊ฐ’ ์ž์ฒด ์ €์žฅ) โ€‹

js
let a = 10;
let b = a;
b = 20;
less
Stack
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ a = 10     โ”‚ โ† ๊ฐ’ ์ž์ฒด ์ €์žฅ
โ”‚ b = 10     โ”‚ โ† a์˜ ๊ฐ’์„ ๋ณต์‚ฌ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

b ๊ฐ’์„ 20์œผ๋กœ ๋ฐ”๊พธ๋ฉด,
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ a = 10     โ”‚
โ”‚ b = 20     โ”‚ โ† b๋งŒ ๋ฐ”๋€œ (a๋Š” ์˜ํ–ฅ ์—†์Œ)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ๊ธฐ๋ณธํ˜•์€ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ €์žฅํ•˜๋ฏ€๋กœ ๋ณ€์ˆ˜ ๊ฐ„ ๋…๋ฆฝ์ ์ด๋‹ค.

์ฐธ์กฐํ˜•์€ ์™œ ๊ฐ™์ด ๋ฐ”๋€”๊นŒ? (Heap์— ๊ฐ์ฒด ์ €์žฅ, ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌ๋จ) โ€‹

js
let obj1 = { name: "Binny" };
let obj2 = obj1;
obj2.name = "Hoon";
css
Stack
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ obj1 โ”€โ”                     โ”‚
โ”‚ obj2 โ”€โ”˜                     โ”‚ โ† ๋‘ ๋ณ€์ˆ˜๋Š” ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ†“
Heap
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ { name: "Hoon" }            โ”‚ โ† ์‹ค์ œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ์ฐธ์กฐํ˜•์€ Heap์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  Stack์—” ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • obj1๊ณผ obj2๋Š” Stack์— ๊ฐ๊ฐ ์กด์žฌํ•˜์ง€๋งŒ, ๊ฐ™์€ Heap ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ณ€์ˆ˜ ๊ฐ„ ๋ณต์‚ฌ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฃผ์†Œ ๋ณต์‚ฌ์ด๋ฏ€๋กœ, ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ค‘์ฒฉ ๊ฐ์ฒด - ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ฐฐ์—ด๋„ ์ฐธ์กฐํ˜• โ€‹

js
let user1 = {
  name: "Binny",
  hobbies: ["reading", "coding"],
};

user1.hobbies.push("traveling");
less
Stack
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         user1                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ†“                             โ†“
Heap                          ๋˜ ๋‹ค๋ฅธ Heap
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  name: "Binny"        โ”‚    โ”‚ ["reading", "coding",    โ”‚
โ”‚  hobbies โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ–ถโ”‚  "traveling"]            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • user1์€ Heap์— ์ €์žฅ๋œ ๊ฐ์ฒด์ด๊ณ , Stack์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋งŒ ์ €์žฅ๋œ๋‹ค.
  • ๊ฐ์ฒด ๋‚ด๋ถ€์˜ hobbies๋Š” ๋ฐฐ์—ด(์ฐธ์กฐํ˜•)์ด๋ฏ€๋กœ, Heap์˜ ๋˜ ๋‹ค๋ฅธ ๊ณต๊ฐ„์— ๋ณ„๋„๋กœ ์ €์žฅ๋œ๋‹ค.
  • user1.hobbies.push("traveling")์„ ์‹คํ–‰ํ•˜๋ฉด, Heap์— ์žˆ๋Š” ๋ฐฐ์—ด ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ์ฆ‰, ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ฐธ์กฐํ˜• ํ”„๋กœํผํ‹ฐ๋„ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ ‘๊ทผ๋˜๊ณ  ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection), ์ฐธ์กฐ ์นด์šดํŠธ(Reference Count) โ€‹

js
let num = {
  x: 10,
  y: [3, 4],
};

num.y = "string";
less
Stack
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          num                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ†“                             โ†“
Heap                          ๋˜ ๋‹ค๋ฅธ Heap
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  x: 10                โ”‚    โ”‚                          โ”‚
โ”‚  y โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ–ถโ”‚ [3, 4]                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


num.y = "string";


Stack
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          num                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ†“
Heap
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  x: 10                โ”‚
โ”‚  y: "string"          โ”‚      [3, 4]: ์ฐธ์กฐ ์นด์šดํŠธ 0
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ†’ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ •๋ฆฌ
  • ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ์ฐธ์กฐ๊ฐ€ ๋Š๊ธฐ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ์ด๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์›๋ฆฌ ์ค‘ ํ•˜๋‚˜๋‹ค.
  • ์•„๋ฌด๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š์œผ๋ฉด โ†’ ์ฐธ์กฐ ์นด์šดํŠธ 0 โ†’ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•ด์ค€๋‹ค.

Primitive vs Reference โ€‹

Primitive ๊ธฐ๋ณธํ˜• โ€‹

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

Reference ์ฐธ์กฐํ˜• โ€‹

  • ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , Heap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋งŒ ์ €์žฅํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํ• ๋‹น ์‹œ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ์†Œ๋งŒ ๋น„๊ตํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น„๊ต๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ์—ฌ๋Ÿฌ ์ฐธ์กฐ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋ฉด, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์—†์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด (Immutable Object) โ€‹

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

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด, ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์›๋ณธ์„ ์œ ์ง€ํ•œ ์ฑ„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๊ณ  ํ•˜๋ฉฐ, React, Redux ๋“ฑ์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ณ  ๋น„๊ต๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ํ™œ์šฉ๋œ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด์™€ ๋ณต์‚ฌ์˜ ๊นŠ์ด โ€‹

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‹จ์ˆœํžˆ ... ์—ฐ์‚ฐ์ž๋‚˜ Object.assign()์„ ์‚ฌ์šฉํ•˜๋ฉด ์–•์€ ๋ณต์‚ฌ๋งŒ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฐ”๊นฅ ๊ฐ์ฒด๋Š” ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง€์ง€๋งŒ, ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์€ ์—ฌ์ „ํžˆ ์›๋ณธ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์„œ ์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

js
const state = {
  user: { name: "Binny" },
  items: ["a", "b"],
};

const copied = { ...state }; // ์–•์€ ๋ณต์‚ฌ
copied.user.name = "Hoon";

console.log(state.user.name); // Hoon โ† ์›๋ณธ๋„ ํ•จ๊ป˜ ๋ฐ”๋€œ
  • copied์™€ state๋Š” user ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ์–•์€ ๋ณต์‚ฌ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋ ค๋ฉด, ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊นŠ์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ค‘์ฒฉ ๊ตฌ์กฐ๊นŒ์ง€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•ด ์™„์ „ํ•œ ๋ถ„๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
js
const deepCopied = JSON.parse(JSON.stringify(state));
deepCopied.user.name = "Hoon";

console.log(state.user.name); // Binny โ† ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ
  • JSON.parse(JSON.stringify())๋Š” ํ•จ์ˆ˜, undefined, ์ˆœํ™˜ ์ฐธ์กฐ ๋“ฑ์€ ๋ณต์‚ฌํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

  • ๋ณต์žกํ•œ ๊ตฌ์กฐ์—์„œ๋Š” structuredClone() ๋˜๋Š” lodash.cloneDeep() ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

    ์ด์ฒ˜๋Ÿผ ๋ณต์‚ฌ์˜ ๊นŠ์ด์— ๋”ฐ๋ผ ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ์‹ ๋ขฐ์„ฑ์ด ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ตฌ์กฐ์˜ ๋ณต์žก๋„์— ๋งž๋Š” ๋ณต์‚ฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.