프로그래머스 데브코스 70일차: 다시 Hoisting

박상하·2024년 1월 22일
0
post-thumbnail

다시 이해하는 호이스팅 🚀

호이스팅 포스팅은 벌써 4번째인가 쓰는 거 같은데 쓸 때마다 새롭게 무언가 알게된다. 텍스트로만 보았을때는

"변수와 함수가 맨 위로 올라온 거 같은현상"

이로 이해가 됐는데 프로그래밍을 공부 할 수록 깊이가 있는 현상임을 깨닫는다.

그래서 회사의 단골면접질문인가?!

const 그리고 초기화 🎯

자, 먼저 C언어에서 const는 선언과 초기화가 한번에 이루어져야한다고 한다.
그렇지 않고 초기화를 따로 하게되면 오류가 발생한다.

int main()
{
const int TEN = 10; 

return 0;
}

(이런식으로 되어야함)

먼저 초기화란 무엇일까? 🎯

초기화란 변수를 선언할 때 처음으로 값을 할당하는 것을 말한다.

즉, 변수를 선언과 동시에 값을 대입하는 것을 초기화라고한다.
Const는 선언을 할 때 초기화가 이루어져야한다.

생각해보면 Javascript는

const num ;

이러한 문법이 불가능했다. 왜?? const는 상수를 선언할 때 사용하는 변수선언타입으로서 선언과 동시에 초기화를 해주어야 맞다!

const num=12

그럼 let과 var는 어떨까?

let vs var 그리고 호이스팅 🎯

자, 먼저 let, var는 선언과 동시에 초기화가 이루어지지 않아도 된다.
즉, 선언과 동시에 최초로 값이 할당되지 않아도 된다.

let num;
var string;

이게 가능하다는 점이다. 정확하게는 num, var는 선언하면 자동으로 초기화가 이루어진다.

"undefined"로!

그래서 이렇게 나오는거다.

let num;
let string;
console.log(num,string)

//undefined,undefined

그런데 호이스팅이 결과는 두 변수타입이 다르게 나타난다.

console.log(num)
console.log(string)

let num;
let string;

이 코드의 결과값은 어떻게 나올까?

결론을 먼저말하면 num은 참조에러를 발생시키고 string은 undefined를 출력한다.

자, let은 호이스팅 과정에서 초기화가 이루어지지않지만
(호이스팅 과정에서만 초기화가 이루어지지 않는거지 해당 라인에서는 초기화가 이루어짐)


var는 호이스팅 과정에서 초기화가 이루어진다.

정리하자면 호이스팅 과정에서 let은 초기화 X, var는 초기화O

그럼 메모리 할당은 어떻게 이루어질까

메모리로 살펴보는 할당과 초기화 🎯

먼저 메모리에는 어떤 값이 저장이 된다.

만약 메모리에 어떤 값이 이미 존재한다면 해당 메모리가 또 추가되는게 아닌 해당 메모리의 위치를 변수는 기억한다.

이게 무슨말이냐면

만약 변수 A가 있다고 생각해보자

let A = 23

그럼 A에 23이있는 메모리 주소가 저장이된다.

A =26

이렇게 값이 변경된다면?

26이 있는 메모리 주소로 변경이 된다.

그런데 23이 있는 그 메모리는 그대로 남아 가비지가 된다.
그럼 후에 이 가비지는 브라우저에서 제공하는 가비지 컬렉터에 의해 제거된다.

다시 본론으로 돌아와서 그럼 만약 선언을 했는데 초기화를 안했다면 메모리는 어떤식으로 저장이될까?


let upup;

이렇게 했다면??

메모리에 undefined라는 값이 들어있다면 upup이라는 변수는 undefined가 있는 메모리 주소값을 가르킬것이다.

그런데 let은 호이스팅에서 undefined를 가르키지 않는다.
그럼?
그냥 메모리가 확보되지만 어떤 메모리 값을 가르키고 있지는 않는다. 그냥 이러한 변수가 메모리에 들어올거다 정도만 기억해주는 거다.

그래서 호이스팅 과정에서 upup을 사용하려고하면 참조에러가 발생할 것이다.

Javascript는 동적으로 메모리를 할당한다 🎯

사실 위 코드에서 hoisting이 일어날때 upup이 메모리의 공간은 확보하지만 아직 메모리가 어떤 값을 가르키는지 할당되어지지는 않았다.

그런데 호이스팅이 끝나고 해당 line을 인터프리터가 읽게되면 그때 할당된 값에 따라 동적으로 메모리를 할당한다.

사실 메모리는 자료형(int, double 등)의 타입, 값의 타입에 의해
그 크기가 정해진다.

그런데 Javascript는 동적으로 그 메모리를 할당하게 된다.
즉, 해당 라인의 할당된 값에 따라 메모리가 동적으로 할당하게 된다.

0개의 댓글

관련 채용 정보