๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

0. ๋ฏธ๋ฆฌ๋ณด๋Š” ๊ฒฐ๋ก 

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

 

1. ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •


- ๋ฐ์ดํ„ฐ ์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.
- ๊ฐ’์„ ์žฌํ• ๋‹นํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

1) ๋ฐ”๊พธ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
2-1) ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค
2-2) ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ƒˆ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค.
3) ์žฌํ• ๋‹น ๊ณผ์ •์—์„œ ์ฐธ์กฐ๋˜๊ณ ์žˆ์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋Š” GC๊ฐ€ ๋ณ„๋„๋กœ ์ปฌ๋ ‰ํŒ…ํ•ด๊ฐ„๋‹ค.

 

2. ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…

var a = 'abc';
var b = 'aaa';
a = 'aaa';

๋ณ€์ˆ˜ a์˜ ๋ฐ์ดํ„ฐ๋Š” 'abc'๋ฅผ 'aaa'๊ฐ’์œผ๋กœ ๋ฐ”๊พผ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, 'aaa'๋กœ ์žฌํ• ๋‹นํ•œ ๊ฒƒ์ด๋‹ค. @5003์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , @5004๋ฅผ ์žฌํ• ๋‹นํ•˜๋ฉฐ, ํ›„์— @5003์€ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ์ˆ˜๊ฑฐํ–ˆ๋‹ค.

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

                                 4

3. ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๊ฐ’์ด ๋‹ด๊ธด ์ฃผ์†Ÿ๊ฐ’๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

var obj1: { a : 1 , b : 'aaa' };
obj1.a = 'aaa';

 

obj1์€ obj1.a๋ผ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋์Œ์—๋„, obj1 ์ฃผ์†Œ๊ฐ’์€ @5002๋กœ ์˜ˆ์ „๊ณผ ๋™์ผํ•˜๋‹ค.
๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ํ• ๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฃผ์†Ÿ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ์ฑ„ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด obj1์˜ ๋ฐ์ดํ„ฐ๋Š” @5002๋กœ ๋™์ผํ•˜์ง€๋งŒ ๊ทธ ์•ˆ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์€ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ(@5002)์˜ ๊ฐ’์ธ @7001~์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์  ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€์„ฑ์„ ๋ˆ๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ์ •๋ฆฌ

๋ถˆ๋ณ€์„ฑ๊ณผ ๊ฐ€๋ณ€์„ฑ์„ ๋…ผํ•˜๊ธฐ ์œ„ํ•ด์„ , Primitive type, Non-primitive type์œผ๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•ด์ง„๋‹ค. ๋ชจ๋“  JS์˜ ๋ณ€์ˆ˜๋Š” Primitive type์— ๋ณ€์ˆ˜ ํ• ๋‹น ๊ณผ์ •์„ ๋”ฐ๋ฅธ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ๋ฌถ์Œ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Non-primitive type์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ์–˜๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. Non-primitive type์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด, ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€์˜ ๊ฐ’์€ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋˜๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์˜์—ญ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Non-primitive type์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ, Non-primitive type์˜ ์ฃผ์†Ÿ๊ฐ’์€ ๋™์ผํ•˜์ง€๋งŒ, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๋ณ€์ˆ˜(Non-primitive type)์˜ ๊ฐ’์€ ๊ฐ™์•„๋„ ๊ทธ ์•ˆ์˜ ๋ฐ์ดํ„ฐ(๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋˜๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์˜์—ญ)๋Š” ๋‹ฌ๋ผ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์„ฑ์งˆ์„ ๊ฐ€๋ณ€์„ฑ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

5. ์ถ”๊ฐ€

๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ ์ „์˜ ๋ฐ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š”์ง€์— ๋”ฐ๋ผ ๋ถˆ๋ณ€๊ฐ’๊ณผ ๊ฐ€๋ณ€๊ฐ’์ด ๋‚˜๋‰œ๋‹ค.

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

 

6. ๊ฐ€๋ณ€์„ฑ์ด๋ž€ ์›๋ณธ์˜ ํ›ผ์† ๊ฐ€๋Šฅ์„ฑ์„ ๋œปํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

var a = 1
var b = a
a = 9999

console.log(b) // 100

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

var obj1 = {a:1}
var obj2 = obj1
obj1.a = 9999

console.log(obj2.a) // 9999

- obj1์€ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ณ , ์ด๋ฅผ obj2๊ฐ€ ๋ณต์‚ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— obj1์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€ํ•จ์— ๋”ฐ๋ผ obj2์˜ ํ”„๋กœํผํ‹ฐ๋„ ๋ณ€ํ•œ๋‹ค. obj2๋ผ๋Š” ์›๋ณธ์ด obj1์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌํ• ๋‹นํ•˜๋ฉด ๊ฐ’์ด ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ›ผ์†๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋ณ€๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค.

var obj1 = {a:1}
var obj2 = {...obj1}
obj1.a = 9999

console.log(obj2.a) // 1

- obj2๋Š” {}, ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— obj1๊ณผ obj2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.  ๊ทธ ํ›„ obj2๋Š” Spread Operator๋ฐฉ์‹์œผ๋กœ obj1์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ–ˆ๋‹ค. obj1์ด ์ค‘์ฒฉ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š” ์ด์ƒ, obj2์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์„ ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๋ณต์‚ฌํ•ด์™€, obj1์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€ํ•˜๋”๋ผ๋„ obj2์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, obj2๋ผ๋Š” ์›๋ณธ์„ ํ›ผ์†์‹œํ‚ค์ง€ ์•Š์•„, ๋ถˆ๋ณ€๊ฐ’์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•