๐ฃ Data Types โ
01. ๋ฐ์ดํฐ ํ์ ์ ์ข ๋ฅ โ
Primitive Type ๊ธฐ๋ณธํ
โโโ Number
โโโ String
โโโ Boolean
โโโ null
โโโ undefined
โโโ Symbol
Reference Type ์ฐธ์กฐํ
โโโ Object
โโโ Array
โโโ Function
โโโ RegExp(Regular Expression)
โโโ Set / WeakSet
โโโ Map / WeakMap
โโโ ...
โป ํ์๋ ๋ฐ์ดํฐ ํ์
์ ES6(ECMAScript 2015)์์ ๋์
๋ ๊ฒ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ์ผ๋ก ๋๋๋ค.
๊ธฐ๋ณธํ
์ ์ค์ ๊ฐ์ ์ง์ ์ ์ฅ์ฐธ์กฐํ
์ ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์(์ฐธ์กฐ)๋ฅผ ์ ์ฅ
์ด ์ฐจ์ด๋ ๋ณ์ ๋ณต์ฌ, ๋น๊ต ์ฐ์ฐ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์ค์ํ ์ฐจ์ด๋ฅผ ๋ง๋ ๋ค.
Primitive Type vs Reference Type โ
ํญ๋ชฉ | Primitive Type | Reference Type |
---|---|---|
์ ์ฅ ๋ฐฉ์ | ๊ฐ ์์ฒด๋ฅผ ์ ์ฅ | ์ฐธ์กฐ(์ฃผ์)๋ฅผ ์ ์ฅ |
๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ์์น | Stack | Heap (์ฐธ์กฐ๋ Stack์ ์ ์ฅ) |
๋ณต์ฌ ์ ๋์ | ๊ฐ ๋ณต์ฌ (๊น์ ๋ณต์ฌ) | ์ฐธ์กฐ ๋ณต์ฌ (์์ ๋ณต์ฌ) |
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ | ๋ถ๋ณ (Immutable) | ๊ฐ๋ณ (Mutable) |
๋น๊ต ๋ฐฉ์ | ๊ฐ ์์ฒด๋ฅผ ๋น๊ต (===) | ์ฃผ์(์ฐธ์กฐ๊ฐ)๋ฅผ ๋น๊ต (===) |
typeof ๊ฒฐ๊ณผ ์์ | "number", "string" ๋ฑ | "object" ๋๋ "function" |
๋ํ ์์ | 42, "text", true, null | {}, [], function() {}, new Map() |
๐ก null
์ ์ typeof ๊ฒฐ๊ณผ๊ฐ "object"์ผ๊น?
์๋ฐ์คํฌ๋ฆฝํธ์์ typeof null
์ "object"
๋ฅผ ๋ฐํํ๋ค.
์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋๋ ๋ฒ๊ทธ๋ก, null
์ ์ค์ ๋ก ๊ฐ์ฒด๊ฐ ์๋์๋ ๋ถ๊ตฌํ๊ณ object๋ก ์ธ์ํ๋ค.
typeof null === "object"; // true
์ด ๋ฒ๊ทธ๋ ์ด๋ฏธ ๋๋ฌด ๋ง์ ์ฝ๋์์ ์ฌ์ฉ๋์ด ์์ด์ ์ง๊ธ๊น์ง๋ ๊ณ ์ณ์ง์ง ์๊ณ ์ ์ง๋๊ณ ์๋ค.
const value = null;
value === null; // true
์ ํํ๊ฒ 'null'์ธ์ง ํ์ธํ๋ ค๋ฉด typeof
๋์ === null
๋น๊ต๋ฅผ ํ๋ ๊ฒ ์ ํํ๋ค.
โ ๏ธ ๊ธฐ๋ณธํ์ ๋ถ๋ณํ๋ค๊ณ ํ๋๋ฐ, ๋ณ์์ ๊ฐ์ ์ฌํ ๋นํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
์ ๋ถ๋ณ์ธ๋ฐ๋ ๋ณ์์ ์๋ก์ด ๊ฐ์ ๋ฃ์ ์ ์๋ ๊ฑธ๊น?
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โธ)๊ฐ์ ๊ฐ์ ํํํ ์ ์์ด ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ์ปดํจํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ๋๋ ๋ฐ์ดํธ ๋จ์์ ์ฃผ์
๋ฅผ ์ฌ์ฉํ๋ค.
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. ์๋ณ์์ ๋ณ์ โ
// age๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณ์ ๊ณต๊ฐ์ ๋ง๋ค๊ณ , ๊ทธ ์์ 30 ์ด๋ผ๋ ๊ฐ์ ์ ์ฅ
let age = 30;
๋ณ์ variable
: ๋ณํ ์ ์๋ ๋ฐ์ดํฐ(์ซ์, ๋ฌธ์์ด, ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ)๊ฐ ๋ด๊ธธ ์ ์๋ ๊ณต๊ฐ(๋ฉ๋ชจ๋ฆฌ)์๋ณ์ identifier
: ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ด๋ฆ, ๋ณ์๋ช
03. ๋ณ์ ์ ์ธ๊ณผ ๋ฐ์ดํฐ ํ ๋น โ
3-1. ๋ณ์ ์ ์ธ โ
var a;
a
๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง ๋ณ์๋ฅผ ์ ์ธํ๋ค.- ์ ์ธ ์์๋ ์์ง ์ด๋ค ๊ฐ๋ ํ ๋นํ์ง ์์๊ธฐ ๋๋ฌธ์
undefined
๊ฐ ์ ์ฅ๋๋ค. - ๋์ค์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด ๋ณ์์ ํ ๋นํ ์ ์๋ค.
var a;
๋ณ์ ์ ์ธ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณํ
- โ ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋น์ด์๋ ๊ณต๊ฐ์(@1003)๋ฅผ ํ๋ณดํ๋ค.
- โก ํ๋ณดํ ๊ณต๊ฐ์ ์๋ณ์๋ฅผ
a
๋ผ๊ณ ์ง์ ํ๋ค.
์ดํ ์ฌ์ฉ์๊ฐ a
์ ์ ๊ทผํ๊ณ ์ ํ๋ฉด ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ 'a๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์ฃผ์'๋ฅผ ๊ฒ์ํด 'ํด๋น ๊ณต๊ฐ์ ๋ด๊ธด ๋ฐ์ดํฐ'๋ฅผ ๋ฐํํ๋ค.
3-2. ๋ฐ์ดํฐ ํ ๋น โ
// ๋ณ์ ์ ์ธ๊ณผ ํ ๋น์ ๋ถ๋ฆฌํ ๊ฒฝ์ฐ
var a;
a = "abc";
// ๋ณ์ ์ ์ธ๊ณผ ํ ๋น์ ๋์์ ํ ๊ฒฝ์ฐ
var a = "abc";
์ ๋ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์
์ฅ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ , ๊ทธ ์ฃผ์๋ฅผ ๋ณ์์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ฐ์ดํฐ ํ ๋น์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณํ
- โ ๋ณ์ ์์ญ์ ๋น ๊ณต๊ฐ
@1003
์ ํ๋ณดํ๋ค. - โก ํด๋น ๊ณต๊ฐ์ ์๋ณ์๋ฅผ
a
๋ผ๊ณ ์ง์ ํ๋ค. - โข ๋ฐ์ดํฐ ์์ญ์ ๋น ๊ณต๊ฐ
@5004
์ ๋ฌธ์์ด 'abc'๋ฅผ ์ ์ฅํ๋ค. - โฃ ๋ณ์ ์์ญ์์
a
์๋ณ์๋ฅผ ๊ฒ์ํ๋ค. - โค ์์ ์ ์ฅํ ๋ฌธ์์ด์ ์ฃผ์
@5004
๋ฅผ@1003
์ ๊ณต๊ฐ์ ๋์ ํ๋ค.
โ ๏ธ ๊ฐ์ ๋ณ์ ์์ญ์ ์ง์ ์ ์ฅํ์ง ์๋ ์ด์ โ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ์์ด์ฒ๋ผ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์, ๋ณ์ ๊ณต๊ฐ์ ์ง์ ๊ฐ์ ์ ์ฅํ๋ฉด ๋นํจ์จ์ ์ด๋ค.
var a = "abc";
a = a + "defg";
console.log(a); // abcdefg
์์ ๊ฐ์ด ๋ฌธ์์ด์ด ๋ณ๊ฒฝ๋๋ฉด ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์ โ ์ ๊ณต๊ฐ ํ๋ณด โ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋นํจ์จ์ ์ธ ์์ ์ด ๋ฐ๋ณต๋๋ค.
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋์ด ์ ์ฅํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์์ ๋กญ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ๋ ์ ์๋๋ก ์ค๊ณ๋์ด ์๋ค.
๋ฌธ์์ด ๋ณํ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณํ
- ๊ธฐ์กด ๋ฌธ์์ด 'abc'๋ ์ฃผ์
@5004
์ ์ ์ฅ๋์ด ์์์ง๋ง, 'abcdefg'๋ ๊ธฐ์กด ๊ณต๊ฐ์ ๋ฎ์ด์ฐ์ง ์๊ณ , ์๋กญ๊ฒ ํ๋ณด๋@5005
์ ์ ์ฅ๋๋ค. - ๋ณ์
a
๋ ๊ธฐ์กด์ ์ฐธ์กฐํ๋@5004
๋์ ,@5005
๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค. - ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋
@5004
๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)์ ์ํด ์ ๊ฑฐ๋ ์ ์๋ค.
04. ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ โ
4-1. ๋ถ๋ณ๊ฐ โ
๋ณ์์ ์์์ ์ฐจ์ด์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ
์ ์๋ค. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋์์ ๋ณ์ ์์ญ ๋ฉ๋ชจ๋ฆฌ
์ด๋ค.
- ๋ณ๊ฒฝํ ์ ์์ผ๋ฉด ๋ณ์
- ๋ณ๊ฒฝํ ์ ์์ผ๋ฉด ์์
๋ถ๋ณ์ฑ ์ฌ๋ถ๋ฅผ ๊ตฌ๋ถํ ๋์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ๋์์ ๋ฐ์ดํฐ ์์ญ ๋ฉ๋ชจ๋ฆฌ
์ด๋ค.
๊ตฌ๋ถ | ๊ธฐ์ค์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ | ์ค๋ช |
---|---|---|
๋ณ์/์์ | ๋ณ์ ์์ญ (Variable Memory) | ๋ณ์ ๊ณต๊ฐ์ ์๋ก์ด ๊ฐ์ ๋ค์ ์ ์ฅํ ์ ์๋๊ฐ |
๋ถ๋ณ๊ฐ | ๋ฐ์ดํฐ ์์ญ (Data Memory) | ๊ฐ ์์ฒด๋ฅผ ์์ ํ ์ ์๋๊ฐ |
๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋ถ๋ณ๊ฐ โ
var a = "abc";
a = a + "def";
var b = 5;
var c = 5;
b = 7;
b = 7
์ ๋ณ์b
์ ์ ์ฅ๋ ๊ฐ '5'๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ก์ด ๊ฐ '7'์ ๋ณ์์ ๋ค์ ํ ๋นํ๋ ๋์์ด๋ค. ์ฆ, ๊ธฐ์กด์ 5๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค.- 'abc'์ 'def'๋ฅผ ๋ํด๋ 'abc' ๋ฌธ์์ด์ ๊ทธ๋๋ก ๋จ๊ณ , 'abcdef'๋ผ๋ ์๋ก์ด ๋ฌธ์์ด์ด ์์ฑ๋๋ค.
- ์ซ์, ๋ฌธ์์ด์ ์ง์ ์์ ๋๋ ๊ฒ ์๋๋ผ, ์๋ก์ด ๊ฐ์ ๋ง๋ค์ด ๊ธฐ์กด ๊ฐ์ ๊ต์ฒดํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
- ์ฆ, ๊ฐ์ ๋ณ๊ฒฝ์ ํญ์
์๋ก ๋ง๋๋
๋ฐฉ์์ผ๋ก๋ง ์ด๋ค์ง๋ฉฐ, ์ด๊ฒ์ด ๋ฐ๋ก ๋ถ๋ณ๊ฐ์ ๋ณธ์ง์ด๋ค.
๋ถ๋ณ๊ฐ์ ํน์ง โ
- ํ ๋ฒ ๋ง๋ค์ด์ง ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ๋ณ๊ฒฝํ๋ ค๋ ์๋๋ ํญ์ ์๋ก์ด ๊ฐ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ๋ง ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์ ๊ฑฐ๋๋ค.
- ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ์ ์ง๋๋ฉฐ, ์ฐธ์กฐ๊ฐ ๋๊ธฐ๊ธฐ ์ ๊น์ง๋ ์ ๊ฑฐ๋์ง ์๋๋ค.
4-2. ๊ฐ๋ณ๊ฐ โ
์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ์์ฒด๋ ๋ถ๋ณ๊ฐ์ด์ง๋ง, ๋ณ์์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ์ผ๋ง๋ ์ง ํ ๋นํ ์ ์์ด ๊ฐ๋ณ๊ฐ
์ผ๋ก ๋์ํ๋ค.
์ฐธ์กฐํ ๋ฐ์ดํฐ ํ ๋น ๊ณผ์ โ
์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ์ํ ๋ณ๋์ ๋ณ์ ์์ญ์ ์ฌ์ฉํ๋ค.
๊ฐ์ฒด ์์ฒด๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋๋ฉฐ, ๋ด๋ถ ๊ฐ๋ค์ ๋ชจ๋ ๋ถ๋ณ๊ฐ์ด๋ค.
๊ทธ๋ฌ๋ ๋ณ์๋ ์ธ์ ๋ ๋ค๋ฅธ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ด, ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ณํ์ง ์๋ค โ ๊ฐ๋ณ๊ฐ
์ด๋ผ๊ณ ํ๋ค.
var obj1 = {
a: 1,
b: "bbb",
};
- โ ๋ณ์ obj1๋ ๋ณ์ ์์ญ
@1002
์ ์ ์ธ, ํ ๋น๋ ๊ฐ์ฒด ์ ์ฒด๋ ๋ฐ์ดํฐ ์์ญ@5001
์ ์ ์ฅํ๋ค. - โก ๊ฐ์ฒด์ ํ๋กํผํฐ(a, b)๋ ๊ฐ์ฒด ์ ์ฉ ๋ณ์ ์์ญ
@7103~
์ ๋ฐ๋ก ์์ฑ๋๋ค. ๊ฐ์ฒด ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ๋ ๋ณ์ ํ ์ด๋ธ์ด๋ค. - โข ๊ฐ ๊ฐ 1, "bbb"๋ ๋ฐ์ดํฐ ์์ญ์
@5003
,@5004
์ ์ ์ฅ๋๋ค. - โฃ ๊ทธ๋ฆฌ๊ณ ๋ณ์
@7103
,@7104
์์ ์ด ๊ฐ์ ์ฐธ์กฐ(์ฐ๊ฒฐ)ํ๋ค.
์ฐธ์กฐํ ๋ฐ์ดํฐ์ ํ๋กํผํฐ ์ฌํ ๋น โ
var obj1 = {
a: 1,
b: "bbb",
};
obj1.a = 2;
- โ ๋ฐ์ดํฐ ์์ญ์
@5005
์ 2๋ฅผ ์ ์ฅํ๊ณ , ์ด ์ฃผ์๋ฅผ@7103
์ ์ ์ฅํ๋ค. - ๋ณ์ obj๊ฐ ๋ฐ๋ผ๋ณด๋ ์ฃผ์๋ @5001๋ก ๋ณํ์ง ์์๋ค. ์ฆ, ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ๋ง ๋ฐ๋ ๊ฒ์ด๋ค.
์ค์ฒฉ๋ ์ฐธ์กฐํ ๋ฐ์ดํฐ(๊ฐ์ฒด)์ ํ๋กํผํฐ ํ ๋น โ
var obj = {
x: 3,
arr: [3, 4, 5],
};
- โ ๋ณ์ obj๋ ๋ณ์ ์์ญ
@1002
์ ์ ์ธ, ํ ๋น๋ ๊ฐ์ฒด ์ ์ฒด๋ ๋ฐ์ดํฐ ์์ญ@5001
์ ์ ์ฅํ๋ค. - โก ๊ฐ ํ๋กํผํฐ๋ค์ ์ ์ฅํ๊ธฐ ์ํด ๊ฐ์ฒด ์ ์ฉ ๋ณ์ ์์ญ
@7103~
์ ์์ฑํ๊ณ , ๊ทธ ์ฃผ์๋ฅผ@5001
์ ์ ์ฅํ๋ค. - โข
@7104
์ ์ ์ฅํ ๋ฐฐ์ด ์ญ์ ๋ด๋ถ ํ๋กํผํฐ๋ค์ ์ ์ฅํ๊ธฐ ์ํด ๋ณ๋์ ๋ณ์ ์์ญ@8104~
์ ์์ฑํ๋ค. - โฃ ๋ฐฐ์ด์ ์์๊ฐ 3๊ฐ ์ด๋ฏ๋ก 3๊ฐ์ ๋ณ์ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ฐ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ๋ค.(0, 1, 2)
๐ก obj.arr[1]์ ๊ฒ์ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
- obj ๊ฒ์
- obj๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง ์ฃผ์๋ฅผ ์ฐพ๋๋ค.
@1002
- ๊ฐ์ด ์ฃผ์์ด๋ฏ๋ก ๊ทธ ์ฃผ์๋ก ์ด๋ํ๋ค.
@5001
- ๊ฐ์ด ์ฃผ์์ด๋ฏ๋ก ๊ทธ ์ฃผ์๋ก ์ด๋ํ๋ค.
@7103 ~
- obj.arr ๊ฒ์
- arr์ด๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง ์ฃผ์๋ฅผ ์ฐพ๋๋ค.
@7104
- ๊ฐ์ด ์ฃผ์์ด๋ฏ๋ก ๊ทธ ์ฃผ์๋ก ์ด๋ํ๋ค.
@5003
- ๊ฐ์ด ์ฃผ์์ด๋ฏ๋ก ๊ทธ ์ฃผ์๋ก ์ด๋ํ๋ค.
@8104 ~
- obj.arr[1] ๊ฒ์
- ์ธ๋ฑ์ค 1์ ํด๋นํ๋ ์ฃผ์๋ฅผ ์ฐพ๋๋ค.
@8105
- ๊ฐ์ด ์ฃผ์์ด๋ฏ๋ก ๊ทธ ์ฃผ์๋ก ์ด๋ํ๋ค.
@5004
- ๊ฐ์ด ์ซ์ํ ๋ฐ์ดํฐ์ด๋ฏ๋ก 4๋ฅผ ๋ฐํํ๋ค.
์ค์ฒฉ๋ ์ฐธ์กฐํ ๋ฐ์ดํฐ(๊ฐ์ฒด)์ ํ๋กํผํฐ ์ฌํ ๋น โ
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 ๋ณ์ ๋ณต์ฌ ๋น๊ต โ
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ๋ณ์ ๋ณต์ฌ ๋น๊ต
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. ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ โ
๐จ ๊ฐ์ฒด์ ๊ฐ๋ณ์ฑ์ ๋ฐ๋ฅธ ๋ฌธ์ ์ โ
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
๊น์ง ์ํฅ์ ์ค๋ค.- ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ์ ์์์น ๋ชปํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ ๋ฐํ ์ ์๋ค.
โ ๊ฐ์ฒด์ ๊ฐ๋ณ์ฑ์ ๋ฐ๋ฅธ ๋ฌธ์ ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ โ
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๋ ์๋ ์ํ๋ฅผ ์ ์งํ๋ค.
๊ธฐ์กด ์ ๋ณด๋ฅผ ๋ณต์ฌํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์(์์ ๋ณต์ฌ) โ
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๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ณต์ฌ โ
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
๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณํ๋ณด๊ธฐ
- ํ์ ์ user ๊ฐ์ฒด ๋ด๋ถ ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ copyObject() ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํฉ์ํ๊ณ ๊ทธ ๊ท์น์ ์งํจ๋ค๋ฉด user ๊ฐ์ฒด๊ฐ ๊ณง ๋ถ๋ณ๊ฐ์ฒด๋ผ๊ณ ๋ณผ ์ ์๋ค.
- copyObject()๋
์์ ๋ณต์ฌ
๋ง ์ํํ๋ฏ๋ก, ์ค์ฒฉ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด๊น์ ๋ณต์ฌ
๊ฐ ํ์ํ๋ค.
5-2. ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ โ
- ์์ ๋ณต์ฌ(shallow copy): ๋ฐ๋ก ์๋ ๋จ๊ณ์ ๊ฐ๋ง ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
- ๊น์ ๋ณต์ฌ(deep copy): ๊ฐ์ฒด ๋ด๋ถ์ ๋ชจ๋ ์ค์ฒฉ๋ ๊ฐ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
์ค์ฒฉ๋ ๊ฐ์ฒด์ ๋ํ ์์ ๋ณต์ฌ โ
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 ๋ด๋ถ์ ํ๋กํผํฐ๋ค์ ๋ณต์ฌ๋์ง ์๊ณ , ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๊ฒ ๋๋ค.
โ ๏ธ ๊น์ ๋ณต์ฌ ๋๋ ๋ถ๋ณ์ฑ ์ ์ง์ ์ค์์ฑ
์์ ๋ณต์ฌ๋ ์ค์ฒฉ๋ ๊ฐ์ฒด ๊ตฌ์กฐ์์ ๋ณต์ฌ๋ณธ๊ณผ ์๋ณธ์ด ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ์๋์น ์์ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ํ์ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ด๊ณ ์๋์น ์์ ๋ณ๊ฒฝ์ ๋ง๊ธฐ ์ํด์๋ ๊น์ ๋ณต์ฌ
๋๋ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ ์ค๊ณ
๊ฐ ์ค์ํ๋ค.
์ค์ฒฉ๋ ๊ฐ์ฒด์ ๋ํ ๊น์ ๋ณต์ฌ โ
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)๋?
"์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์๋ ๋์ ๋ฐฉ์"์ ์๋ฏธํ๋ค. ์ฌ๊ท๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณต์กํ ๊ตฌ์กฐ๋ ์ค์ฒฉ๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ๋จ์๋ก ๋๋ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
๊ฐ์ฒด ๋ณต์ฌ์ ์ฐ์ด๋ ์ฌ๊ท
var user = {
name: "Hyebin",
urls: {
blog: "http://blog.com",
github: {
main: "http://github.com",
},
},
};
์์ฒ๋ผ ๊ฐ์ฒด ์์ ๋ ๊ฐ์ฒด๊ฐ ์๋ ์ค์ฒฉ ๊ตฌ์กฐ์์๋, ์์ ๋ณต์ฌ๋ก๋ ๋ด๋ถ๊น์ง ๋ชจ๋ ๋ณต์ฌ๋์ง ์๊ธฐ ๋๋ฌธ์ "๊น์ ๋ณต์ฌ"๋ฅผ ํ๋ ค๋ฉด ์ด ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ์ ๋ถ ํ๋ํ๋ ๋ฐ๋ผ ๋ค์ด๊ฐ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ณต์ฌํด์ผ ํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์ฌ๊ท(recursion)์ด๋ค.
์ฌ๊ท ํจ์ | ์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์ (์ข ๋ฃ ์กฐ๊ฑด์ด ๊ผญ ํ์ํจ) |
---|---|
์ฌ๊ท์ ๋ณต์ฌ | ๊ฐ์ฒด๋ ๋ฐฐ์ด์ฒ๋ผ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ ๋ถ ๋ณต์ฌํ๋ ๊ฒ |
๊ฐ์ฒด์ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํ๋ ๋ฒ์ฉ ํจ์ โ
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()
์์ ํธ์ถํ์ฌ ๋ด๋ถ์ ์ค์ฒฉ๋ ๊ฐ์ฒด๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํ๋ค. - ๋ณต์ฌ ๋์์ด ์์๊ฐ์ผ ๊ฒฝ์ฐ์๋ ์ฌ๊ท ํธ์ถ ์์ด ๊ทธ๋๋ก ๋ณต์ฌ๋๋ค.
// ๊น์ ๋ณต์ฌ ๊ฒฐ๊ณผ ํ์ธ
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()
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
๋ถ๋ณ ๊ฐ์ฒด๋ ๋ณต์กํ ์ํ๋ฅผ ๋ค๋ฃฐ ๋ ์ค์๋ฅผ ์ค์ฌ์ฃผ๋ ์์ธก ๊ฐ๋ฅํ ๊ฐ๋ฐ ์ต๊ด์ด๋ค.
โ๊ฐ์ ๋ฐ๊พธ์ง ๋ง๊ณ , ์๋กญ๊ฒ ๋ง๋ค์ด๋ผ.โ ์ด ์์น๋ง ๊ธฐ์ตํด๋ ๋ง์ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ฐธ๊ณ ์ถ์ฒ: ใ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธใ, ์ํค๋ถ์ค ์์ ์ฝ๋ ๋ค์ด๋ก๋
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ โ
JavaScript Memory
โโโ Stack Memory
โ โโโ ๋ณ์
โ โโโ Primitive Type: ๊ฐ ์์ฒด ์ ์ฅ
โ โโโ ์ ์ ํ ๋น: ์คํ ์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น
โโโ Heap Memory
โโโ Reference Type: ์ฃผ์๋ฅผ ํตํด ๋ฐ์ดํฐ ์ฐธ์กฐ
โโโ ๋์ ํ ๋น: ๋ฐํ์ ์ค ํ์์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ํ๋ณด
- ๊ธฐ๋ณธํ์ Stack์ ๊ฐ ์์ฒด๊ฐ ์ ์ฅ๋๊ณ , ์ฐธ์กฐํ์ Heap์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ Stack์ ์ฃผ์๊ฐ ์ ์ฅ๋๋ค.
- Stack์ ์ ๊ทผ ์๋๊ฐ ๋น ๋ฅด์ง๋ง ๊ณต๊ฐ์ด ์ ํ์ ์ด๊ณ , Heap์ ์ ์ฐํ์ง๋ง ์ ๊ทผ ์๋๊ฐ ๋๋ฆฌ๋ค.
- ์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ฝ๊ฒ ํ์
ํ ์ ์๋ค.
: ๊ธฐ๋ณธํ์ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ์์ ํ ๋ถ๋ฆฌ๋๋ค.
: ์ฐธ์กฐํ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ๋ณต์ฌํด๋ ํจ๊ป ๋ฐ๋๋ค.
: ์ฐธ์กฐํ์ Heap์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ Stack์๋ ์ฃผ์๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๊ณผ์ ์์ ํ ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์น๋ค. ์ด๋ก ์ธํด ๊ธฐ๋ณธํ์ ์ง์ ๊ฐ์ ๋ค๋ฃจ๋ ๋ฐ๋ฉด, ์ฐธ์กฐํ์ ์ฃผ์๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค.
๊ธฐ๋ณธํ์ ์ ๋ณ์ ๊ฐ ์ํฅ์ด ์์๊น? (Stack์ ๊ฐ ์์ฒด ์ ์ฅ) โ
let a = 10;
let b = a;
b = 20;
Stack
โโโโโโโโโโโโโโ
โ a = 10 โ โ ๊ฐ ์์ฒด ์ ์ฅ
โ b = 10 โ โ a์ ๊ฐ์ ๋ณต์ฌ
โโโโโโโโโโโโโโ
b ๊ฐ์ 20์ผ๋ก ๋ฐ๊พธ๋ฉด,
โโโโโโโโโโโโโโ
โ a = 10 โ
โ b = 20 โ โ b๋ง ๋ฐ๋ (a๋ ์ํฅ ์์)
โโโโโโโโโโโโโโ
- ๊ธฐ๋ณธํ์ ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌํด์ ์ ์ฅํ๋ฏ๋ก ๋ณ์ ๊ฐ ๋ ๋ฆฝ์ ์ด๋ค.
์ฐธ์กฐํ์ ์ ๊ฐ์ด ๋ฐ๋๊น? (Heap์ ๊ฐ์ฒด ์ ์ฅ, ์ฃผ์๋ง ๋ณต์ฌ๋จ) โ
let obj1 = { name: "Binny" };
let obj2 = obj1;
obj2.name = "Hoon";
Stack
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ obj1 โโ โ
โ obj2 โโ โ โ ๋ ๋ณ์๋ ๋์ผํ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโ
โ
Heap
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ { name: "Hoon" } โ โ ์ค์ ๊ฐ์ฒด ๋ฐ์ดํฐ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- ์ฐธ์กฐํ์ Heap์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ Stack์ ์ฃผ์๊ฐ ์ ์ฅ๋๋ค.
- obj1๊ณผ obj2๋ Stack์ ๊ฐ๊ฐ ์กด์ฌํ์ง๋ง, ๊ฐ์ Heap ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค.
- ๋ณ์ ๊ฐ ๋ณต์ฌ๋ ๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ ์๋๋ผ ์ฃผ์ ๋ณต์ฌ์ด๋ฏ๋ก, ํ ๋ณ์๋ฅผ ์์ ํ๋ฉด ๋ค๋ฅธ ๋ณ์์๋ ์ํฅ์ ์ค ์ ์๋ค.
์ค์ฒฉ ๊ฐ์ฒด - ๊ฐ์ฒด ๋ด๋ถ์ ๋ฐฐ์ด๋ ์ฐธ์กฐํ โ
let user1 = {
name: "Binny",
hobbies: ["reading", "coding"],
};
user1.hobbies.push("traveling");
Stack
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ user1 โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ โ
Heap ๋ ๋ค๋ฅธ Heap
โโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ name: "Binny" โ โ ["reading", "coding", โ
โ hobbies โโโโโโโโโโโโโโผโโโโถโ "traveling"] โ
โโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- user1์ Heap์ ์ ์ฅ๋ ๊ฐ์ฒด์ด๊ณ , Stack์๋ ํด๋น ๊ฐ์ฒด์ ์ฃผ์๋ง ์ ์ฅ๋๋ค.
- ๊ฐ์ฒด ๋ด๋ถ์ hobbies๋ ๋ฐฐ์ด(์ฐธ์กฐํ)์ด๋ฏ๋ก, Heap์ ๋ ๋ค๋ฅธ ๊ณต๊ฐ์ ๋ณ๋๋ก ์ ์ฅ๋๋ค.
- user1.hobbies.push("traveling")์ ์คํํ๋ฉด, Heap์ ์๋ ๋ฐฐ์ด ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค.
- ์ฆ, ๊ฐ์ฒด ๋ด๋ถ์ ์ฐธ์กฐํ ํ๋กํผํฐ๋ ์ฃผ์๋ฅผ ํตํด ์ง์ ์ ๊ทผ๋๊ณ ์์ ๋ ์ ์๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection), ์ฐธ์กฐ ์นด์ดํธ(Reference Count) โ
let num = {
x: 10,
y: [3, 4],
};
num.y = "string";
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()
์ ์ฌ์ฉํ๋ฉด ์์ ๋ณต์ฌ
๋ง ์ด๋ฃจ์ด์ง๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ๊นฅ ๊ฐ์ฒด๋ ์๋กญ๊ฒ ๋ง๋ค์ด์ง์ง๋ง, ๋ด๋ถ์ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ฌ์ ํ ์๋ณธ์ ์ฐธ์กฐํ๊ณ ์์ด์ ์์ ํ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค.
const state = {
user: { name: "Binny" },
items: ["a", "b"],
};
const copied = { ...state }; // ์์ ๋ณต์ฌ
copied.user.name = "Hoon";
console.log(state.user.name); // Hoon โ ์๋ณธ๋ ํจ๊ป ๋ฐ๋
- copied์ state๋ user ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ํ๋๋ฅผ ์์ ํ๋ฉด ๋ค๋ฅธ ํ๋๋ ์ํฅ์ ๋ฐ๋๋ค.
- ์ด์ฒ๋ผ ์์ ๋ณต์ฌ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ค๋ฉด,
๊น์ ๋ณต์ฌ
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด ๋ด๋ถ์ ๋ชจ๋ ์ค์ฒฉ ๊ตฌ์กฐ๊น์ง ์๋ก์ด ๊ฐ์ฒด๋ก ๋ณต์ฌํด ์์ ํ ๋ถ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
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() ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๋ค.
์ด์ฒ๋ผ ๋ณต์ฌ์ ๊น์ด์ ๋ฐ๋ผ ๋ถ๋ณ ๊ฐ์ฒด์ ์ ๋ขฐ์ฑ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์, ๊ตฌ์กฐ์ ๋ณต์ก๋์ ๋ง๋ ๋ณต์ฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.