[TIL/모던 자바스크립트 Deep Dive] 2023/03/06
4장. 변수(Variable) 4-4. 변수 선언의 실행 시점과 변수 호이스팅 > 변수 선언의 실행 시점 > 변수 호이스팅 4-5. 값의 할당 4-6. 값의 재할당 4-7. 식별자 네이밍 규칙
4장. 변수(Variable)
4-4. 변수 선언의 실행 시점과 변수 호이스팅
변수 선언의 실행 시점

자바스크립트 코드는 한 줄씩 순차적으로 실행된다. 소스코드가 한 줄씩 순차적으로 실행되는 시점을 '런타임(runtime)'이라고 한다.
그렇다면 위 코드는 ReferenceError가 발생했어야 마땅하다. 'score'라는 변수의 선언이 실행되기도 전에, 변수를 참조하는 코드가 실행되고 있기 때문이다. 그런데 Error가 아니라 'undefined'가 출력되었다.
변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 runtime이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.
자바스크립트 엔진은 코드를 순차적으로 실행하기 전에, 해당 코드의 '평가 과정'을 거친다. 평가 과정에서 변수 선언을 포함한 모든 선언문을 '먼저' 실행한다. 평가 과정을 마친 이후 선언문을 제외한 나머지 코드를 순차적으로 실행한다.
위 예제 코드를 다시 보면 참조 코드가 먼저 작성되었지만, 자바스크립트 엔진이 내부 평가 과정에서 'score' 변수의 선언문을 먼저 실행했고, 값이 없었기에 'undefined'를 반환했음을 알 수 있다.
변수 호이스팅
이처럼, 변수 선언이 runtime 이전 단계에서 먼저 실행되는(=코드의 선두로 끌어 올려진 것처럼 동작하는) 현상을 '변수 호이스팅(variable hoisting)'이라 한다.
4-5. 값의 할당
변수에 값을 할당(assignment)할 때에는 할당 연산자 '='을 사용한다.
'변수 선언'과 '값의 할당'의 실행 시점이 다르다는 것을 유의해야 한다.

'변수 선언'은 호이스팅 현상에 의해, runtime 이전에 먼저 실행되었기에 'undefined'가 반환되었다. '값의 할당'은 runtime에 실행되기 때문에 '80'이 반환된다.

변수 선언과 값의 할당을 하나의 statement로 축약해도 동일한 방식으로 동작한다.
중요한 것은 변수에 '80'이라는 값을 할당할 때, 'undefined'가 저장되어 있던 메모리 공간을 지우고 해당 공간에 할당 값을 새롭게 저장하는 것이 아니라, '새로운 메모리 공간'을 확보하고 그곳에 '80'이라는 할당 값을 저장한다는 점이다.
4-6. 값의 재할당
'재할당'이란 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것을 말한다.

80이라는 값을 할당했던 'score'라는 변수에, '90'이라는 새로운 값을 할당했다. 이것이 '재할당'이다. 'var 키워드'로 선언한 변수는 값을 재할당할 수 있다. 바뀔 수 있어서 '변수'이다. 만약 값을 재할당할 수 없다면 변수라고 할 수 없고 상수(constant)라고 불러야 한다.
첫 번째 80이 할당되어 있는 코드도, 엄밀히 말하면 변수 선언과 동시에 'undefined'로 초기화되었던 상태이기에, 80을 할당하는 것은 '재할당'에 해당한다.
마찬가지로, '90'이라는 값으로 재할당 할 때, 이전에 80이 저장되어 있던 메모리를 꿰차는 것이 아니라 '새로운 메모리 공간'을 확보하고 그 공간에 '90'을 저장하게 된다.
'90'이 저장되며, 'undefined'와 '80'은 어떠한 식별자와도 연결되지 않게 된다. 이러한 불필요한 값들은 'garbage collector'라는 기능에 의해 메모리에서 자동 해제된다. 다만 해제되는 시점은 예측할 수 없다.
4-7. 식별자 네이밍 규칙
식별자(Identifier)는 어떤 값을 구별해서 식별해내는 고유한 이름이다. 식별자를 명명할 때에는 크게 3가지 규칙을 준수해야 한다.
1. 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다. 2. 단, 특수문자를 제외한 문자, 언더스코어(_), 달러 기호($)로 시작해야 한다. 숫자로 시작하는 것은 허용하지 않는다. 3. 예약어는 식별자로 사용할 수 없다.

네이밍 컨벤션(naming convention)은 하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 '명명 규칙'이다. 대표적으로 4가지 네이밍 컨벤션이 있다.

일반적으로 '변수 또는 함수'의 이름에는 카멜 케이스를 적용하고, '생성자 함수 또는 클래스' 이름에는 파스칼 케이스를 적용한다고 한다.
More to read
프론트엔드와 백엔드 사이
HTTP 상태 코드는 프론트엔드에서 백엔드로 보냈던 요청의 수행 결과를 의미하는 일종의 약속이며, API를 구성하는 핵심 요소 중 하나입니다. 상태 코드와 관련하여, 백엔드는 잘 모르는 프론트엔드의 슬픈 사정이 있습니다.아래는 요청이 실패했음에도, 백엔드에서 상태 코드
JWT토큰 관리 방식 톺아보기
0. 들어가며 🎯 서비스에 접근하려는 사용자가 누구인지 확인하는 과정을 사용자 인증이라고 합니다. 인증된 사용자에게 주어진 권한을 확인하는 작업은 인가라고 부릅니다. 이번 글에서는 인가는 다루지 않습니다. 사용자 인증에는 많은 방식이 있지만, 오늘은 세션 인증 방
A2AA2A / MCP 멀티 에이전트 오케스트레이션
0. 들어가며 ✍️ Google for Developers에, 레스토랑 공급망 시나리오로 엮은 6대 프로토콜(MCP, A2A, UCP, AP2, A2UI, AG-UI)에 대한 가이드가 게시된 이후, MCP와 A2A부터 구현해 보는 것이 좋을 것 같다는 생각이 들었습니