- 자바(Java)에도 호이스팅(Hoisting)이 적용될까?
- 호이스팅(Hoisting)이란?
호이스팅(Hoisting)은 주로 JavaScript와 같은 일부 언어에서 변수 선언이나 함수 선언을 해당 스코프의 최상단으로 끌어올리는 동작을 말한다. 호이스팅은 변수와 함수 선언이 실제 코드의 위치보다 앞서서 실행되는 것처럼 동작하도록 하는 것이며, 주로 컴파일러나 인터프리터의 동작 방식에 의해 이루어진다.
console.log(name); // undefined. 호이스팅으로 인해 에러 발생 X
var name = "yermi";
- Java에서 변수 선언 순서
Java에서 변수의 선언 순서는 변수가 사용되기 전에 해당 변수가 이미 선언되어 있어야 함을 의미한다. 변수는 선언된 위치부터 해당 블록 내에서 사용할 수 있으며, 사용하기 전에 선언되지 않은 변수는 컴파일 오류를 발생시킨다. 따라서 변수의 선언 순서가 중요하다.
System.out.println(name); // 컴파일 에러.
String name = "yermi";
- Java에서 메서드 선언 순서
Java에서는 메서드의 호출을 위해 해당 메서드의 선언 위치에 제한을 두지 않는다. 메서드는 선언된 위치와 상관없이 호출할 수 있다. 이는 Java 컴파일러가 전체 소스 코드를 분석하고 메서드 시그니처를 확인하여 호출 대상 메서드를 식별하기 때문이다. 컴파일러는 메서드 시그니처를 기반으로 호출 대상 메서드를 찾아내고, 런타임 환경에서 해당 메서드를 실행한다.
public void test1() {
test2();
} // test2는 test1 보다 뒤에 선언되었지만 변수처럼 에러가 발생하지 않는다.
public void test2() {
System.out.println("test입니다.");
}
- 메서드 시그니처를 기반으로 찾는 건 호이스팅이랑 다른가?
메서드 시그니처를 확인하여 호출 대상 메서드를 식별하는 것은 Java와 같은 정적 타입 언어에서 컴파일러가 사용되는 메서드를 식별하는 과정이다. 메서드 시그니처는 메서드의 이름과 매개변수의 타입, 반환값의 타입으로 구성된다. 컴파일러는 호출하는 코드에서 메서드의 이름과 매개변수의 타입, 순서를 기반으로 호출 대상 메서드를 찾아내며, 해당 메서드를 호출한다.
호이스팅은 JavaScript와 같은 동적 타입 언어에서 변수와 함수 선언을 스코프의 상단으로 옮기는 동작이기에, 두 개념은 서로 다른 언어와 동작 원리에 기반하고 있으며, Java에서는 호이스팅 개념이 적용되지 않는다.