자바스크립트 딥 다이브 4장 - 변수

houndhollis·2024년 2월 20일
0

오랜만에 다시 벨로그를 끄적끄적 글 쓰는 거를 최근에는 종종 해야겠다 생각 하지만 막사 다시 칠려고 하면 뭔가 나를 막는 듯한 느낌이 강하다. 그래도 혜원이랑 같이 처음부터 읽고 재밌게 써보기로 했으니까! 오늘부터 1장 자바스크립트 딥다이브 다시 뿌셔보기 시작!

변수

애플리케이션은 데이터를 다룬다, 아무리 복잡하더라도 데이터를 입력받아 처리하고 출력하는 것 이것이 전부이다.

여기 간단한 식이있다.

10 + 20 

위에 계산식을 자바스크립트 엔진이 자바스크립트 코드를 계산 하려면 먼저 10,20,+ 라는 기호의 의미를 알고 있어야 하며, 10 + 20 이라는 식의 의미도 해석 할수 있어야 한다.


메모리

컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억한다. 메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체이다. 셀 하나의 크기는 1바이트 (8비트) 이며, 컴퓨터는 메모리 셀의 크기 즉 1바이트 단위로 데이터를 저장하거나 읽는다.

각 셀은 고유한 메모리 주소를 갖는다. 이 메모리 주소는 메모리 공간의 위치를 나타내며 0 부터 시작해서 메모리의 크기만큼 정수로 표현된다.

중요한 점은 데이터는 모두 2진수로 저장된다.


연산완료

자 10 + 20 이라는 연산이 완료가 되었다. 만약 연산 결과를 한 번만 사용한다면 문제는 없다, 하지만 연산 결과를 재사용 하고싶다면 메모리 주소를 통해 연산 결과 30이 저장된 메모리 공간에 직접 접근 하는 것외에는 없지만, 이러한 방법은 추천하지 않는다.
자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다.

값이 저장될 때 메모리 주소는 코드가 실행될 때 메모리의 상황에 따라 임의로 결정된다.
동일한 컴퓨터에서 동일한 코드를 실행해도 코드가 실행될 때마다 값이 저장될 메모리 주소는 변경된다. 그러면 어떻게 하냐?

바로 저장된 값을 읽어 들이면 된다 그것이 바로 변수이다. 서론이 길었던거 같다.
하지만 너무나 중요한 내용인건 확실하다.

변수의 정의

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위해 붙인 이름을 말한다. (값을 가리키는 상징적인 의미)

인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행된다.

아까의 예시처럼 10 + 20을 sum 이라는 변수에 할당 했다고 생각을 해보자, 그러면 메모리 공간에 저장된 값을 식별할 수 있는 고유한 을 변수 그리고 변수의 저장된 값을 변수 값 이라고 한다.

변수에 값을 저장하는 것을 - 할당
값을 읽어 들이는 것을 - 참조

라고 한다. 변수는 식별자 라고도 부르며, 식별자는 값이 아니라 메모리 주소를 기억하고 있다.

변수 선언

변수 선언 이란 변수를 생성하는 것을 말한다. 좀 더 자세히 말하면 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결 해서 값을 저장하게 하는 것이다.

변수를 선언한 이후, 아직 변수에 값을 할당하지 않았으면 변수 선언에 의해 확보된 메모리 공간은 비어있을 것이라고 생각할수 있지만, 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined 라는 값이 암묵적으로 할당되어 초기화 된다.

변수의 선언 2단계
선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.

변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록된다, 실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다.

변수를 사용하려면 반드시 선언이 필요하다, 변수뿐만 아니라 모든 식별자가 그렇다 만약 선언하지 않은 식별자에 접근하면 참조에러가 발생한다.

자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 한다. 이때 소스코드 실행을 위한 준비 단계인 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행한다 그리고 소스코드의 평가과정이 끝나면 모든 선언문을 제외하고 소스코드를 순차적으로 실행한다.

호이스팅

변수 선언 2단계 에서 소스코드가 순차적으로 실행되는 런타임 이전 단계에서 먼저 실행되는 것, 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅 이라고 한다.

var score;
score = 10;

변수의 선언과 값의 할당을 하나의 문장으로 단축 표현해도 자바스크립트 엔진은 변수의 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다. 따라서 변수에 undefined 가 할당되어 초기화 되는 것은 변함 없다.

변수는 값을 재할당이 가능하다. 이것 또한 기존값이 아닌 새로운 메모리 공간에 값을 새로 저장한다. 이렇게 되면 초기화 상태 메모리 주소인 undefined 와 이전 값은 더 이상 필요하지 않다는 것을 의미한다. 이러한 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.

  • 단 언제 해제될지는 예측할수 없다.

중요 포인트 : 변수에서 값을 재할당 했을 경우 기존 메모리 주소값이 아닌 새로운 공간에 값을 새로 저장한다. 이렇게 되면 불필요한 메모리들이 메모리 누수를 일으킨다. 아래 가비지 컬렉터를 봐보자!


가비지 콜렉터

가비지 컬렉터는 애플리케이션이 할당 한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제 하는 기능을 말한다.
더 이상 사용 X -> 어떤 식별자도 참조하지 않는 메모리 공간, 메모리 누수를 방지한다.


여기 까지 내용 정리를 마친다 🔥
앞으로도 꾸준하게..? 글을 써볼까 한다. 간단한 변수도 이정도의 내용을 담고 있어서 한번 아? 이런 느낌이구나 헀지만 시간 지나면 까먹을꺼 같으니깐 종종 읽어야겠다!

profile
한 줄 소개

0개의 댓글