๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ• ์ข…ํ•ฉ๋ฐ˜ 3์ฃผ์ฐจ] 250103 TIL

Dana10 2025. 1. 3. 22:50

 

1 . ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜ ๋ฐ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋ฐ์ดํ„ฐ ํ• ๋‹น

์–ด์ œ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋ฐฐ์› ๋‹ค๋ฉด,

์˜ค๋Š˜์€ ์–ด์ œ ๋ฐฐ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋” ํฐ ๋ถ„๋ฅ˜๋กœ ๋ฌถ๊ณ , ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒ๊ด€ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํฌ๊ฒŒ ๊ธฐ๋ณธํ˜•(primitive type)๊ณผ ์ฐธ์กฐํ˜•(reference type)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,

๊ธฐ๋ณธํ˜•์—๋Š” Number, String, Boolean, null,  undefined ๊ทธ๋ฆฌ๊ณ  ES6์—์„œ ์ถ”๊ฐ€๋œ Symbol์ด ์žˆ๋‹ค.

์ฐธ์กฐํ˜•์—๋Š” Array, Function, Date, RegExp, Map, WeakMap, Set, WeekSet์ด ํฌํ•จ๋œ๋‹ค.

 

1-1. ๊ธฐ๋ณธํ˜•

  • ๊ฐ’ ์ž์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
  • ๋ถˆ๋ณ€์„ฑ์„ ๋”

์ž‰ ? ๊ทผ๋ฐ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ๋ณ€์„ฑ์„ ๋ˆ๋‹ค๋Š”๊ฒŒ ๋ฌด์Šจ ๋ง์ด์ง€?

let number = 3;
console.log(number); // 3
number = 5;
console.log(number); // 5

 

๋ณ€ํ•˜๋Š” ๊ฑฐ ์•„๋ƒ??

 

์ด๋ ‡๊ฒŒ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ ์—ฌ๋ถ€๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€์ ์—์„œ ๋ด์•ผ ํ•œ๋‹ค.

 

์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋  ๋•Œ Stack ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋กœ ์ €์žฅ๋œ๋‹ค.

ํ•ด๋‹น ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์€ Heap ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด์ž๋ฉด,

1. number๋Š” Stack๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

2. 3์ด๋ผ๋Š” ๊ธฐ๋ณธํ˜• Number Type์˜ ๋ฐ์ดํ„ฐ๊ฐ€ Heap ๋ฉ”๋ชจ๋ฆฌ์˜ @5002๋ผ๋Š” ์ฃผ์†Œ์— ์ €์žฅ๋œ๋‹ค.

3. ๋ณ€์ˆ˜ number๋Š” @5002 ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

4. number๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด number์˜ ์ฐธ์กฐ๊ฐ’์ธ @5002 ์ฃผ์†Œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ, ์ฆ‰ 3์ด ์ถœ๋ ฅ๋œ๋‹ค.

5. number์— 5๋ฅผ ์žฌํ• ๋‹น -> ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ @5003์— 5๊ฐ€ ์ €์žฅ๋œ๋‹ค. 

6. number์˜ ์ฐธ์กฐ๊ฐ’์ด @5002 -> @5003์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

7. number๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด @5003์„ ์ฐธ์กฐํ•˜์—ฌ 5๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

๋‹ค์‹œ ๋งํ•ด number๋ผ๋Š” ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ์ด์ง€ @5002์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ 3์ด ๋ฐ”๋€ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค!

์ฆ‰ ์œ„์˜ ์˜ˆ์‹œ๋Š” ๋ณ€์ˆ˜์— ์žฌํ• ๋‹น(๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝ)์„ ํ•œ ๊ฒƒ์ด์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

 

(์ฐธ๊ณ ๋กœ ๋งŒ์•ฝ ๋”์ด์ƒ @5002๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ @5002๊ฐ€ ์ˆ˜๊ฑฐํ•ด๊ฐ„๋‹ค -> ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ)

 

1-2. ์ฐธ์กฐํ˜•

  • ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅ
  • ๊ฐ€๋ณ€์ ์ž„
const object = {
    name : 'Dana',
    age : 30
};

console.log(object); // { name : 'Dana', age : 30 }

object['age'] = 29;

console.log(object); // { name: 'Dana', age : 29 }

 

์ฐธ์กฐํ˜•์€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค์‹์œผ๋กœ ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

1. object๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

2. ๊ฐ์ฒด { name : 'Dana', age : 30 }๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ @7002์— ์ €์žฅ๋œ๋‹ค.

   -> ๋ณ€์ˆ˜ object๋Š” @7002๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ.

3. @7002์—๋Š” key-value ์Œ์ด ์ €์žฅ๋œ๋‹ค.

4. name์ด๋ผ๋Š” key์˜ value 'Dana'๋Š” ๊ธฐ๋ณธํ˜• Stringํƒ€์ž…์œผ๋กœ, ๋˜๋‹ค์‹œ Heap ๋ฉ”๋ชจ๋ฆฌ @5001์— ์ €์žฅ๋œ๋‹ค.

    -> name์€ @5001์€ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ.

5. age์—ญ์‹œ value์ธ 30์ด Heap ๋ฉ”๋ชจ๋ฆฌ @5002์— ์ €์žฅ๋œ๋‹ค.

    -> age๋Š” @5002๋ฅผ ์ฐธ์กฐํ•จ.

6. ์ฝ˜์†” ์ถœ๋ ฅ ์‹œ, object๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’ @7002๋ฅผ ์ฐธ์กฐํ•˜์—ฌ { name : 'Dana', age : 30 }๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

7. ๊ฐ์ฒด object์˜ key 'age'์˜ ๊ฐ’์„ 29๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.

8. 29๊ฐ€ ์ƒˆ๋กœ์šด Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’ @5003์— ์ €์žฅ๋œ๋‹ค.

9. @7002์— ์ €์žฅ๋œ key 'age'์˜ ์ฐธ์กฐ๊ฐ’์ด @5002 -> @5003์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

    ( ์—ฌ๊ธฐ์„œ ! ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ฐ€๋ณ€์ ์ธ ํŠน์ง•์„ ๊ฐ–๊ณ ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. )

10. ์ฆ‰, ๋ณ€์ˆ˜ object๋Š” ์—ฌ์ „ํžˆ @7002๋ฅผ ์ฐธ์กฐํ•˜๊ณ , @7002์˜ age์˜ ์ฐธ์กฐ๊ฐ’๋งŒ ๋ฐ”๋€Œ์—ˆ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ผ๋Š” ๊ฒƒ์€ Heap ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ(key-value ์Œ์˜ value ์ฐธ์กฐ ๊ฐ’)๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


2. ๋ณ€์ˆ˜ ๋ณต์‚ฌ

 2-1. ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ

 : ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋ฉฐ ๊ฐ ๋ณ€์ˆ˜๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋จ

 

let a = 10;
let b = a;
b = 15;
console.log(a); // 10
console.log(b); // 15

 

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

1. ๋ณ€์ˆ˜ a๋Š” Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  a์— ํ• ๋‹น๋œ ๊ฐ’ 10์€ Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5001์— ์ €์žฅ๋œ๋‹ค.

2. ๋ณ€์ˆ˜ a๋Š” @5001์„ ์ฐธ์กฐํ•œ๋‹ค.

3. ๋ณ€์ˆ˜ b๋„ Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  b = a ํ• ๋‹น์œผ๋กœ ์ธํ•ด b๋„ @5001์„ ์ฐธ์กฐํ•œ๋‹ค.

4. b์— 15๋ฅผ ์žฌํ• ๋‹นํ•œ๋‹ค.

5. 15๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒˆ ์ฃผ์†Œ @5002์— ์ €์žฅ๋œ๋‹ค.

6. b = 15๋กœ ์žฌํ• ๋‹น์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ b๋Š” ์ด์ œ @5002๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

7. ๋ณ€์ˆ˜ a๋Š” ์—ฌ์ „ํžˆ @5001์„ ์ฐธ์กฐํ•œ๋‹ค.

 

์ด๋Ÿฐ ๊ณผ์ •์„ ํ†ตํ•ด a๋Š” @5001์„ ์ฐธ์กฐํ•˜๊ณ  b๋Š” @5002๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

 

 

 

2-2. ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

 : ์ฐธ์กฐ๋ฅผ ๋ณต์‚ฌํ•˜๋ฉฐ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด

 

let obj1 = { c : 10, d : 'ddd' };
let obj2 = obj1;
obj2.c = 20;
console.log(obj1); // { c : 20, d : 'ddd' }
console.log(obj2); // { c : 20, d : 'ddd' }

 

obj1๊ณผ ob2๋ฅผ ๋ณด์ž.

 

1. ๋ณ€์ˆ˜ obj1์€ Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  ๊ฐ์ฒด { c : 10, d : 'ddd' }๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7001์— ์ €์žฅ๋œ๋‹ค.

2. @7001์— ์ €์žฅ๋œ key 'c'์˜ value๋Š” 10์œผ๋กœ, ์œ„์˜ ์˜ˆ์‹œ์—์„œ ์ €์žฅ๋œ Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5001์„ ์ฐธ์กฐํ•œ๋‹ค.

3. @7001์— ์ €์žฅ๋œ ๋˜ ๋‹ค๋ฅธ key 'd'์˜ value 'ddd'๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5002์— ์ƒˆ๋กœ ์ €์žฅ๋œ๋‹ค.

4. ๋ณ€์ˆ˜ obj1์€ ๊ฐ์ฒด  { c : 10, d : 'ddd' }๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7001์„ ์ฐธ์กฐํ•œ๋‹ค.

5. ๋ณ€์ˆ˜ obj2๋„ Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

6. obj2 = obj1 ํ• ๋‹น์œผ๋กœ ์ธํ•ด obj2๋„ obj1๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7001์„ ์ฐธ์กฐํ•œ๋‹ค.

7.  ๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— 20์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5003์— 20์„ ์ƒˆ๋กœ ์ €์žฅ๋œ๋‹ค.

8. obj2.c = 20์œผ๋กœ ์žฌํ• ๋‹น ๋˜์–ด key 'c'์˜ value๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5002๊ฐ€ ์•„๋‹Œ ์ฃผ์†Œ @5003์„ ์ฐธ์กฐํ•œ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ obj1๊ณผ obj2๋Š” ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7001์„ ์ฐธ์กฐํ•˜์ง€๋งŒ

๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7001 ๋‚ด๋ถ€์—์„œ key 'c'์˜ ์ฐธ์กฐ ๊ฐ’์ด @5002 -> @5003์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

obj1๊ณผ obj2์˜ console ์ถœ๋ ฅ๊ฐ’์€ ๋ชจ๋‘ { c : 20, d : 'ddd' }๊ฐ€ ๋œ๋‹ค.


3. ๊นŠ์€ ๋ณต์‚ฌ vs ์–•์€ ๋ณต์‚ฌ

3-1. ์–•์€ ๋ณต์‚ฌ

const getShallowCopy = (obj) => {
    return {
        ...obj
    }
};

const orgin = { 
	name : 'Dana', 
    age : 30, 
    homepage : { blog : 'string', instagram : 'string', isPublic : true }
};

const shallowCopyObj = getShallowCopy(orgin);


orgin.name = "Bob";
shallowCopyObj.age = 27;
shallowCopyObj.homepage.isPublic = false;


console.log('orgin',orgin); 
// {name: 'Bob',age: 30, homepage: { blog: 'string', instagram: 'string', isPublic: false }}

console.log('shallowCopyObj',shallowCopyObj); 
// { name: 'Dana', age: 27,homepage: { blog: 'string', instagram: 'string', isPublic: false }}


console.log(orgin === shallowCopyObj); // false

 

origin์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋ณด์ž.

name ๊ฐ’์€ ๋ณ€๊ฒฝํ•œ ๋Œ€๋กœ ์ž˜ ๋“ค์–ด ๊ฐ”๋Š”๋ฐ.. ์ž‰? ๊ฐ‘์ž๊ธฐ ์™œ isPublic์ด false๊ฐ€ ๋˜์—ˆ์ง€?

isPublic์˜ ๊ฐ’์„ false๋กœ ์ˆ˜์ •ํ•œ ๊ฒƒ์€ shallowCopyObj์ธ๋ฐ 

origin === shallowCopyObj๊ฐ€ false์ธ๋ฐ ์™œ์ง€ ???!

 

์ž ์ด์ œ ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด์ž.

 

1. ๋ณ€์ˆ˜ origin์€ stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ ,

   ๊ฐ์ฒด { name: 'Dana', age: 30, homepage: { blog: 'string', instagram: 'string', isPublic: true }}๋Š” heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7002     ์— ์ €์žฅ๋œ๋‹ค. 

   -> ์ด ์‹œ์ ์—์„œ, ๋ณ€์ˆ˜ origin์€ heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7002๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

 

2. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7002์—๋Š” homepage๋ผ๋Š” key์˜ value๊ฐ€ ๋˜ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค. 

    ๋”ฐ๋ผ์„œ ๊ฐ์ฒด {  blog: 'string', instagram: 'string', isPublic: true }๋ฅผ heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7003์— ์ƒˆ๋กœ ์ €์žฅํ•œ๋‹ค.

   -> ์—ฌ๊ธฐ์„œ, homepage๋Š” @7003์„ ์ฐธ์กฐํ•œ๋‹ค.

 

3. @7003 ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์˜ isPublic์—๋Š” true๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š”๋ฐ, true๋Š” ๋˜ ๋‹ค์‹œ heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @5001์— ์ƒˆ๋กœ ์ €์žฅ๋œ๋‹ค.

   -> isPublic์€ @5001์„ ์ฐธ์กฐํ•œ๋‹ค.

 

4. ๋ณ€์ˆ˜ shallowCopy๋Š” stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ , origin์„ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ

   ์ƒˆ๋กญ๊ฒŒ ์–ป์€ ๊ฐ์ฒด { name: 'Dana', age: 30, homepage: { blog: 'string', instagram: 'string', isPublic: true }}๋Š” heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ    ์†Œ @7003์— ์ €์žฅ๋œ๋‹ค.

  -> ์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜ shallowCopy๋Š” @7003์„ ์ฐธ์กฐํ•œ๋‹ค.

 

 5. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7003์—๋„ homepage๋ผ๋Š” key์˜ value๊ฐ€ ๋˜๋‹ค์‹œ ๊ฐ์ฒด๋กœ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.

    ๊ฐ์ฒด {  blog: 'string', instagram: 'string', isPublic: true }๋Š” heap ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ @7003์— ํ• ๋‹น๋˜์–ด ์žˆ์–ด ํ•ด๋‹น ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

   -> ์—ฌ๊ธฐ์„œ๋„ homepage๋Š” @7003์„ ์ฐธ์กฐํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์œ„์—์„œ๋ถ€ํ„ฐ ์‚ดํŽด๋ณธ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด, 

์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•˜์—ฌ 1-depth์˜ ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ”๊ฟ”๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ

2-depth ์ด์ƒ์˜ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ฐ”๋€” ๊ฒฝ์šฐ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์–ป๊ฒŒ ๋œ ๊ตํ›ˆ ! ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์‹œ, ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ๋ณต์‚ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์„๊นŒ?

๋ฐ”๋กœ ์ด์–ด์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

3-2. ๊นŠ์€ ๋ณต์‚ฌ

const getDeepCopy = (obj) => {
    
    if(obj === null || typeof obj !== 'object') {
        return obj;
    }

    let copy = {};
    
    for (let key in obj) {
        copy[key] = getDeepCopy(obj[key]);
    }

    return copy;
}


const origin =  { 
	name : 'Dana', 
	age : 30, 
	homepage : { blog : 'string', instagram : 'string', isPublic : true }
} ;
const deepCopyObj = getDeepCopy(origin);

deepCopyObj.name = 'Bob';
deepCopyObj.homepage.isPublic = false;

console.log('origin', origin); //{ name : 'Dana', age : 30, homepage : { blog : 'string', instagram : 'string', isPublic : true } } ;
console.log('deepCopyObj', deepCopyObj); // { name : 'Bob', age : 30, url : { image : 'string', path : 'string', isPublic : false } } 

console.log(origin === deepCopyObj); //false

 

๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ–ˆ๋”๋‹ˆ object๊ฐ€ ์˜๋„ํ–ˆ๋˜ ๋Œ€๋กœ ์ž˜ ๋ณต์‚ฌ๋˜์—ˆ๋‹ค!

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋„ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ getDeepCopy์˜ if ์กฐ๊ฑด๋ฌธ์—์„œ null ์ฒดํฌ๋Š” ์™œ ํ•˜๋Š” ๊ฑด์ง€ ์˜๋ฌธ์ด ๋“ค์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค๋‹ค.

๋งŒ์•ฝ null ์ฒดํฌ๋ฅผ ๋บ€๋‹ค๋ฉด,

if๋ฌธ์€  ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ obj์˜ ํƒ€์ž…์ด 'object'๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์•„์ฃผ ์žฌ๋ฐŒ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ,

typeof null์„ console์— ์ฐ์œผ๋ฉด 'object'๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค!!

 

์›์ธ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ดˆ๊ธฐ์˜ ์˜ค๋ฅ˜๊ฐ€ ์—ฌํƒœ๊ป ์ด์–ด์ง€๊ณ  ์žˆ์–ด์„œ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ null์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด

if๋ฌธ์„ ํƒ€์ง€ ์•Š๊ฒŒ ๋˜๊ณ  null์€ ๋ฐ˜๋ณต์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ ์‹คํ–‰ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


์˜ค๋Š˜ ํ•˜๋ฃจ ํšŒ๊ณ 

์–ด์ œ๋Š” ๊ฐ•์˜๋ฅผ ์—ฐ์†์œผ๋กœ ๋“ฃ๊ณ  ๋‚œ ํ›„์— ๋ณต์Šต์„ ํ•˜๋ฉด์„œ TIL์„ ์ž‘์„ฑํ–ˆ๋‹ค.

๊ฐ•์˜๋ฅผ ์—ฐ์†ํ•ด์„œ ๋“ค์œผ๋‹ˆ ์ง„๋„๋ฅผ ๋นจ๋ฆฌ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ง€๋ง‰์— ๋ณต์Šตํ•˜๋ฉฐ TIL์„ ์ž‘์„ฑํ•ด๋ณด๋‹ˆ, ๊ฐ•์˜๋ฅผ ๋“ฃ๋Š” ์ค‘์—๋Š” ๋‹ค ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ

๋ง‰์ƒ ๋‚ด ์–ธ์–ด๋กœ ํ’€์–ด์„œ ์“ฐ๋ ค๊ณ  ํ•˜๋‹ˆ ์™„์ „ํžˆ ์ดํ•ด๋ฅผ ํ•˜์ง€ ๋ชป ํ–ˆ๋Š”์ง€ ๋‚ด ๋ง๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ๊ฐ•์˜ ์ง„๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ 

ํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ ๋‚˜์„œ ๋ณต์Šตํ•˜๋ฉฐ ๋‚ด ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•ด ๋ณด์•˜๋Š”๋ฐ,

๋‚˜์—๊ฒŒ๋Š” ์˜ค๋Š˜ ํ–ˆ๋˜ ๋ฐฉ์‹์ด ๋” ์ž˜ ์™€๋‹ฟ์•˜๋‹ค.

 

๊ทธ๋™์•ˆ ์–•์€ ๋ณต์‚ฌ - ๊นŠ์€ ๋ณต์‚ฌ๋ผ๋Š” ๋ง์€ ๋งŽ์ด ๋“ค์–ด๋ดค์ง€๋งŒ ์ž์„ธํ•œ ๋œป์€ ์•Œ์ง€ ๋ชป ํ–ˆ๋Š”๋ฐ

์˜ค๋Š˜ ์ œ๋Œ€๋กœ ๊ณต๋ถ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.