Programming/JavaScript

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 04μž₯ λ³€μˆ˜

yuri lee 2023. 5. 16. 22:55
λ°˜μ‘ν˜•
이 글은 λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

 

4.1 λ³€μˆ˜λž€ 무엇인가? μ™œ ν•„μš”ν•œκ°€? 


 

μ»΄ν“¨ν„°λŠ” CPUλ₯Ό μ‚¬μš©ν•΄ μ—°μ‚°ν•˜κ³ , λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•΄ 데이터λ₯Ό κΈ°μ–΅ν•œλ‹€. λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간 자체 λ˜λŠ” κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름을 λ§ν•©λ‹ˆλ‹€.

 

4.2 μ‹λ³„μž


λ³€μˆ˜ 이름을 μ‹λ³„μžλΌκ³ λ„ ν•©λ‹ˆλ‹€. μ‹λ³„μžλŠ” μ–΄λ–€ 값을 κ΅¬λ³„ν•΄μ„œ 식별할 수 μžˆλŠ” κ³ μœ ν•œ 이름을 λ§ν•©λ‹ˆλ‹€. μ‹λ³„μžλŠ” 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉 λ©”λ‘œμ΄ μ£Όμ†Œμ— 뢙인 이름이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ³€μˆ˜, ν•¨μˆ˜, ν‹€λž˜μŠ€ λ“±μ˜ 이름은 λͺ¨λ‘ μ‹λ³„μžμž…λ‹ˆλ‹€.

 

4.3 λ³€μˆ˜ μ„ μ–Έ


λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ 선언이 ν•„μš”ν•©λ‹ˆλ‹€. μ„ μ–Έ μ‹œμ—λŠ” var, let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.  var ν‚€μ›Œλ“œμ˜ 경우 λΈ”λž™ 레벨 μŠ€μ½”ν”„κ°€ μ•„λ‹Œ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— μ „μ—­ λ³€μˆ˜ μ„ μ–Έ μ‹œ μ‹¬κ°ν•œ λΆ€μž‘μš©μ΄ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€

var score;

λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 이후, λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ js 엔진에 μ˜ν•΄ undefined λΌλŠ” 값이 μ•”λ¬΅μ μœΌλ‘œ ν• λ‹Ήλ˜μ–΄ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

 

- μ„ μ–Έ 단계 : λ³€μˆ˜ 이름을 λ“±λ‘ν•΄μ„œ js엔진에 λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œλ¦½λ‹ˆλ‹€.

- μ΄ˆκΈ°ν™” 단계 : 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό ν• λ‹Ήν•΄ μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.

 

var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ 선언은 μ„ μ–Έ 단계와 μ΄ˆκΈ°ν™” 단계가 λ™μ‹œμ— μ§„ν–‰λ©λ‹ˆλ‹€.

 

4.4 λ³€μˆ˜ μ„ μ–Έμ˜ μ‹€ν–‰ μ‹œμ κ³Ό λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…


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

js μ½”λ“œλŠ” 인터프리터에 μ˜ν•΄ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λ―€λ‘œ ReferenceErrorκ°€ λ°œμƒν•  κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, undefinedκ°€ 좜λ ₯λ©λ‹ˆλ‹€. λ³€μˆ˜ 선언이 μ†ŒμŠ€μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„μ΄ μ•„λ‹ˆλΌ κ·Έ 이전 λ‹¨κ³„μ—μ„œ λ¨Όμ € μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

js 엔진은 μ†ŒμŠ€μ½”λ“œλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜κΈ° 전에 λ¨Όμ € μ†ŒμŠ€μ½”λ“œμ˜ 평가 과정을 κ±°μΉ˜λ©΄μ„œ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€. λ³€μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” js 고유의 νŠΉμ§•μ„ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… (variable hoisting)이라고 ν•©λ‹ˆλ‹€. var, let, const, function, function * , class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ„ μ–Έν•˜λŠ” λͺ¨λ“  μ‹λ³„μž (λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±)은 ν˜Έμ΄μŠ€νŒ… λ©λ‹ˆλ‹€.

 

4.5 κ°’μ˜ ν• λ‹Ή 


var score:; // λ³€μˆ˜ μ„ μ–Έ
score = 80; // κ°’ ν• λ‹Ή

var score = 80; // λ³€μˆ˜ μ„ μ–Έ, κ°’ ν• λ‹Ή λ™μ‹œμ—

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

console.log(score); // undefined

score = 80;
var score;

console.log(score); // 80

 

4.6 κ°’μ˜ μž¬ν• λ‹Ή


var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— undefined둜 μ΄ˆκΈ°ν™” 되기 λ•Œλ¬Έμ— μ—„λ°€νžˆ λ§ν•˜λ©΄ λ³€μˆ˜μ— 처음 값을 ν• λ‹Ήν•˜λŠ” 것도 μž¬ν• λ‹Ήμ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μž¬ν• λ‹Ήμ€ λ³€μˆ˜μ— μ €μž₯된 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€. 값을 μž¬ν• λ‹Ή ν•  수 μ—†λ‹€λ©΄ μƒμˆ˜μž…λ‹ˆλ‹€.

 

4.7 μ‹λ³„μž 넀이밍 κ·œμΉ™ 


4가지 μœ ν˜•μ˜ 넀이밍 μΌ€μ΄μŠ€λ“€μ΄ 자주 μ“°μž…λ‹ˆλ‹€.

var firstName; // camelCase
var first_name; // snake_case
var FirstName // PascalCase
var strFirstName; // type + indetifier

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 일반적으둜 λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ˜ μ΄λ¦„μ—λŠ” 카멜 μΌ€μ΄μŠ€λ₯Ό, μƒμ„±μž ν•¨μˆ˜μ™€ 클래슀의 μ΄λ¦„μ—λŠ” 파슀칼 μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ°˜μ‘ν˜•