여러분은 JavaScript에서 선언하기도 전에 변수를 사용할 수 있다는 사실을 알고 계셨나요? 아니면 함수를 코드의 맨 아래에 정의해도 맨 위에서 호출할 수 있다는 것은요? 이런 마법 같은 일이 어떻게 가능한 걸까요? 바로 '호이스팅(Hoisting)'이라는 JavaScript의 독특한 특성 때문입니다.
호이스팅은 많은 주니어 개발자들이 처음 접했을 때 혼란스러워하는 개념 중 하나입니다. 하지만 걱정 마세요! 이 글을 통해 호이스팅의 모든 것을 파헤쳐 볼 테니까요. 자, 이제 JavaScript의 비밀 세계로 함께 떠나볼까요?
호이스팅(Hoisting)은 JavaScript에서 변수와 함수 선언이 그들이 포함된 스코프의 최상단으로 '끌어올려지는' 것처럼 동작하는 특성을 말합니다. 이는 코드가 실행되기 전에 JavaScript 엔진에 의해 처리되는 과정입니다.
예를 들어 보겠습니다:
console.log(myVar); // undefined
var myVar = 5;
이 코드는 에러를 발생시키지 않고 undefined를 출력합니다. 왜 그럴까요? 호이스팅 때문입니다!
var로 선언된 변수는 선언과 초기화가 분리되어 호이스팅됩니다.
console.log(x); // undefined
var x = 5;
이 코드는 내부적으로 다음과 같이 해석됩니다:
var x;
console.log(x); // undefined
x = 5;
let과 const도 호이스팅되지만, '일시적 사각지대(Temporal Dead Zone, TDZ)'라는 개념이 적용됩니다.
console.log(y); // ReferenceError: y is not defined
let y = 10;
let과 const는 선언은 호이스팅되지만, 초기화는 원래 위치에서 이뤄집니다. 따라서 선언 전에 접근하면 에러가 발생합니다.
함수 선언문은 전체가 호이스팅됩니다.
sayHello(); // "Hello!"
function sayHello() {
console.log("Hello!");
}
함수 표현식은 변수 선언만 호이스팅됩니다.
sayHi(); // TypeError: sayHi is not a function
var sayHi = function() {
console.log("Hi!");
};
호이스팅은 코드가 물리적으로 위로 옮겨지는 것이 아닙니다. 실제로는 컴파일 단계에서 메모리에 변수와 함수를 위한 공간을 미리 할당하는 것입니다.
var 대신 let과 const 사용하기호이스팅은 처음에는 복잡해 보일 수 있지만, 이해하고 나면 JavaScript의 강력한 도구가 될 수 있습니다. 이 개념을 잘 이해하면 예상치 못한 버그를 방지하고, 더 깔끔하고 효율적인 코드를 작성할 수 있습니다.
지금까지 배운 내용을 실제 코딩에 적용해 보세요. 그리고 기억하세요, 모든 개발자가 처음에는 주니어였답니다. 끊임없는 학습과 실천으로 여러분도 곧 JavaScript 마스터가 될 수 있을 거예요!
행운을 빕니다, 그리고 즐거운 코딩 되세요! 🚀