컴퓨터는 CPU를 사용해 연산하고 메모리를 사용해 데이터를 기억한다 이때 메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체로 셀 하나의 크기는 1Byte(8bit)이고 각 셀은 메모리 주소를 갖는다.
이때 연산결과도 임의의 메모리에 저장을하는데 JS에서는 메모리 주소에 직접접근할 수 없다(치명적인 오류를 방지하기 위함) 또한 임의의 메모리 주소는 실행될때마다 변경되기때문에 주소에 직접 접근하는것은 의미가 없다.
이렇게 기억하고 싶은 값을 재사용하고 싶을 때 사용하는 것이 바로 변수!
변수란, 하나의 값을 저장하기 위해 확보한 메모리 공간 제체 또는 메모리 공간을 식별하기 위해 붙인 이름이다.
즉, 변수는 값의 위치를 나타내는 메모리 주소의 상징적인 이름이다!
식별자란, 어떤 값을 구볗래서 식별할 수 있는 고유한 이름이다.
식별자(변수의 이름)은 변수의 값을 기억하고 있는게 아니라 변수의 값이 저장된 주소 를 기억하고 있다.
식별자는 변수에 국한된것이 아니라 함수, 클래스, 등의 이름도 모두 식별자이다.
변수를 선언하는 방법으로는 var, const, let이 있다. 이를 이용해 변수를 선언하면 변수의 이름은 실행 컨텍스트에 등록되고 값을 저잘할 메모리 공간을 확보한다. (값을 할당하기 전에는 undefind가 할당된다. - 초기화작업)
cf)
실행컨텍스트는 JS엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역으로 JS엔진은 실행컨텍스트를 통해 식별자와 스코프를 관리한다.
JS는 인터프리터 언어라 한줄씩 순차적으로 실행(런타임)하지만
소스코드를 실행하기 앞서 소스코드의 평가 과정을 거치며 실행을 위한 준비를 한다. 이때 JS 엔진은 소스코드내에 모든 선언문(변수 선언문, 함수 선언문, ...)찾아 먼저 실행한다. 그리고 평과 과정이 끝나면 실행컨텍스트에 결과를 저장하고 소스코드를 실행한다.
아무생각없이쓰던 var a = 10 은 사실 변수 선언 + 변수 할당을 축약한 것이다.
var와 let은 선언만 할 수 있지만 const 는 선언과 할당을 동시에 해야하기 때문에 같이써줘야한다.
주의할 점은 변수 선언과 할당은 실행 시점이 다르다.
변수 선언 : 런타임 이전 평가단계에 실행
변수 할당 : 런타임 중 실행단계에 실행
이때 주의할 점은 변수에 값을 할당할 때 undefind가 저장되어 있던 메모리 공간에 새로운 값이 들어가는 것이 아니라 새로운 메모리 공간에 할당 값을 저장한다. 그리고 참조가 끊긴 값들은(어떤 식별자와도 연결되어 있지 않은 주소) GC가 수거해 간다
console.log(score); //undefind
score = 80;
var score;
console.log(score); // 80
4.5에서 설명한 것 처럼 변수 선언 후 undefind로 값이 할당 되었다가 우리가 원하는 값을 다시 할당하기 때문에 처음 값을 넣을때도 재할당에 해당한다
cf)
매니지드 언어 VS 언메니지드 언어
메모리 관리 방식에 의해 분류된 방식이며
메모리 관리를 언어 차원에서 담당해 개발자가 직접적인 메모리 제어를 하지 않는 JS같은 언어를 매니지드 언어,
개발자가 명시적으로 메모리를 할당하고 해제하는 C언어 같은 언어를 언메니지드 언어라고한다.
cf)
좋은 변수 이름은 가독성을 높인다! 변수선언에 주석이 필요하다면 네이밍이 변수 존재목적을 명확히 들어내지 못하는 것이다!
cf)
JS는 일반적으로 변수나 함수이름에는 카멜케이스를 생성자 함수, 클래스 이름에는 파스칼 케이스를 사용한다
소중한 정보 잘 봤습니다!