내일배움캠프 Node.js 본캠프 8일차

김선우·2024년 8월 14일
post-thumbnail

배운 것

데이터 타입(심화)

데이터 타입

기본형 - number, string, boolean, null, undefined, symbol(es6)
참조형 - array, function, date 등
기본적으로 참조형의 타입이 object의 하위 요소로 잡힘.
=> 참조형 = object

기본형과 참조형을 나누는 기준 - 값의 저장 방식(값이 어떻게 저장, 복제되는가), 불변성 여부(값이 불변하냐, 불변하지않냐)

복제의 방식

기본형 - 값이 담긴 주소값을 바로 복제
참조형 - 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제

불변성 여부(메모리의 관점에서 봐야함)

기본형 - 불변성
참조형 - 불변성 X

메모리와 데이터에 관한 배경지식

비트(bit) - 컴퓨터가 이해할 수 있는 가장 작은 단위(0, 1), 0과 1만 표현하는 비트를 모두 찾기에는 부담이 됨.
바이트(byte) - 비트를 8개 합쳐놓은 단위., 메모리에 고유한 주소값을 부여.
메모리(memory) - 바이트 단위로 구성. 모든 데이터는 바이트 단위의 식별자인 메모리 주소값을 통해 서로 구분이 됨.

기본형 데이터 변수 선언과 데이터 할당

값을 주소에서 끌어와서 쓰는게 아니라 변수에 바로 대입할 수 있지 않나?
1. 데이터를 자유롭게 변환하기 위해서 - 할당된 데이터를 더 큰 데이터로 변환하려고 할 때, 이후에 저장된 데이터가 있다면 그 데이터들을 모두 오른쪽으로 미뤄야함. -> 별도 공간에 데이터를 확보해두고 주소를 가져오는게 훨씬 더 효율적.
2. 메모리를 효율적으로 관리하기 위해서 - 같은 데이터를 여러번 저장한다면 변수에 바로 대입할 경우 데이터의 수만큼 바이트 양이 많아지지만 주소에서 끌어와서 사용하는 경우에는 데이터 하나의 바이트+ 변수의 바이트만큼만 사용하기 때문에 효율적으로 사용가능.

기본형 데이터와 참조형 데이터

변수 - 변수 영역 메모리를 변경할 수 있음
상수 - 변수 영역 메모리를 변경할 수 없음
불변하다 : 데이터 영역 메모리를 변경할 수 없음
불변하지않다 : 데이터 영역 메모리를 변경할 수 있음

가변값과 가변성

기본형 데이터의 변수 할당 과정과의 차이점 - 별도 저장 공간(객체의 변수(프로퍼티)이 따로 필요하다.

참조형 데이터가 불변하지않다 하는 이유 - 데이터를 변경했을 때 데이터 영역은 계속 불변함. 하지만 변수 영역이 아닌 별도로 저장된 공간이 변경이 됨. -> 가변한다 ==> 참조형 데이터 = 가변한다.

중첩 객체 - 객체 안에 다른 객체가 들어가있는 것.

참조 카운트 - 객체를 참조하는 변수나 다른 객체의 수를 나타내는 값

불변 객체 - 객체 데이터 자체를 변경할 때 기존 데이터는 변경되지 않음.

undefined와 null - 없음을 의미하는 값

undefined - 보통 개발자가 직접 지정하는 경우는 없음, JS가 없는 값이라고 인식할 때.(변수의 값이 지정되지 않은경우, .이나[]로 접근할때 해당 데이터가 없는 경우(객체, 배열), retirn문이 없는 경우(함수)

없다를 표현할 때 undefined 쓰지 않기 - 개발자들끼리 헷갈림.

null - 개발자가 지정, 개발자가 없는 값이라고 명시할 때.

typeof null - object(JS버그)
동등연산자 - 타입까지 일치할 필요는 없음
일치연산자 - 타입까지 일치해야함.

실행컨텍스트 - 실행할 코드에 환경 정보를 모아놓은 객체.

-역할(특징)
1. 호이스팅 - 선언된 변수를 위로 끌어올림.
2. 외부 환경 정보를 구성
3. this 값을 설정(this 바인딩)

-실행컨텍스트를 이해하려면 콜스택을 이해해야함.
스택(Stack) - 바스캣 - Last in first out(LIFO) - 먼저 들어간게 마지막에 나온다
큐(Queue) - 원통 - First in first out(FIFO) - 먼저 들어간게 먼저 나온다
콜스택 - 가장 위에 쌓인 컨텍스트와 관련된 코드를 실행하는 방법으로 코드의 환경 및 순서를 보장할 수 있음.

실행 컨텍스트가 생성되는 시점 = 콜스택의 맨위에 쌓이는 순간. -> 현재 코드에 관여하게 되는 시점.

실행 컨텍스트에 담기는 정보

  1. VariableEnvironment - record(식별자)와 outer(외부 환경 정보)를 가짐
  2. LexicalEnvironment - VE와 동일하지만 시간이 갈수록 변경사항을 실시간으로 반영해서 업데이트가 됨.(VE는 생길 때 모습 그대로 간직(snapshot))
  3. ThisBinding - this 식별자가 바라봐야할 객체

VE - 스냅샷을 유지.
LE - 스냅샷을 유지x -> 실시간으로 변경사항을 계속 반영.
=> 실행 컨텍스트를 생성할 때, VE에 정보를 먼저 담고 이를 복사해서 LE를 만들어 이후 LE를 활용하게됨.

LE - record와 호이스팅

호이스팅 - 변수 정보 수집 과정을 이해하기 쉽게 설명한 가상개념.
규칙) 1. 매개변수나 변수는 선언부를 호이스팅한다.
2. 함수 선언은 전체를 호이스팅한다.
3. 함수 선언문, 함수 표현식 - 함수의 정의부만 존재하는 방식(함수 선언문), 변수에 할당하는 방식(함수 표현식)
-함수 선언문 : 함수 전체가 위로 끌어올려짐.
-함수 표현식 : 변수 부분만 위로 끌어올려짐.

LE - outer(outerEnvironmentReference)

스코프 - 식별자에 대한 유효 범위, 거의 모든 언어에서 존재
스코프 체인 - 식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 것.

각각의 실행 컨텍스트는 LE 안에 record와 outer를 가지고 있고 outer안에는 실행컨텍스트가 선언될 당시의 LE정보(outer입장에서는 전역 컨텍스트)가 들어있으니 스코프체인에 의해 상위 컨텍스트의 record를 읽어올 수 있다.

느낀점

너무 어렵다. 2주차까지는 조금 헷갈리는거 같아도 예제 풀어보고 하면 이해가 되었는데 이번주차 강의는 정리를 하기는 했지만 사실 이해가 안되는 부분도 많아서 영상을 여러번 돌려본 것 같다. 예제보단 이론설명이 주 내용이라 그런가 더 어려웟던 것 같기도 하다. 영상을 몇 번 더 돌려보면서 이해해봐야겠다.

0개의 댓글