Hoisting

신인수신인수
2 min read

Hoisting이란?

javascript에서 Hoisting(호이스팅)은 변수나 함수 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 특성을 말합니다.

  • 끌어올리는 코드: 변수나 함수 선언 코드

  • 끌어올리지 않는 코드: 초기화 코드

// 코드
console.log(number); // undefined
var number = 5;      // 선언 & 초기화
console.log(number); // 5
===================================
// 내부 처리
var number;          // 선언
console.log(number); // undefined(초기화 전)
number = 5;          // 초기화
console.log(number); // 5

let과 const 변수로 선언 및 초기화

// 코드
console.log(number2); //ReferenceError
let number2 = 10      // 선언 & 초기화
console.log(number2); // 10
=========================
// 내부 처리
let number2;
console.log(number2); // ReferenceError
  • let과 const로 선언된 변수도 호이스팅이 가능합니다.

하지만 “일시적 사각지대(TDZ, Temporal Dead Zone)” 때문에 초기화 전에 접근하면 ReferenceError가 발생합니다.

var 변수는 호이스팅 시 초기화가 함께 이루어지기 때문에 TDZ가 없습니다.

함수 선언문과 함수 표현식

// 함수 선언문
eat();
function eat() {
    console.log("잘 먹겠습니다.");
}

// 함수 표현식
eatExpression(); // TypeError
var eatExpression = function() {
    console.log("잘 먹겠습니다.");
};
  • 함수 선언문은 호이스팅 시 전체 함수가 메모리에 올라가므로 선언 이전에도 호출이 가능합니다.

  • 함수 표현식은 변수에 함수를 할당하는 방식이기 때문에 변수의 호이스팅 규칙을 따릅니다.


Q] Hoisting in JAVA(?)

Java에서 변수 선언 순서

public class VariableTest {
    public static void main(String[] args) {
        System.out.printlnt(number); // number선언 X -> Error
    }
}
  • 변수 선언 순서는 변수가 사용되기 전에 해당 변수가 이미 선언되어 있어야 합니다.

  • 사용하기 전에 변수를 선언하지 않으면 컴파일 오류를 발생시킵니다.(변수 선언 순서 중요합니다.)

Java에서 메소드 선언 순서

public class MethodTest {
    public static void main(String[] args) {
        sayHelloWorld();
  }

    public static void sayHelloWorld() {
        System.out.println("Hello World!");
  } 
}
  • 메소드의 호출을 위해 해당 메소드의 선언 위치에 제한을 두지 않습니다.

  • Java Compiler가 전체 소스 코드를 분석하고 메소드 시그니처를 확인하여 호출 대상 Method를 식별하기 떄문입니다.

  • Compiler는 메소드 시그니처를 기반으로 호출 대상 Method를 찾아내고, 런타임 환경에서 해당 메소드를 실행합니다.

A] 아니요!

  • 자바에서 메소드는 시그니처 기반으로 검색하는 방식을 통해 호출이 선언보다 먼저 작성되어도 해당 메소드를 실행할 수 있습니다.

  • Hoisting 개념이 적용되지 않습니다.


요약

자바스크립트

  • 변수 선언 코드보다 참조하는 코드를 먼저 작성하면 Hoisting이 적용됩니다.

  • let, const와 같은 키워드를 사용하여 선언을 해도 Hoisting이 적용되지만 초기화는 Hoisting이 적용되지 않아 TDZ가 발생할 수 있습니다.

Java

  • 변수 선언과 참조의 순서는 중요합니다. 따라서 참조가 선언보다 먼저 작성된 경우 컴파일 에러가 발생합니다.

  • 메소드의 경우 Hoisting이 아니라 시그니처 기반으로 검색하여 선언과 호출의 순서에 상관없이 해당 메소드가 실행 될 수 있습니다.

0
Subscribe to my newsletter

Read articles from 신인수 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

신인수
신인수