🚀 자바스크립트 호이스팅
안녕하세요, 여러분! 오늘은 자바스크립트를 배우는 분들이 처음에 헷갈려하는 개념인 '호이스팅(Hoisting)'에 대해 쉽게 알아보려고 합니다. 마법처럼 느껴지는 이 현상, 함께 파헤쳐볼까요? 🧙♂️
🎩 호이스팅이란? 마법 같은 코드 이동!
호이스팅(Hoisting)은 영어로 '끌어올리다'라는 뜻을 가지고 있어요. 자바스크립트에서는 코드를 실행하기 전에 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 것처럼 동작하는 특징을 말합니다.
"아직 선언하지 않은 변수와 함수를 먼저 사용해도 될까요?" 🤔
자바스크립트: "음... 선언부는 내가 알아서 위로 끌어올릴게! 단, 조건이 있어!" 😉
🔍 변수 호이스팅: var vs let/const
🧪 var의 호이스팅 실험
console.log(magicVar); // undefined (에러가 아니에요!)
var magicVar = "마법의 변수";
console.log(magicVar); // "마법의 변수"
위 코드는 실제로는 이렇게 해석됩니다:=
var magicVar; // 선언만 위로 끌어올려짐
console.log(magicVar); // undefined
magicVar = "마법의 변수"; // 할당은 원래 위치에서 실행
console.log(magicVar); // "마법의 변수"
🔒 let과 const의 비밀 - TDZ(임시 사각지대)
console.log(modernVar); // 🚫 ReferenceError!
let modernVar = "현대적인 변수";
ES6에서 도입된 let과 const는 호이스팅이 있지만 다르게 동작해요! 선언은 위로 끌어올려지지만, 초기화되기 전까지는 '임시 사각지대(TDZ)'에 갇히게 됩니다. 이 구간에서 변수에 접근하면 에러가 발생해요. 🚔
🦸♂️ 함수 호이스팅: 선언식 vs 표현식
💪 함수 선언식의 완전한 호이스팅
sayHello(); // "안녕하세요!" (문제 없이 작동!)
function sayHello() {
return "안녕하세요!";
}
함수 선언식은 함수 전체가 호이스팅되기 때문에, 선언 전에 호출해도 잘 작동합니다!
🤫 함수 표현식의 제한된 호이스팅
tryMe(); // 🚫 TypeError! (함수가 아닌 undefined를 호출)
var tryMe = function() {
return "시도해 보세요!";
};
함수 표현식은 변수 호이스팅 규칙을 따릅니다. var로 선언하면 선언만 호이스팅되고, let/const로 선언하면 TDZ의 영향을 받아요.
🎭 호이스팅 예시들: 실생활에 비유해보기
🏠 var는 집 짓기 전에 입주하는 것
console.log(house); // undefined (텅 빈 부지만 있음)
var house = "아름다운 집";
이것은 마치 집을 짓기도 전에 부지만 확보한 상태에서 입주하려는 것과 같아요! 부지(메모리 공간)는 있지만, 아직 집(값)은 없습니다.
🔑 let/const는 열쇠 받기 전에 입주하려는 것
console.log(secureLock); // 🚫 접근 불가! (TDZ)
let secureLock = "안전한 자물쇠";
이것은 집이 완성되고 열쇠를 받기 전에 들어가려는 것과 같아요! 보안 시스템이 작동해서 에러를 발생시킵니다.
🧠 호이스팅 이해하기: 실행 컨텍스트
자바스크립트 엔진은 코드를 실행하기 전에 먼저 전체 코드를 훑어보는 '생성 단계'를 거쳐요. 이때 변수와 함수 선언을 미리 메모리에 할당하고, 이후 '실행 단계'에서 코드를 순차적으로 실행합니다.
이것은 마치 책을 읽기 전에 목차를 훑어보는 것과 같아요! 📚
📌 실무에서의 팁: 호이스팅과 친해지기
- 선언을 상단에 모아두세요 ⬆️
- 가능하면 let과 const를 사용하세요 🛡️
- 함수 호출은 항상 선언 후에 하는 습관을 들이세요 📝
- 코드 예측 가능성을 높이세요 🔮
🎓 정리: 호이스팅 핵심 요약
- 호이스팅은 선언을 코드 최상단으로 끌어올리는 것처럼 동작하는 특징
- var: 선언과 undefined 초기화는 호이스팅되지만, 값 할당은 호이스팅되지 않음
- let/const: 선언은 호이스팅되지만, TDZ로 인해 초기화 전 접근 시 에러 발생
- 함수 선언식: 함수 전체가 호이스팅됨
- 함수 표현식: 변수 호이스팅 규칙을 따름
자바스크립트 호이스팅에 대해서 설명해주세요.
호이스팅(Hoisting) 은 자바스크립트가 코드를 실행하기 전에 변수와 함수 선언이 코드의 최상단으로 끌어올리는 것처럼 동작하는 특징입니다. 이 때문에 코드의 선언된 위치보다 상단에서 변수에 접근할 수 있는 것처럼 보일 수 있습니다.
한편, 호이스팅은 값 할당까지 끌어올리지는 않습니다. 예를 들어 var로 선언된 변수는 선언과 초기화는 끌어올려지지만 값 할당은 끌어올려지지 않기 때문에, 값 할당이 이뤄지기 전까지는 undefined로 평가됩니다. 예시는 다음과 같습니다.
console.log(myVar); // undefined
var myVar = 10;
console.log(myVar); // 10
반면, 함수 선언식은 함수 자체가 호이스팅되기 때문에, 함수 호출을 선언 이전에 해도 문제가 없습니다.
console.log(myFunction()); // 'Hello World' 출력
function myFunction() {
return 'Hello World';
}
단, ES6에서 도입된 let과 const는 선언문 이전에 접근하려고 하면 ReferenceError가 발생합니다.
이는 Temporal Dead Zone(TDZ) 이라는 개념 때문입니다. TDZ는 변수가 선언되었지만 초기화되기 전까지의 구간을 말합니다. let과 const로 선언된 변수에는 TDZ가 존재하며, 이 구간에서는 변수에 접근할 경우 ReferenceError가 발생합니다. TDZ는 코드에서 변수가 선언된 시점부터 초기화될 때까지의 구간에서 변수를 사용하지 못하게 막아주는 역할을 합니다.
console.log(myLet); // ReferenceError 발생
let myLet = 10;
참고로, let 변수는 선언 자체는 호이스팅되지만 초기화가 호이스팅되지 않습니다. 선언 즉시 undefined로 초기화되는 var와 다르게, let은 해당 라인의 코드가 실행될 때까지 초기화가 이루어지지 않는 것입니다.
지금까지의 내용을 정리하면, 호이스팅은 변수와 함수 선언을 코드 상단으로 끌어올리는 것처럼 동작하는 특징을 가리킵니다. var는 초기화 전에 접근 시 undefined로 나타나며, let과 const는 TDZ로 인해 초기화 전에 접근하면 ReferenceError를 발생시킵니다.
'1일 1CS(Computer Science)' 카테고리의 다른 글
자바스크립트 배열에 대해서 설명해주세요. (0) | 2025.04.11 |
---|---|
동일성과 동등성에 대해 설명해주세요 (0) | 2025.04.09 |
equals와 hashCode는 왜 함께 재정의해야 할까요? (0) | 2025.04.08 |
리액트의 Render Phase와 Commit Phase (0) | 2025.04.08 |
리액트의 Strict Mode에 대해서 설명해주세요. (0) | 2025.04.07 |