챕터 4. 변수
자바스크립트 동작 원리
컴퓨터가 계산을 수행하기 위해서는 컴퓨터가 리터럴과 연산자의 의미를 이해해야합니다.
또한, 컴퓨터가 해당 계산식에 대한 의미를 2진수로 파싱할 수 있어야 합니다.
컴퓨터 구동 방식
메모리
- 컴퓨터는 1 바이트 단위로 데이터를 저장 및 읽음
- 각 메모리 셀은 고유 주소를 가짐
- 메모리 주소는 0부터 메모리 크기에 해당하는 숫자까지의 주소를 지님
- 메모리 계산을 위해 ‘10+20’에 해당하는 식은 10, 20, 그리고 결과값인 30이 각각 메모리 주소에 저장됨
- 메모리를 변수에 저장하지 않았으므로 해당 결과값(30)은 메모리에 단순 저장만 된 상태
메모리를 직접 접근하고 제어하는 것은 운영체제에 큰 문제를 야기할 수 있습니다.
또한, 코드가 같더라도 값이 저장되는 메모리 주소는 계속해서 달라집니다.
변수
- 하나의 값을 저장하기 위해 확보한 메모리 공간 그 자체
- 메모리 공간을 식별하기 위해 붙인 이름
- 값을 저장하고 참조하는 메커니즘을 위한, 값의 위치를 가리키는 이름
변수 이름
- 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름
- 변수에 지정된 값을 ‘변수값’이라고 함
- 변수에 값을 저장하는 것을 ‘할당’이라고 함
- 변수에 저장된 값을 읽어 들이는 것을 ‘참조’라고 함
📌 변수 이름을 통해 변수에 저장된 값의 의미를 명확히 알 수 있음
📌 따라서 좋은 이름, 저장된 값의 의미를 파악할 수 있는 변수 이름을 설정해야함
- 변수 이름을 식별자라고도 함
- 식별자란, 특정 값을 구별해서 식별할 수 있는 고유한 이름
- 이름을 통해서 각각의 값들을 구분할 수 있음
- 식별자는 메모리 주소를 기억해야함
- 식별자는 값이 아닌, 메모리 주소를 기억하는 것을 꼭 주의!!
주의할 점
- 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자
ex) 함수, 클래스, 변수, 변수 이름 등등
- 함수와 클래스와 같은 식별자는 네이밍 규칙을 준수해야함
변수 선언
- 변수를 생성하는 것을 의미함
- 메모리 주소 확보 및 해당 주소와 변수 이름을 연결하여 특정 값을 저장하게함
-
변수 선언 방식
- let
- const
- var
-
var는 block level scope를 지원하지 않아, 전역 변수가 선언됩니다.
-
변수를 선언한 경우, 값이 할당되지 않았다면 ‘undefined’가 할당되며, 이러한 과정을 ‘초기화’라고 합니다.
```
var score; //변수 선언
console.log(score) // undefined
```
- 자바스크립 트 엔진은 2단계에 거쳐 변수 선언을 수행
- 선언 : 변수 이름을 등록하여 자바스크립트 엔진에 알림
- 초기화 : 값을 저장하기 위한 메모리 공간 확보, undefinde 할당
- 초기화를 하지 않으면 이전 앱에서 사용한 데이터가 남아있을 수 있음
- 변수 이름을 포함한 모든 식별자는 ‘실행 컨텍스트’에 등록됨
- 실행 컨텍스트
- 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경 제공
- 코드 실행 결과 관리
- 식별자와 스코프 관리
- 변수 이름, 변수 값은 컨텍스트 내에서 객체 형태로 등록 및 관리
- 선언하지 않은 식별자에 접근하고자 할 때
- ReferenceError가 발생
- 등록된 식별자를 찾지 못하는 경우 해당 에러 발생
-
변수 선언과 호이스팅
- 소스 코드는 일반적으로 블록 단위로 실행되지만,(run time)
- var에 의한 변수 선언은 그 이전 단계에서 먼저 실행됨
- 변수 선언, 함수 선언 등은 소스코드 실행 이전에 먼저 실행됨
- 그 이후, 소스코드가 한 줄씩 순차적으로 실행됨
- 변수 호이스팅
- 이렇게 변수 선언문이 코드 맨 처음으로 끌어올려 지는 것과 같은 현상을 말함
-
할당
-
할당 연산자는 =이며, 우변의 값을 좌변의 변수에 할당하는 역할을 함
var score;
score = 100;
-
단축문 : 해당 선언과 할당 과정은 아래와 같이 단축 가능
var = 100;
📌 주의 : 단축문 역시도, 선언은 런타임 이전에 먼저 실행되지만, 할당은 소스코드가 순차적으로 실행되는 시점에 실행됨
console.log(score);
var score;
score = 100;
console.log(score)
-
1개의 문에서도 먼저 선언이 이루어지고 할당을 하는 2단계로 수행됨
- 변수 이름을 지정하고 해당 변수명과 메모리 주소를 연결하여, undefined를 할당
- 할당을 위한 새로운 메모리 주소와 값을 변수 이름에 연결하여 해당 값을 할당
- 이 때 undefined 메모리 주소에는 그대로 남아있고 새로운 메모리 주소에 새로운 값이 차지하게 됨
-
재할당
-
할당된 값이 있는 변수에 새로운 값을 할당하는 것
-
undefined에서 새로운 값을 할당하는 것 역시도 재할당
-
const는 단 한 번만 할당 가능(재할당 금지)
📌 const로 선언 및 할당한 변수를 재할당하는 경우,
TypeError 발생
-
변수와 연결되지 않은 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제되지만, 언제 해제될지는 예측할 수 없음
-
식별자 네이밍 규칙
챕터 5. 표현식과 문
- 값
- 표현식이 평가되어 생성된 결과
- 평가 : 식을 해석해서 값을 생성하거나 참조하는 것
- ex) 덧셈을 수행하는 코드는 해당 식을 평가하여 덧셈을 수행한 결과를 생성함
- 모든 값은 데이터 타입을 가짐
- 해당 데이터 타입에 따라 같은 숫자가 저장되더라도 다른 의미로 해석됨
var sum = 1+2
- sum이라는 변수명에는 1+2가 할당되는 것이 아닌, 1+2의 결과값이 할당됨
- 리터럴
- 약속된 기호를 사용한 문법을 이용하여, 값을 생성하는 표기법
- 숫자 1,2는 단순한 숫자가 아니라 숫자 리터럴에 해당
- 자바스크립트는 리터럴 1을 코드에 작성하면 엔진에서 이를 평가하여 숫자 1을 생성함
- 자바스크립트 엔진은 런타임에 리터럴을 평가하여 값을 생성
- 리터럴 예시
- 정수 리터럴
- 부동소수점 리터럴
- 2진수 리터럴
- 8진수 리터럴
- 16진수 리터럴
- 문자열 리터럴
- 불리언 리터럴
- null
- undefined
- 객체 리터럴
- 배열 리터럴
- 함수 리터럴
- 정규 표현식 리터럴
- 표현식
- 값으로 평가될 수 있는 코드 명령ㅁ
- 표현식이 평가되고 새로운 값을 생성하거나 기존 값을 참고함
- 리터럴 역시 표현식
- 명령문
- 프로그램을 구성하는 기본 단위
- 최소 실행 단위
- 명령문은 여러 토큰으로 구성됨
- 토큰은 문법적인 의미를 지니며 더이상 나눌 수 없는 코드의 요소를 의미
- 명령문의 종류
- 표현식인 문과 표현식이 아닌 문의 차이
- 문은 표현식을 아우르는 더 넓은 개념
- 표현식은 값으로 평가되어 변수에 할당 가능
- 표현식이 아닌 문은 값으로 평가할 수 없으므로 변수에 할당하면 에러 발생
const y = x = 100
- 위와 같은 코드에서 x = 100은 할당문이며 이는 할당한 값으로 평가됨
- 따라서 y에는 100이 할당되며 오류가 발생하지 않음
- 크롬 개발자 도구에서 표현식이 아닌 문을 실행 시에는 undefined 출력
챕터 6. 데이터 타입
- 데이터 타입
- 값의 종류를 뜻함
- 모든 자바스크립트 내에서의 값은 데이터 타입을 지님
- 데이터 타입은 총 7개의 종류며 이는 원시 타입, 객체 타입으로 분류 가능
- 원시 타입
- 숫자 데이터
- 다른 언어와 달리 숫자는 64비트 부동소수점 형식을 따름
- 모든 숫자는 실수로 처리
- 특별한 숫자 타입
- Infinity
- -Infinity
- NaN : 산술 연산 불가
- 문자열
- 텍스트 데이터
- 0개 이상의 16비트 유니코드 문자의 집합
- 따옴표로 감싸게 된 경우에는 공백 역시도 문자로 인식됨
- 변경이 불가능한 값
- 템플릿 리터럴
백틱 기호 사용
- 런타임에 일반 문자열로 변환되어 처리됨
- 편리한 문자열 처리 기능 제공
- 멀티라인 문자열
- 일반 문자열은 줄바꿈이 허용되지 않음 (SyntaxError)
- 따라서 이스케이프 시퀀스를 사용해야함(\n)
- 하지만 템플릿 리터럴에서는 공백이 그대로 적용됨
- 표현식 삽입
내에서 ${ }으로 표현식을 감싸서 표현식 삽입 가능
- 표현식의 결과가 문자열이 아니면, 문자열로 타입이 강제로 변환됨
- 태그드 템플릿
- 불리언 : true or false
- undefined : 암시적으로 할당된 값
- null : 명시적으로 값이 없는 경우에 사용하는 값
- document.querySelector 메소드는 선택자에 맞는 요소를 찾지 못하는 경우에 null 값을 에러 대신에 반환함
- symbol
- 변경 불가능한 원시 타입의 값
- 다른 값과 중복되지 않는 값
- 객체 타입
- 데이터 타입의 필요성
- 자바스크립트 엔진은 값의 종류에 따라 정해진 크기의 공간을 확보한 후, 값을 메모리에 저장함
- 값을 참조하기 위해서 한 번에 읽어들여야할 메모리의 크기를 알아야함
- 또한, 숫자의 경우 64비트 부동소수점 형식을 이용하기 때문에 8바이트로 저장됨
- 따라서 8바이트 단위로 값을 읽어들이지 않으면 값이 훼손됨
- 심벌 테이블 자료 구조
- 컴파일러 혹은 인터프리터가 식별자를 객체 형태로 바인딩 된 해당하는 값의 메모리 주소, 데이터 타입, 스코프 등을 관리함
- 동적 타이핑
- 정적 타입 언어와 달리 변수에 어떠한 타입의 데이터를 할당시킬 수 있음
- 선언이 아닌 할당에 의해 데이터의 타입이 결정됨 (type inference)
- 재할당에 의해 언제든지 동적으로 변수의 타입이 변할 수 있는 언어 = 동적 타입 언어
- 단점
- 변수의 값을 추적하기 어려움
- 변수의 타입을 확신할 수 없음
- 엔진에 의해 자동으로 변경되는 경우에는 더더욱
- 변수는 최소한의 수로 작성
- 스코프를 최대한 좁게 만들기
- 전역 변수는 최대한 사용하지 않기
- 상수를 사용하기