
자바스크립트 엔진이 "10+20" 코드를 실행하기 위해서는 피연산자와 연산자의 의미를 알고 있어야 하며 파싱 할 수 있어야 한다.
메모리
- 데이터를 저장할 수 있는 메모리 셀의 집합체
- 즉,1바이트 단위로 데이터를 저장하거나 읽어 들임
- 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 매우 높음 => 만약 실수로 운영체제가 사용하는 값을 임의로 변경시키면 시스템을 아예 멈추게 하는 치명적인 오류 발생!
- 값이 저장될 메모리 주소는 코드가 실행될 때마다 매번 변경됨
메모리 셀
- 하나의 크기는 1바이트(8 bit)
- 고유의 메모리 주소를 가짐
프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 메커니즘 제공
변수
- 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
- 프로그래밍 언어에서 하나의 값을 저장하고 참조하는 메커니즘
- 값의 위치를 가리키는 상징적인 이름
- 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행됨
- 따라서 개발자는 직접 메모리 주소를 통해 값을 저장, 참조할 필요 없이 변수를 통해 안전하게 값에 접근 가능
- 변수명 (변수 이름) : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름, 사람을 위해 사람이 이해할 수 있는 언어로 값이 저장된 메모리 공간에 붙인 상징적인 이름
- 변수 값 : 변수에 저장된 값
- 할당 : 변수에 값을 저정하는 것
- 참조 : 변수에 저장된 값을 읽어 들이는 것. 변수 이름을 사용해 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 저장된 값 반환함
식별자(identifier)
- 변수명의 또다른 이름
- 어떤 값을 구별해서 식별할 수 있는 고유한 이름
- 식별자는 메모리 공간에 저장되어 있는 어떤 값을 구별해서 식별해 낼 수 있어야 함 => 어떤 값이 저장되어 있는 메모리 공간을 기억해야함
- 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺음, 매핑 정보도 메모리에 저장됨
- 값이 아니라 메모리 주소를 기억하고 있음
- 즉, 식별자는 메모리 주소에 붙인 이름
- 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자임(변수, 함수, 클래스 등의 모든 이름들)
- 식별자는 선언에 의해 자바스크립트 엔진에 식별자의 존재를 알림
- 선언하지 않은 식별자에 접근하면 ReferenceError(참조 에러) 발생함 => 식별자를 통해 참조하려고 했지만 자바스크립트 엔진에 등록된 식별자를 찾을 수 없을 때 발생하는 에러
변수 선언
- 변수를 생성하는 것
- 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있도록 준비하는 것
- 변수 선언에 의해 확보된 메모리 공간은 해제되기 전까지 보호됨
- 변수를 사용하려면 선언이 무조건적으로 필요
- var, let, const 키워드 사용
- 변수를 선언 후 아직 값을 할당하지 않아도 메모리 공간이 비어있는 것이 아니라 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화됨
자바스크립트 엔진의 변수 선언 단계
- 선언 단계 : 변수 이름을 등록해 자바스크립트 엔진에 변수의 존재를 알림
- 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 할당해 초기화함
실행 컨텍스트 (execution context)
- 변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록됨
- 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
- 자바스크립트는 실행 컨텍스트를 통해 식별자와 스코프를 관리함
- 변수이름과 변수값은 key-value 형태인 객체로 등록되어 관리
초기화
- 변수가 선언된 이후 최초로 값을 할당하는 것
- 변수 선언 후 초기화를 진행하지 않으면 변수 값을 참조하게 되면 쓰레기값(이전에 다른 애플리케이션이 사용했던 값)이 나올 수 있음
var
- var 키워드를 사용한 변수 선언은 선언 단계와 초기화 단계가 동시에 진행됨
- var 키워드로 선언한 변수는 undefined로 암묵적인 초기화가 자동 수행됨
- var 키워드는 암묵적으로 초기화를 수행하기 때문에 쓰레기값이 나오는 위험으로부터 안전함
변수 선언
- 변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점인 런타임이 아니라 그 이전 단계에서 먼저 실행됨
- 소스코드 실행을 위한 준비 단계인 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행함
- 즉, 변수 선언이 어디에 위치하던 자바스크립트 엔진은 다른 코드보다 먼저 실행
변수 호이스팅
- 변수 선언문이 코드의 선부로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라고함
- 변수 선언뿐 아니라 var, let, const, function, fuction*, class 키워드를 사용해 선언하는 모든 식별자는 호이스팅됨. 모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문
console.log(ret); // reference error가 아닌 undefined가 출력됨
var ret;
값의 할당
- 변수에 값을 할당 할 때는 할당 연산자 '=' 사용함
- 할당 연산자는 우변의 값을 좌변의 변수에 할당함
- 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행됨
- 값을 할당할 때는 이전 undefined가 저장된 메모리 공간을 지우고 그 메모리 공간에 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값을 저장함
console.log(score); //undefined
score = 80; //실제 런타임 때 이전에 선언된 score에 값이 할당됨
var score; //어쩌피 이부분은 호이스팅 되기 때문에
console.log(score); //80
값의 재할당
- 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것
- var 키워드로 선언한 변수는 재할당 가능 (처음에 undefined로 선언되었다가 값을 할당받는 것도 엄밀히 말하면 재할당임)
- 변수는 값을 재할당할 수 있지만 상수는 불가
- 재할당 또한 새로운 메모리 공간을 확보하고 그 메모리 공간에 재할당 값을 저장
- 불필요한 값들인 가비지 콜렉터에 의해 메모리에서 자동 해제(시기는 예측 불가)
가비지 콜렉터
- 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능
- 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로 메모리 누스를 방지함
식별자 네이밍 규칙
- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_)_, 달러기호($)를 포함할 수 있음
- 식별자는 특수문자를 제외한 문자, 언더스코어, 달러기호로 시작해야함, 단, 숫자로 시작하는 것은 허용하지 않음
- 예약어는 식별자로 사용할 수 없음
- ES5부터 식별자를 만들 때 유니코드 문자를 허용해 한글이나 일본어 식별자도 가능하지만 권장하지는 않음
네이밍 컨벤션
- 하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 명명 규칙
- 카멜 케이스 => firstName
- 스네이크 케이스 => first_name
- 파스칼 케이스 => FirstName
- 헝가리안 케이스 => strFirstName
+ 질문
Q. 변수에 여러 개의 값을 저장할 수 있는지? 있다면 어떻게? 없다면 어떤식으로 대체되는지?
A. 변수는 하나의 값만을 저장하기 위한 메커니즘입니다. 따라서 여러 개의 값을 하나의 변수에 저장할 수 없습니다.
따라서 여러 개의 값을 저장하기 위해서는 여려 개의 변수를 사용해야합니다. 이때 만약 배열이나 객체와 같은 자료구조를 사용한다면 여러 개의 값을 그룹화해서 하나의 값처럼 사용이 가능합니다.
Q. 자바스크립트 참조의 과정에 대해 설명해보세요.
A. 사용자가 변수명을 사용해 참조를 요청하면 자바스크립트 엔진은 변수명과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 저장된 값을 반환합니다.
Q. var 변수를 선언 후 초기화하지 않으면 메모리 공간이 비어있나요? 아니라면 어떻게 되는지 설명해보세요.
A. 자바스크립트에서는 아닙니다. 변수를 선언 후 아무 값도 할당하지 않는다면 자바스크립트는 암묵적으로 undefined라는 값을 할당해 변수를 초기화합니다. (아마 var에 한함.)
(let, const는 선언과 동시에 초기화되지 않고 TDZ에 놓이게 됨. 따라서 실제 선언 코드가 실행될 때 초기화됩니다. 하지만 const 같은 경우 선언과 동시에 초기값을 할당 해주어야 합니다)
Q. 자바스크립트 엔진의 변수 선언 단계에 대해 설명해보세요.
A. 먼저 선언 단계입니다. 자바스크립트는 변수 이름을 등록해 자바스크립트엔진에 변수의 존재를 알립니다.
다음에는 초기화 단계입니다. 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 값을 할당해 초기화합니다.
Q. var 키워드로 변수 선언 전에 콘솔 로그를 찍으면 reference error가 아닌 undefined 가 반환되는 이유를 설명해보세요
A. 자바스크립트 엔진은 런타임 이전에 모든 변수와 선언문 코드를 먼저 처리한 후 코드를 실행합니다. 따라서 런타임 이전에 변수 선언이 완료가 되고 var 키워드로 작성된 변수는 선언과 초기화가 동시에 일어나 undefined로 초기화 되기 때문에 reference error가 발생하지 않고 undefined가 반환됩니다.
Q. 실행 컨택스트에 대해 알고있나요? 알고있다면 설명해주세요
A. 실행 컨택스트는 자바스크립트 엔진이 코드를 실행하기 위해 환경과 상태를 관리하는 영역입니다. 따라서 변수명을 포함한 식별자와 같은 정보들을 실행 컨텍스트에 등록됩니다. 등록된 정보들을 바탕으로 자바스크립트 엔진은 코드를 실행할 수 있습니다.
'FE > 리뷰' 카테고리의 다른 글
모던 자바스크립트 딥다이브 6장 정리 (0) | 2024.03.08 |
---|---|
모던 자바스크립트 딥다이브 5장 정리 (0) | 2024.02.29 |
모던 자바스크립트 3장 정리 (0) | 2024.02.19 |
모던 자바스크립트 딥다이브 2장 정리 (0) | 2024.02.15 |
[FE / REVIEW] 0215 Article 리뷰 (0) | 2024.02.15 |

자바스크립트 엔진이 "10+20" 코드를 실행하기 위해서는 피연산자와 연산자의 의미를 알고 있어야 하며 파싱 할 수 있어야 한다.
메모리
- 데이터를 저장할 수 있는 메모리 셀의 집합체
- 즉,1바이트 단위로 데이터를 저장하거나 읽어 들임
- 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 매우 높음 => 만약 실수로 운영체제가 사용하는 값을 임의로 변경시키면 시스템을 아예 멈추게 하는 치명적인 오류 발생!
- 값이 저장될 메모리 주소는 코드가 실행될 때마다 매번 변경됨
메모리 셀
- 하나의 크기는 1바이트(8 bit)
- 고유의 메모리 주소를 가짐
프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 메커니즘 제공
변수
- 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
- 프로그래밍 언어에서 하나의 값을 저장하고 참조하는 메커니즘
- 값의 위치를 가리키는 상징적인 이름
- 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행됨
- 따라서 개발자는 직접 메모리 주소를 통해 값을 저장, 참조할 필요 없이 변수를 통해 안전하게 값에 접근 가능
- 변수명 (변수 이름) : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름, 사람을 위해 사람이 이해할 수 있는 언어로 값이 저장된 메모리 공간에 붙인 상징적인 이름
- 변수 값 : 변수에 저장된 값
- 할당 : 변수에 값을 저정하는 것
- 참조 : 변수에 저장된 값을 읽어 들이는 것. 변수 이름을 사용해 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 저장된 값 반환함
식별자(identifier)
- 변수명의 또다른 이름
- 어떤 값을 구별해서 식별할 수 있는 고유한 이름
- 식별자는 메모리 공간에 저장되어 있는 어떤 값을 구별해서 식별해 낼 수 있어야 함 => 어떤 값이 저장되어 있는 메모리 공간을 기억해야함
- 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺음, 매핑 정보도 메모리에 저장됨
- 값이 아니라 메모리 주소를 기억하고 있음
- 즉, 식별자는 메모리 주소에 붙인 이름
- 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자임(변수, 함수, 클래스 등의 모든 이름들)
- 식별자는 선언에 의해 자바스크립트 엔진에 식별자의 존재를 알림
- 선언하지 않은 식별자에 접근하면 ReferenceError(참조 에러) 발생함 => 식별자를 통해 참조하려고 했지만 자바스크립트 엔진에 등록된 식별자를 찾을 수 없을 때 발생하는 에러
변수 선언
- 변수를 생성하는 것
- 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있도록 준비하는 것
- 변수 선언에 의해 확보된 메모리 공간은 해제되기 전까지 보호됨
- 변수를 사용하려면 선언이 무조건적으로 필요
- var, let, const 키워드 사용
- 변수를 선언 후 아직 값을 할당하지 않아도 메모리 공간이 비어있는 것이 아니라 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화됨
자바스크립트 엔진의 변수 선언 단계
- 선언 단계 : 변수 이름을 등록해 자바스크립트 엔진에 변수의 존재를 알림
- 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 할당해 초기화함
실행 컨텍스트 (execution context)
- 변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록됨
- 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
- 자바스크립트는 실행 컨텍스트를 통해 식별자와 스코프를 관리함
- 변수이름과 변수값은 key-value 형태인 객체로 등록되어 관리
초기화
- 변수가 선언된 이후 최초로 값을 할당하는 것
- 변수 선언 후 초기화를 진행하지 않으면 변수 값을 참조하게 되면 쓰레기값(이전에 다른 애플리케이션이 사용했던 값)이 나올 수 있음
var
- var 키워드를 사용한 변수 선언은 선언 단계와 초기화 단계가 동시에 진행됨
- var 키워드로 선언한 변수는 undefined로 암묵적인 초기화가 자동 수행됨
- var 키워드는 암묵적으로 초기화를 수행하기 때문에 쓰레기값이 나오는 위험으로부터 안전함
변수 선언
- 변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점인 런타임이 아니라 그 이전 단계에서 먼저 실행됨
- 소스코드 실행을 위한 준비 단계인 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행함
- 즉, 변수 선언이 어디에 위치하던 자바스크립트 엔진은 다른 코드보다 먼저 실행
변수 호이스팅
- 변수 선언문이 코드의 선부로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라고함
- 변수 선언뿐 아니라 var, let, const, function, fuction*, class 키워드를 사용해 선언하는 모든 식별자는 호이스팅됨. 모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문
console.log(ret); // reference error가 아닌 undefined가 출력됨
var ret;
값의 할당
- 변수에 값을 할당 할 때는 할당 연산자 '=' 사용함
- 할당 연산자는 우변의 값을 좌변의 변수에 할당함
- 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행됨
- 값을 할당할 때는 이전 undefined가 저장된 메모리 공간을 지우고 그 메모리 공간에 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값을 저장함
console.log(score); //undefined
score = 80; //실제 런타임 때 이전에 선언된 score에 값이 할당됨
var score; //어쩌피 이부분은 호이스팅 되기 때문에
console.log(score); //80
값의 재할당
- 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것
- var 키워드로 선언한 변수는 재할당 가능 (처음에 undefined로 선언되었다가 값을 할당받는 것도 엄밀히 말하면 재할당임)
- 변수는 값을 재할당할 수 있지만 상수는 불가
- 재할당 또한 새로운 메모리 공간을 확보하고 그 메모리 공간에 재할당 값을 저장
- 불필요한 값들인 가비지 콜렉터에 의해 메모리에서 자동 해제(시기는 예측 불가)
가비지 콜렉터
- 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능
- 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로 메모리 누스를 방지함
식별자 네이밍 규칙
- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_)_, 달러기호($)를 포함할 수 있음
- 식별자는 특수문자를 제외한 문자, 언더스코어, 달러기호로 시작해야함, 단, 숫자로 시작하는 것은 허용하지 않음
- 예약어는 식별자로 사용할 수 없음
- ES5부터 식별자를 만들 때 유니코드 문자를 허용해 한글이나 일본어 식별자도 가능하지만 권장하지는 않음
네이밍 컨벤션
- 하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 명명 규칙
- 카멜 케이스 => firstName
- 스네이크 케이스 => first_name
- 파스칼 케이스 => FirstName
- 헝가리안 케이스 => strFirstName
+ 질문
Q. 변수에 여러 개의 값을 저장할 수 있는지? 있다면 어떻게? 없다면 어떤식으로 대체되는지?
A. 변수는 하나의 값만을 저장하기 위한 메커니즘입니다. 따라서 여러 개의 값을 하나의 변수에 저장할 수 없습니다.
따라서 여러 개의 값을 저장하기 위해서는 여려 개의 변수를 사용해야합니다. 이때 만약 배열이나 객체와 같은 자료구조를 사용한다면 여러 개의 값을 그룹화해서 하나의 값처럼 사용이 가능합니다.
Q. 자바스크립트 참조의 과정에 대해 설명해보세요.
A. 사용자가 변수명을 사용해 참조를 요청하면 자바스크립트 엔진은 변수명과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 저장된 값을 반환합니다.
Q. var 변수를 선언 후 초기화하지 않으면 메모리 공간이 비어있나요? 아니라면 어떻게 되는지 설명해보세요.
A. 자바스크립트에서는 아닙니다. 변수를 선언 후 아무 값도 할당하지 않는다면 자바스크립트는 암묵적으로 undefined라는 값을 할당해 변수를 초기화합니다. (아마 var에 한함.)
(let, const는 선언과 동시에 초기화되지 않고 TDZ에 놓이게 됨. 따라서 실제 선언 코드가 실행될 때 초기화됩니다. 하지만 const 같은 경우 선언과 동시에 초기값을 할당 해주어야 합니다)
Q. 자바스크립트 엔진의 변수 선언 단계에 대해 설명해보세요.
A. 먼저 선언 단계입니다. 자바스크립트는 변수 이름을 등록해 자바스크립트엔진에 변수의 존재를 알립니다.
다음에는 초기화 단계입니다. 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 값을 할당해 초기화합니다.
Q. var 키워드로 변수 선언 전에 콘솔 로그를 찍으면 reference error가 아닌 undefined 가 반환되는 이유를 설명해보세요
A. 자바스크립트 엔진은 런타임 이전에 모든 변수와 선언문 코드를 먼저 처리한 후 코드를 실행합니다. 따라서 런타임 이전에 변수 선언이 완료가 되고 var 키워드로 작성된 변수는 선언과 초기화가 동시에 일어나 undefined로 초기화 되기 때문에 reference error가 발생하지 않고 undefined가 반환됩니다.
Q. 실행 컨택스트에 대해 알고있나요? 알고있다면 설명해주세요
A. 실행 컨택스트는 자바스크립트 엔진이 코드를 실행하기 위해 환경과 상태를 관리하는 영역입니다. 따라서 변수명을 포함한 식별자와 같은 정보들을 실행 컨텍스트에 등록됩니다. 등록된 정보들을 바탕으로 자바스크립트 엔진은 코드를 실행할 수 있습니다.
'FE > 리뷰' 카테고리의 다른 글
모던 자바스크립트 딥다이브 6장 정리 (0) | 2024.03.08 |
---|---|
모던 자바스크립트 딥다이브 5장 정리 (0) | 2024.02.29 |
모던 자바스크립트 3장 정리 (0) | 2024.02.19 |
모던 자바스크립트 딥다이브 2장 정리 (0) | 2024.02.15 |
[FE / REVIEW] 0215 Article 리뷰 (0) | 2024.02.15 |