์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…

2021. 8. 14. 22:11ใ†๐Ÿ“š Book/Core Javascript

 

๋ณธ ํฌ์ŠคํŒ…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋Š์ •๋„ ์ ‘ํ•ด๋ณธ ํ›„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜๋ฌธ์ ์„ ์‹ฌ๋„์žˆ๊ฒŒ ๋‹ค๋ฃจ๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

์ฃผ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋”ฐ๋ฅธ ์ฐธ์กฐ ๋ฐฉ์‹ : ํ”ํžˆ call by value, call by reference ๋ผ ์•Œ๋ ค์ง„ ๊ฐœ๋…
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ถˆ๋ณ€์„ฑ : ๊ฐ€๋ณ€ ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€ ๊ฐ์ฒด
  • undefined ์™€ null ์ฐจ์ด

 

๐Ÿ—“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜ ํƒ€์ž…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํฌ๊ฒŒ ๊ธฐ๋ณธํ˜•(primitive type) ๊ณผ ์ฐธ์กฐํ˜•(reference type) ๋‘ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ธฐ๋ณธํ˜•(๋ฌธ์žํ˜•, ์ˆซ์žํ˜•, ๋ถˆ๋ฆฐ ๊ฐ’ ๋“ฑ) ๊ณผ ์ฐธ์กฐํ˜•(๋ฐฐ์—ด, ๋‚ ์งœ, ํ•จ์ˆ˜ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์˜ ์‹๋ณ„์ž์— ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•  ๋•Œ, 

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

์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋ณ€์ˆ˜ ํ• ๋‹น์„ ํ†ตํ•ด ๊ณผ์ •์„ ์ดํ•ดํ•ด๋ด…์‹œ๋‹ค.

 

์‹๋ณ„์ž์™€ ๋ณ€์ˆ˜

๋ณ€์ˆ˜: ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€ -> ๋ฐ˜๋“œ์‹œ ์ˆซ์ž์—ฌ์•ผ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ '๋ฌด์–ธ๊ฐ€' ๋Š” ๋ฐ์ดํ„ฐ,

์‹๋ณ„์ž: ๋ฌด์–ธ๊ฐ€(๋ฐ์ดํ„ฐ)์˜ ์ด๋ฆ„, ์ฆ‰ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

 

let a = 20; ์—์„œ ์‹๋ณ„์ž๋Š” a, ๋ณ€์ˆ˜๋Š” 20์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ a ์—ญ์‹œ ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ, ์—„๊ฒฉํžˆ ์ •์˜ํ•˜๋ฉด a ๋Š” ์‹๋ณ„์ž์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

 

๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ํ• ๋‹น ๊ณผ์ •

1) ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ์„ ์–ธ๊ณผ ํ• ๋‹น

์ด์ œ ์‹๋ณ„์ž a ์— ๋ณ€์ˆ˜ 'abc'๋ฅผ ํ• ๋‹นํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์‹๋ณ„์ž a์˜ ์„ ์–ธ๊ณผ, ๋ณ€์ˆ˜ 'abc'๋ฅผ ํ• ๋‹น ํ•˜๋Š” 2๊ณผ์ •์„ ๋ฌถ์–ด ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ๋ฐ์ดํ„ฐ '์ฃผ์†Œ'๊ฐ’์„ ํ• ๋‹น ๋ฐ›๋Š” ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let a = 'abc'

1) ์šฐ์„  ๋ฉ”๋ชจ๋ฆฌ์˜ @1003 ์ฃผ์†Œ์— ์‹๋ณ„์ž a์˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™•๋ณด๋œ ๊ณต๊ฐ„์˜ ์‹๋ณ„์ž๋ฅผ a ๋กœ ์ง€์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2) ๋นˆ ๊ณต๊ฐ„ @5004์— ๋ฌธ์ž์—ด 'abc'๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

3) a ์‹๋ณ„์ž์˜ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ (@1003), ์•ž์„œ ์ €์žฅํ•œ 'abc'์˜ ์ฃผ์†Œ(@5004)๋ฅผ @1003์˜ ๊ณต๊ฐ„์— ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

 

@1003์˜ ์œ„์น˜์— 'abc' ๋ฅผ ์ง์ ‘ ๋Œ€์ž… ๋Œ€์‹  ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ์ด์œ ๋Š”,

๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(ํ•œ๋‹จ๊ณ„ ๊ฑฐ์ณ ๋Œ€์ž…์„ ํ–ˆ์ง€๋งŒ, ์ด๊ฒƒ์ด ์ฐธ์กฐํ˜•์ด๋ž€ ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.)

 

2) ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ์„ ์–ธ๊ณผ ํ• ๋‹น

let obj1 = {
    a : 'like',
    b : 'lion'
}

 

1) ๋ณ€์ˆ˜ ์˜์—ญ @1003 ์ฃผ์†Œ์— ์‹๋ณ„์ž obj1์˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

2) obj1 ์— ์ €์žฅํ•˜๋ ค๋Š” ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœํผํ‹ฐ(์ง€๊ธˆ์€ 2๊ฐœ์ง€๋งŒ)๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผํ•˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ๋ณ€์ˆ˜์˜์—ญ(ํ”„๋กœํผํ‹ฐ ๋ณ€์ˆ˜ @7103, @7104)์„  ํ™•๋ณดํ•˜๊ณ , ํ•ด๋‹น ์˜์—ญ ๋ฒ”์œ„์˜ ์ฃผ์†Œ๋ฅผ @5001์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

2-1) @5001 ์ฃผ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ  "@7103 ~ ?" ๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” 7103 ๊ณผ 7104๋งŒ ๊ฐ’์ด ํ• ๋‹น๋ผ์žˆ์ง€๋งŒ, ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋” ์ƒ๊ธธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ฐ€๋ณ€์„ฑ์„ "@7103 ~  ?" ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ์Šต๋‹ˆ๋‹ค.

3) ๋ณ€์ˆ˜ ์˜์—ญ @7103  ๊ณผ @7104 ์ฃผ์†Œ์— ๊ฐ๊ฐ ์ฃผ์†Œ @5003, @5004 ๋ฅผ ๋ฐฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. @5003, @5004 ์ฃผ์†Œ์— ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ๊ฐ’๋“ค์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ฃผ์†Œ ์ง์ ‘ ๋Œ€์ž…  VS  ์ฐธ์กฐ ๋Œ€์ž…

๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„์ž์— ์ง์ ‘ ๋Œ€์ž…ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

1000๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ ํ›„, ๊ฐ™์€ ๊ฐ’(ex: 100)์„ ํ• ๋‹นํ•œ๋‹ค๋ฉด, 1000๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ 8๋ฐ”์ดํŠธ์˜ ์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๋Š” 8๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”) 

ํ•˜์ง€๋งŒ ์ง์ ‘ ๋Œ€์ž…์ด ์•„๋‹Œ ์ฐธ์กฐํ˜• ๋Œ€์ž… ๋ฐฉ์‹์€, ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ณ„๋„์˜ ์ฃผ์†Œ๊ณต๊ฐ„์— ๊ฐ’ 100์„ ํ• ๋‹น ํ•˜์—ฌ, ์„œ๋กœ ๋‹ค๋ฅธ 1000๊ฐœ์˜ ์‹๋ณ„์ž์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด๋ฅผ ์ˆซ์ž๋กœ ๋น„๊ตํ•˜์ž๋ฉด, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๋Œ€์ž…์‹œ 8000byte, ์ฐธ์กฐ ๋Œ€์ž…์‹œ 2008byte์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์†Œ์š”ํ•จ์œผ๋กœ ํ›„์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ๋” ์ข‹์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ์กฐ ์นด์šดํŠธ์™€ GC

๋ณ€์ˆ˜ a ์— 'abc' ๋ผ๋Š” ๊ฐ’์„ ์šฐ์„  ํ• ๋‹นํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๊ธฐ์กด a ๋ณ€์ˆ˜์— 'def' ๋ผ๋Š” ๊ฐ’์„ ์žฌํ• ๋‹น ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ์ฃผ์†Œ ์ฐธ์กฐ์˜ ๊ณผ์ •์œผ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let a = 'abc'
a = 'def'

๋ณ€์ˆ˜ a ๋Š” @5004 ์ฃผ์†Œ์˜ 'abc'๋ฅผ ๋ฐ”๋ผ๋ณด๋‹ค๊ฐ€,

์žฌํ• ๋‹น์ด ๋˜๋ฉด์„œ @5005 ์ฃผ์†Œ์˜ ๊ฐ’์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด @5003์€ ๋” ์ด์ƒ ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐธ์กฐ ์นด์šดํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ @5004์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋Š” 0์ด ๋˜๊ณ , @5005์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋Š” 1์ด ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ (Garbage Collector)

@5004 ์ฒ˜๋Ÿผ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0 ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜๊ฑฐ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜๊ฑฐ ๋Œ€์ƒ์ด ๋˜์—ˆ๋‹ค๊ณ  ์ฆ‰์‹œ ์ˆ˜๊ฑฐ(collecting) ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌํ™” ์ƒํƒœ์— ์ž„๋ฐ•ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ˆ˜๊ฑฐ ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜๊ฑฐ๋œ ์ฃผ์†Œ๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋นˆ ๊ณต๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค.

 

* ๋ณด์ถฉ์„ค๋ช…: @5004 ์ฃผ์†Œ์— ์ €์žฅ๋œ 'abc'๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , @5005 ์ฃผ์†Œ์— ์ƒˆ๋กœ์šด ๊ฐ’('def')๋ฅผ ์ €์žฅํ•˜์—ฌ ์‹๋ณ„์ž a์— ํ• ๋‹นํ•˜์˜€๋‹ค.

์ฝ”๋“œ์ƒ์œผ๋กœ ๋ณผ ๋• a ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋์œผ๋‹ˆ ๋ถˆ๋ณ€์„ฑ์ด ์ง€์ผœ์ง€์ง€ ์•Š์•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, @5004 ์ฃผ์†Œ์˜ 'abc'๊ฐ€ ๋ณ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ์ด ์ง€์ผœ์กŒ๋‹ค.

 

๐Ÿ—“  ๊ฐ€๋ณ€์„ฑ ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ฐธ์กฐํ˜• ๊ฐ์ฒด ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1) ๊ฐ€๋ณ€ ๊ฐ์ฒด

 

user ๊ฐ์ฒด๋ฅผ user2 ๋ผ๋Š” ๋ณ€์ˆ˜์— ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด name ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

changeName() ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ newUser.name = newName ํ‘œํ˜„์‹์œผ๋กœ name ํ”„๋กœํผํ‹ฐ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ธฐ์กด user ๊ฐ์ฒด์˜ name ํ”„๋กœํผํ‹ฐ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ์‹œํ‚ต๋‹ˆ๋‹ค.  ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฐธ์กฐํ˜• ๋Œ€์ž… ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

user2 ๊ฐ์ฒด์˜ name ์„ ๋ณ€๊ฒฝํ•  ๋•Œ, user ๊ฐ์ฒด์˜ name ๋„ ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— user ๋Š” ๊ฐ€๋ณ€๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

let user = {
    name: "hoo",
    gender: 'male'
}

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

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

console.log('user: ', user)  // user:  {name: "LIM", gender: "male"}
console.log('user2: ', user2)  // user2:  {name: "LIM", gender: "male"}

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฅผ ์›ํ–ˆ๋‹ค๋ฉด, ๊ตณ์ด user ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ user2๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

2) ๋ถˆ๋ณ€ ๊ฐ์ฒด

 

copyUser() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด user ์™€ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

copyUser() ํ•จ์ˆ˜๋กœ ๋ฆฌํ„ด๋œ ๊ฐ์ฒด๋Š” copiedUser ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๊ณ ,  user ์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ์ฒด์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด์˜ user ๊ฐ์ฒด๋ฅผ ๋ณ€ํ•˜์ง€ ์•Š๋Š”, ์ฆ‰ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถˆ๋ณ€๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ถˆ๋ณ€์„ฑ์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ ๋ผ๊ณ  ์ธ์ง€๋งŒ ํ•˜๊ณ  ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let user = {
    name: "hoo",
    gender: 'male'
}

let copyUser = (user, newName) => {
    return {
        name: newName,
        gender: user.gender
    }
}

let copiedUser = copyUser(user, "LIM")

console.log('user: ', user)  // user:  {name: "hoo", gender: "male"}
console.log("copiedUser: ", copiedUser)  // copiedUser:  {name: "LIM", gender: "male"}

user ์˜ ๋ถˆ๋ณ€์„ฑ์€ ์ง€์ผฐ์ง€๋งŒ ์œ„ ์ฝ”๋“œ์˜ ํ•จ์ •์„ ํŒŒ์•…ํ•˜์‹  ๋ถ„๋„ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

gender ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ์กด user ๊ฐ์ฒด ๊ฐ’์—์„œ ๊ฐ€์ ธ์™”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณค ๋”ฑํžˆ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Š๋‚Œ์ด ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด user์˜ ํ”„๋กœํผํ‹ฐ(name, gender) ๋ฅผ ์ผ์ผ์ด ํ•˜๋“œ์ฝ”๋”ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10๊ฐœ๋งŒ ๋„˜์–ด๋„, ์ด๋ฅผ ์ผ์ผ์ด ์ ์œผ๋ฉฐ ๋ณต์‚ฌํ•˜๋Š” ์ผ์ด ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋Š๊ปด์งˆ๊ฒ๋‹ˆ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์–•์€๋ณต์‚ฌ)

let copyUser = (user, newName) => {
    let result = {};
    for (var prop in target){
	    result[prop] = target[prop]
    }
    return result
}

 

์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด์„œ, ๋ถˆ๋ณ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์—ญ์‹œ ์–•์€ ๋ณต์‚ฌ๋ผ๋Š” ํ•œ๊ณ„์— ๋ด‰์ฐฉํ•ฉ๋‹ˆ๋‹ค. 

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„  ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ๋” ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ—“  undefined / null

undefined์™€ null ๋ชจ๋‘ '์—†์Œ'์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, ๋‘˜์˜ ์˜๋ฏธ์™€ ์šฉ๋„๋Š” ๋ฏธ์„ธํ•˜๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

undefined ๋Š” 1) ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์™€ 2) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

2)์˜ ๊ฒฝ์šฐ๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ฃ .

 

1. ๊ฐ’์„ ๋Œ€์ž…ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ 

let a; // undefined

 

2. ๊ฐ์ฒด ๋‚ด๋ถ€์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ 

let obj = {
     'title' : 'junior-datalist'
}

obj.subtitle // undefined

3. return ๋ฌธ์ด ์—†๊ฑฐ๋‚˜ ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ

function solution(){
    let a = 1;
}

solution() // undefined

 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” 1)์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ undefined ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  null ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ '๋น„์–ด์žˆ์Œ'์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์„ ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋ถ€์—ฌํ•œ ๊ฒƒ์ธ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ถ€์—ฌํ•œ ๊ฒƒ(null ๊ฐ’ ๋ถ€์—ฌ)์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ…  ์ •๋ฆฌํ•˜์ž๋ฉด, undefined ๋Š” ์–ด๋–ค ๋ณ€์ˆ˜์— ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•œ ๊ฒƒ, null์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ '์—†์Œ'์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

 

 

 

* ์ฐธ๊ณ 

- ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ( ์ •์žฌ๋‚จ )

- https://evan-moon.github.io/2020/01/05/what-is-immutable/

'๐Ÿ“š Book > Core Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ปจํ…์ŠคํŠธ  (0) 2021.09.26