0. 기본 개념
컴퓨터는 cpu를 사용해 연산하고 메모리를 사용해 데이터를 기억함
( * 메모리 : 데이터를 저장 할 수 있는 매모리 셀의 집합체, 컴퓨터는 메모라 셀의 크기인 1바이트 단위로 데이터 저장하고 읽음)
( * 셀 : 각 셀은 고유한 메모리 주소를 가짐, 셀 하나당 1바이트)
1. 변수
자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않음
-> 기억하고 싶은 값을 메모리에 저장하고 재사용 하기 위해 변수 개념 사용
+ 메모리주소는 임의로 결정, 실행될때마다 바뀜.
변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 의해 붙인 이름
값의 위치를 가리키는 상징적인 이름
변수에 여러가지 값을 저장하려면 여러개의 변수 필요, 배열이나 객체는 여러개의 값을 그룹화 한 것임
변수 이름 : 매모리 공간에 저장된 값을 식별 할 수 있는 고유한 이름
변수 값 : 변수에 저장된 값
할당: 변수에 값 저장하는 것
참조 : 변수에 저장된 값 읽어들이는 것
2. 식별자
메모리 상에 존재하는 어떤 값을 구별해서 식별 할 수 있는 고유한 이름, 값이 저장되어있는 메모리 주소와 매핑관계 맺으며 이 매핑정보도 메모리에 저장되어야 함
-> 값이 아닌, 메모리 주소를 기억, 메모리 주소에 붙인 이름
네이밍 규칙을 준수해야 함
선언에 의해 자바스크립트 엔진에 식별자의 존재를 알림.
3. 변수 선언
메모리 공간을 확보하고, 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장 할 수 있게 해줌
변수선언으로 확보된 메모리 공간은 확보가 해제되기 전까지는 누구도 사용할 수 없게 보호됨.
변수 사용하려면 반드시 선언이 필요, var, let, const키워드 사용
+ let과 const 도입 이유 (var의 단점)
1. 변수 호이스팅 : var를 이용해 변수를 선언하면, 해당 변수는 호이스팅. 이 때문에 변수 선언 전에 변수를 사용하게 되는 등의 문제가 발생 -> let과 const로 선언된 변수는 선언 이전에 참조하려 하면 오류가 발생
2. 블록 스코프 : var은 함수 레벨 스코프 지원 -> 의도치않게 전역변수 선언으로 부작용 발생
3. 재할당 제어 : var와 let은 재할당이 가능한 반면, const는 한 번 할당된 값을 변경할 수 없음. 의도치 않은 값의 변경을 방지하고, 코드의 안정성 높임
( * 블록 레벨 스코프 : {}로 둘러싸인 블록 내에서만 변수가 유효한 범위를 의미, let과 const
함수 레벨 스코프 : 특정 함수 내에서만 변수가 유효한 범위를 의미, var)
( * 키워드 : js코드를 해석하고 실행하는 js엔진이 수행할 동작을 규정한 명령어)
변수 선언후, 값을 할당하지 않은 경우에도 값은 비어있지않음 -> js 엔진에 의해 undefined가 암묵적으로 할당되어 초기화됨.
( * undefined : js에서 제공하는 원시타입(정수, 실수, 문자, 논리 리터럴등의 실제 데이터 값을 저장하는 타입 <-> 참조타입 )의 값)
** js 엔진의 변수선언 단계 : 선언 -> 초기화
변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록,
( * 실행 컨텍스트 : js엔진이 소스코드를 평가, 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역)
var를 사용하면 변수선언이 선언단계와 초기화 동시에 이루어짐.
( * 초기화 : 변수 선언 이후 최초로 값 할당)
초기화를 거치지 않으면, 쓰레기값이 남아있을 수 있음 -> var은 암묵적 초기화 수행하므로 안전
if, 선언하지 않은 식별자에 접근 : 참조에러 발생
4. 변수 선언의 실행 시점 및 변수 호이스팅
js는 인터프리터에 의해 한줄씩 순차적 실행, 하지만 변수 선언이 밑에 있어도 참조에러 대신 undefined -> 호이스팅 때문
변수 선언은 런타임이 아니라, 이전 단계(평과 과정)에서 실행
소스코드의 평과 과정에서 모든 선언문을 소스코드에서 찾아 먼저 실행한 후에, 모든 선언문을 제외한 소스코드를 순차적으로 실행
-> 변수 선언이 어디에 있든, 다른 코드보다 먼저 실행됨
호이스팅 : 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 js고유의 특징
5. 값의 할당
** 변수 선언과 값의 할당 시점이 다름!
변수 선언은 런타임 이전에 먼저 실행, 값의 할당은 런타임에 실행
+ 변수 선언과 값의 할당을 한 문장으로 단축해도 js엔진은 2개의 문(선언, 할당)으로 나눠서 각각 실행함
또한, 값을 할당할때 이전 값을 지우고 새롭게 저장하는 것이 아니라, 새로운 메모리 공간을 확보하고 그 곳에 할당값을 저장
6. 값의 재할당
재할당 : 이미 값이 할당되어있는 변수에 새로운 값을 다시 할당하는 것
var 키워드로 선언한 변수는 재할당 가능, const는 x
값을 재할당 못하는 것은 변수가 아니라 상수(한번 정해지면 변하지 않는 값 -> const)
( * 가비지콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사해 더이상 사용되지 않는 메모리(어떤 식별자도 참조하지 않는 메모리 공간 )를 해제하는 기능, 메모리 누수 방지, 메모리 해제 시점은 예측 불가)
+ JavaScript에서 가비지 콜렉터의 동작 원리
1. 참조 추적 : 어떤 객체가 루트(전역 객체)에서부터 참조나 연결이 되지 않는다면 그 객체는 가비지로 간주되어 회수
2. 마크 앤 스위프
i) 마킹 : 루트에서 시작하여 접근 가능한 모든 객체를 '마킹'하는 과정
ii) 스위핑 : 마킹되지 않은 객체, 즉 도달할 수 없는 객체들을 메모리에서 제거하는 과정
+ 매니지드 언어 : 메모리 할당 및 해제를 언어 차원에서 담당, 개발자의 직접적인 메모리 제어 허용 x -> js
언매니지드 언어 : 개발자가 명시적으로 메모리 할당 및 해제 -> c의 malloc, free
7. 네이밍 규칙
es5부터는 유니코드 문자 허용
* 네이밍 컨벤션 : 하나 이상의 영어 단어로 구성된 식별자 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 명명 규칙
i) 카멜 케이스 -> firstName
ii) 스네이크 케이스 -> fitsr_name
iii) 파스칼 케이스 -> FirstName
iv) 헝가리언 케이스 : 타입 + 식별자 -> strFirstName
'스터디 > 모던 자바스크립트 Deep Dive(24.02-24.06)' 카테고리의 다른 글
7장. 연산자 (0) | 2024.03.14 |
---|---|
6장. 데이터 타입 (1) | 2024.03.14 |
5장. 표현식과 문 (0) | 2024.03.04 |
3장. 자바스크립트 개발 환경과 실행방법 (0) | 2024.03.04 |
2장. 자바스크립트란? (0) | 2024.02.22 |