April 04, 2020
Javascript를 사용하는 개발자라면 익숙한 현상인 hoisting
은 블록 단위에서 선언문(변수, 함수)이 블록의 최상단으로 끌어 올려지는 현상이다. 코드로 이해해보자.
console.log(a)
var a = 'test'
# undefined
위의 코드는 오류가 나야 될 거 같은데 javascript에서는 오류가 발생하지 않는다. 변수의 선언문이 블록의 최상단으로 끌어 올려져 선언이 먼저 됐기 때문인데, 이런 현상을 hoisting이라고 한다. 주의할 점은 선언만 되기 때문에 값이 할당되어 있지는 않다.
이 글의 주제는 hoisting에 대한 설명보다는 Python에서도 hoisting이 존재하는 가에 대한 글이기 때문에 더 자세한 설명은 여기서 확인해 보자.
그렇다면 이런 현상은 javascript에서만 존재하는 것일까? 결론만 말하자면 아니다.
아래 python 코드를 보도록 하자.
a = 1
def hoisting():
print(a)
a = 2
hoisting()
이 코드를 실행하면 어떻게 될까? 오류 없이 1이 출력되고 a에는 2가 할당될 거 같지만
UnboundLocalError: local variable 'a' referenced before assignment
오류를 내뿜고 있는 터미널을 확인할 수 있을 것이다. 왜 이런 현상이 발생하는 것일까? 바로 python에도 hoisting 현상이 발생하기 때문이다. 코드를 보면서 같이 이해해보자.
def hoisting():
print(a)
a = 2
글로벌 변수로 a가 선언되어 있었지만 함수 내에서는 a라는 변수가 다시 선언되어 있다. python 인터프리터는 이 사실을 알고 a 변수 선언을 함수 최상단으로 이동시킨다. 그렇다면 왜 오류가 발생한 것일까? 😧 바로 undefined 객체가 있는 javascript와는 다르게 python에서는 값을 할당하기 전에는 변수를 참조할 수 없기 때문이다. 아래 코드를 보면 오류가 발생하지 않는 걸 확인할 수 있다.
a = 1
def hoisting():
print(a)
b = 2
hoisting()
# 1
python에도 hoisting 현상이 존재한다. 다만 javascript와는 다르게 python에는 값 없이 변수에 참조할 수 없기 때문에 변수를 함수 최상단에 선언하는 hoisting 현상이 발생해도 오류가 발생한다. 😃