λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT

μžλ°”μŠ€ν¬λ¦½νŠΈ ν˜Έμ΄μŠ€νŒ…(Hoisting): μ½”λ“œ μ‹€ν–‰ μ „μ˜ λ™μž‘ λ©”μ»€λ‹ˆμ¦˜

by πŸ’²πŸŽ΅βœ–οΈβœ”οΈβ˜Ό 2024. 2. 26.
728x90

μžλ°”μŠ€ν¬λ¦½νŠΈ ν˜Έμ΄μŠ€νŒ…(Hoisting): μ½”λ“œ μ‹€ν–‰ μ „μ˜ λ™μž‘ λ©”μ»€λ‹ˆμ¦˜

1. ν˜Έμ΄μŠ€νŒ…μ˜ κ°œλ…

ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 μ„ μ–Έλœ λ³€μˆ˜ 및 ν•¨μˆ˜ 선언을 λŒμ–΄μ˜¬λ € λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜λŠ” λ™μž‘μ„ λ§ν•©λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œμ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ”λ°, μ½”λ“œ λ‚΄μ—μ„œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° 이전에 μ‚¬μš©ν•  수 μžˆλŠ” νŠΉμ§•μ„ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

2. ν˜Έμ΄μŠ€νŒ…μ˜ μœ λž˜μ™€ μ—­ν• 

ν˜Έμ΄μŠ€νŒ…μ΄λΌλŠ” μš©μ–΄λŠ” "λŒμ–΄ μ˜¬λ¦¬λ‹€"λΌλŠ” 뜻으둜, 초기 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό μ²˜λ¦¬ν•  λ•Œ μ„ μ–Έλœ λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λ¨Όμ € λ©”λͺ¨λ¦¬μ— μ˜¬λ¦¬λŠ” νŠΉμ§•μ—μ„œ λΉ„λ‘―λ©λ‹ˆλ‹€.

ν˜Έμ΄μŠ€νŒ…μ€ 주둜 λ‹€μŒκ³Ό 같은 역할을 ν•©λ‹ˆλ‹€.

  • λ³€μˆ˜ 및 ν•¨μˆ˜ μ„ μ–Έ λŒμ–΄μ˜¬λ¦¬κΈ°: μ„ μ–Έλœ λ³€μˆ˜μ™€ ν•¨μˆ˜λŠ” μ½”λ“œ μ‹€ν–‰ 이전에 λ©”λͺ¨λ¦¬μ— λŒμ–΄μ˜¬λ €μ Έ, 이후에 μ°Έμ‘°ν•  수 있게 λ©λ‹ˆλ‹€.

3. ν˜Έμ΄μŠ€νŒ…μ˜ λ™μž‘ 원리

3.1. λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

console.log(myVar); // undefined
var myVar = 10;
console.log(myVar); // 10

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ—μ„œ var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έκ³Ό 할당이 ν•œ λ²ˆμ— 이루어지며, μ„ μ–ΈλΆ€κ°€ λŒμ–΄μ˜¬λ €μ Έ undefined둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

3.2. ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

sayHello(); // "Hello, World!"
function sayHello() {
  console.log("Hello, World!");
}

ν•¨μˆ˜ 선언식은 전체가 ν˜Έμ΄μŠ€νŒ…λ˜μ–΄ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜κ°€ μ„ μ–Έλ˜κΈ° 전에 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

3.3. ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œμ˜ ν˜Έμ΄μŠ€νŒ…

sayHi(); // TypeError: sayHi is not a function
var sayHi = function() {
  console.log("Hi!");
};

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œλŠ” λ³€μˆ˜λ§Œ ν˜Έμ΄μŠ€νŒ…λ˜μ–΄ μ„ μ–ΈλΆ€κ°€ λŒμ–΄μ˜¬λ €μ§€μ§€λ§Œ, ν•¨μˆ˜ μžμ²΄λŠ” λŒμ–΄μ˜¬λ €μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 호좜이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

4. ν˜Έμ΄μŠ€νŒ…μ˜ μž₯단점

4.1. μž₯점

  • μ½”λ“œ 이해 μš©μ΄μ„±: ν˜Έμ΄μŠ€νŒ…μ„ μ΄ν•΄ν•˜λ©΄ μ½”λ“œμ˜ λ™μž‘μ„ μ˜ˆμΈ‘ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  • μ„ μ–Έμ˜ μˆœμ„œμ™€ 관계 없이 μ‚¬μš©: μ„ μ–Έ μˆœμ„œμ™€ μ‹€ν–‰ μˆœμ„œμ˜ 뢈일치둜 μΈν•œ μ—λŸ¬λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

4.2. 단점

  • 버그 λ°œμƒ κ°€λŠ₯μ„±: μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μœΌλ‘œ 인해 버그가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 가독성 ν•˜λ½: μ½”λ“œ μž‘μ„±μžκ°€ μ˜λ„ν•œ μ‹€ν–‰ μˆœμ„œμ™€ ν˜Έμ΄μŠ€νŒ… λ™μž‘μ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ„ 경우 가독성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.

5. μ—°κ΄€λœ 기술: ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό ν•¨μˆ˜ 선언식

ν˜Έμ΄μŠ€νŒ…κ³Ό κ΄€λ ¨λœ 기술둜 ν•¨μˆ˜ ν‘œν˜„μ‹κ³Ό ν•¨μˆ˜ 선언식이 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ 선언식은 전체가 ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜λ§Œ ν˜Έμ΄μŠ€νŒ…λ˜λ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

// ν•¨μˆ˜ 선언식
function add(a, b) {
  return a + b;
}

// ν•¨μˆ˜ ν‘œν˜„μ‹
var multiply = function(a, b) {
  return a * b;
};

6. κ²°λ‘ 

ν˜Έμ΄μŠ€νŒ…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§• 쀑 ν•˜λ‚˜λ‘œ, μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μ΄ν•΄ν•˜λŠ” 데에 μžˆμ–΄ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€. μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높이렀면 ν˜Έμ΄μŠ€νŒ… λ™μž‘μ„ 잘 μ΄ν•΄ν•˜κ³  적절히 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λŒ“κΈ€