πŸ“ŒLanguage/JavaScript

[Deep Dive] λ³€μˆ˜μ™€ ν˜Έμ΄μŠ€νŒ…

hellohailie 2022. 11. 30. 22:45

 

βœ”οΈ 이번 정독을 톡해 μ•Œκ²Œ 된 것
λ³€μˆ˜κ°€ μ™œ ν•„μš”ν•œμ§€?
ν˜Έμ΄μŠ€νŒ…μ΄λž€?

 

<λ‹΅ 미리보기>

πŸ€”λ³€μˆ˜κ°€ μ™œ ν•„μš”ν•œκ°€μš”?

πŸ€“ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό ν‰κ°€ν•˜λ €λ©΄ λ³€μˆ˜ 선언을 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ‹λ³„μžμ˜ 쑴재λ₯Ό μ•Œλ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

πŸ€”ν˜Έμ΄μŠ€νŒ…μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

πŸ€“ λ³€μˆ˜ 선언이 어디에 μžˆλ“ μ§€ 상관없이 μ–΄λ””μ„œλ“  λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•μ΄κΈ° λ•Œλ¬Έμ— λͺ¨λ“  λ³€μˆ˜, ν•¨μˆ˜, ν΄λž˜μŠ€λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚©λ‹ˆλ‹€. (λͺ¨λ“  선언문은 λŸ°νƒ€μž„ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έ!)

 


βœ”οΈ λ³€μˆ˜

λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 ν˜Ήμ€ κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름을 λ§ν•©λ‹ˆλ‹€. 

 

β–Έ λ³€μˆ˜μ— 값을 μ €μž₯ν•˜λŠ” 것을 할당이라고 ν•©λ‹ˆλ‹€. 

β–Έ λ³€μˆ˜μ— μ €μž₯된 값을 읽어 λ“€μ΄λŠ” 것을 참쑰라고 ν•©λ‹ˆλ‹€. 

β–Έ λ³€μˆ˜λͺ…을 μ‚¬μš©ν•΄μ„œ μ°Έμ‘°λ₯Ό ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜ 이름과 λ§΅ν•‘λœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•΄μ„œ μ €μž₯된 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 

 

πŸ’‘λ³€μˆ˜λͺ…을 지을 λ•Œμ—λŠ” λͺ…ν™•ν•œ 넀이밍해야 개발자의 μ˜λ„λ₯Ό λ‚˜νƒ€λ‚΄μ„œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κ³ , ν˜‘μ—…κ³Ό ν’ˆμ§ˆ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

λ³€μˆ˜λͺ…은 μ‹λ³„μžλΌκ³ λ„ λΆˆλ¦¬λŠ”λ° μ‹λ³„μžλŠ” 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 

λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름은 λͺ¨λ‘ μ‹λ³„μžμž…λ‹ˆλ‹€. 

 


βœ”οΈ ν˜Έμ΄μŠ€νŒ…

console.log(score); // undefined
var score; // λ³€μˆ˜ μ„ μ–Έλ¬Έ

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό ν•œ 쀄씩 순차적으둜 μ‹€ν–‰ν•˜κΈ°μ— μ•žμ„œμ„œ λͺ¨λ“  선언문을 λ¨Όμ € μ‹€ν–‰ν•˜λŠ” 평가 과정을 κ±°μΉ©λ‹ˆλ‹€. μ†ŒμŠ€μ½”λ“œμ˜ 평가 과정이 λλ‚˜λ©΄ λͺ¨λ“  선언문을 μ œμ™Έν•˜κ³  μ†ŒμŠ€μ½”λ“œλ₯Ό ν•œ 쀄씩 순차적으둜 μ‹€ν–‰ν•©λ‹ˆλ‹€. 

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜ 선언이 μ†ŒμŠ€μ½”λ“œ 어디에 μžˆλ“ μ§€ 상관없이 λ‹€λ₯Έ μ½”λ“œλ³΄λ‹€ λ¨Όμ € μ‹€ν–‰ν•œλ‹€. κ·Έλž˜μ„œ λ³€μˆ˜  선언이 어디에 μžˆλ“  상관없이 μ–΄λ””μ„œλ“  λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. =====> ν˜Έμ΄μŠ€νŒ…

 

λ©΄μ ‘ μ€€λΉ„ λ•Œλ¬Έμ— 달달 μ™Έμ› λ˜ ν˜Έμ΄μŠ€νŒ…μ— λŒ€ν•΄μ„œ λ”μš± λͺ…ν™•ν•˜κ²Œ μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 

 

ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•μ΄κΈ° λ•Œλ¬Έμ— var, let, const, function, class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  λ³€μˆ˜, ν•¨μˆ˜, ν΄λž˜μŠ€λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚©λ‹ˆλ‹€. (λͺ¨λ“  선언문은 λŸ°νƒ€μž„ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ—!)

 


πŸ”₯ var μ„ μ–Έ μ‹œμ—λŠ” ν˜Έμ΄μŠ€νŒ…κ³Ό λ™μ‹œμ— undefined둜 μ΄ˆκΈ°ν™” λ˜μ–΄ μ½˜μ†”μ— 찍어보면 undefinedλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•œνŽΈ, letκ³Ό const μ„ μ–Έ μ‹œμ—λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ˜μ§€λ§Œ undefined둜 μ΄ˆκΈ°ν™” λ˜μ§€λŠ” μ•ŠλŠ” TDZ에 μœ„μΉ˜ν•΄ μ½˜μ†”μ— 찍어보면 레퍼런슀 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

(μ°Έκ³ , λ³€μˆ˜μ— 값을 ν• λ‹Ήν•  λ•Œμ—λŠ” 이전 κ°’ undefinedκ°€ μ €μž₯λ˜μ–΄ 있던 λ©”λͺ¨λ¦¬ 곡간을 μ§€μš°κ³  κ·Έ λ©”λͺ¨λ¦¬ 곡간에 ν• λ‹Ή κ°’ 90을 μƒˆλ‘­κ²Œ μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  그곳에 할당값을 μ €μž₯ν•œλ‹€κ³  ν•©λ‹ˆλ‹€. )


βœ”οΈ λ³€μˆ˜ μ„ μ–Έκ³Ό μ‹€ν–‰ μ‹œμ μ˜ 차이

console.log(score); // undefined
var score = 90; // λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ή
console.log(score); // 90

 

 

λ³€μˆ˜ μ„ μ–Έκ³Ό κ°’μ˜ ν• λ‹Ήμ˜ μ‹€ν–‰ μ‹œμ μ΄ λ‹€λ¦…λ‹ˆλ‹€. 

λ³€μˆ˜ 선언은 μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ μΈ λŸ°νƒ€μž„ 이전에 λ¨Όμ € μ‹€ν–‰λ˜μ§€λ§Œ,

κ°’μ˜ 할당은 μ†ŒμŠ€μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ μΈ λŸ°νƒ€μž„μ— μ‹€ν–‰λ©λ‹ˆλ‹€. 

 

 


βœ”οΈ κ°’μ˜ μž¬ν• λ‹Ή

κ°’μ˜ μž¬ν• λ‹Ή = 이미 값이 ν• λ‹Ήλ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 λ˜λ‹€μ‹œ ν• λ‹Ήν•˜λŠ” 것

 

μ΄μ „μ˜ 할당값이 μ €μž₯λ˜μ–΄ 있던 λ©”λͺ¨λ¦¬ 곡간을 μ§€μš°κ³  μž¬ν• λ‹Ή 값을 μƒˆλ‘œ μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  κ·Έ λ©”λͺ¨λ¦¬ 곡간에 μž¬ν• λ‹Ή 값을 μ €μž₯ν•˜λŠ” 것이닀. μž¬ν• λ‹Ήμ΄ 이루어지면 μ΄μ „μ˜ λ©”λͺ¨λ¦¬κ³΅κ°„은 μ–΄λ–€ μ‹λ³„μžμ™€λ„ 연결이 λŠμ–΄μ§€κ²Œ 되고, 이런 λΆˆν•„μš”ν•œ 값듀은 가비지 μ½œλ ‰ν„°μ— μ˜ν•΄ λ©”λͺ¨λ¦¬μ—μ„œ μžλ™ ν•΄μ œλœλ‹€. 

 


βœ”οΈ 가비지 μ½œλ ‰ν„°

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬ 곡간을 주기적으둜 κ²€μ‚¬ν•΄μ„œ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” κΈ°λŠ₯이닀. 
(μ–΄λ–€ μ‹λ³„μžλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 곡간)

 

 

πŸ‘©‍πŸ’» λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Diveλ₯Ό μ •λ…ν•˜κ³  μ œκ°€ μ΄ν•΄ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. πŸ‘©‍πŸ’»