변수란?
: 데이터를 처리하기 위해 기억해야 함
- 데이터를 처리하는 과정에서 처리 흐름마다 값들을 기억해둘 필요가 있음
- 컴퓨터는 데이터를 기억하기 위해 메모리(컴퓨터의 기억장치)를 활용
- 메모리
- 메모리에 데이터를 담아 기억
- 각각의 위치 주소값이 존재
- 위치를 찾기 위해서는 메모리의 주소값 사용
메모리 주소값의 별칭, 변수
- 메모리 주소값을 대신할 식별자를 지정하고, 식별자를 통해 데이터 접근
- 식별자 == 변수
변수란,
데이터를 담아둔 메모리의 주소를 쉽게 식별하기 위해 붙인 이름
자바스크립트의 변수 syntax
- 키워드 : let / const / var
- 변수명
- 할당 연산자
- 값
변수 생성 방법과 호이스팅
3가지 단계를 거쳐 생성되는 변수
- 선언 단계 : 변수를 변수 객체에 등록
- 초기화 단계 : 변수를 메모리에 할당하고, undefined로 초기화
- 할당 단계 : undefined로 초기화된 변수에 실제로 값을 할당
→ 변수 생성 3단계는 키워드 별(var, const, let)로 다르게 동작
var 키워드
- 코드 평가 단계 : 선언과 동시에 초기화 진행
- 코드 실행 단계 : 값 할당 진행
- 코드 평가 시점에 초기화가 되어있으므로, 변수의 할당문이 실행되기 전에도 참조가 가능 (호이스팅)
console.log(a);
console.log(b);
var a = 1;
var b = 2;
- 호이스팅(Hoisting)
- 모든 선언문이 해당 Scope의 선두로 옮겨진 것처럼 동작하는 특성
- 함수 호이스팅, 변수 호이스팅, ...
- 단점
- 키워드의 생략 가능
- 중복 선언 가능
- 변수 호이스팅
a = 1;
var a = 2;
console.log(window.a);
const b = 1;
console.log(window.b);
const, let 키워드
- 코드 평가 단계 : 선언 진행
- 코드 실행 단계 : 초기화 진행, 값 할당 진행
- 코드 평가 시점에 선언만 진행되므로, 변수의 할당문이 실행되기 전에 참조가 불가
console.log(a);
const a = 1;
> ReferenceError가 발생!
변수 실습

-> a는 평가단계에서 초기화가 진행되므로 초반에 undefined로 정의되어 있음
-> b는 선언 전에 초기화단계가 진행되지 않았으므로, 선언 전에 참조를 할 경우 레퍼런스 에러가 뜸을 알 수 있음

-> c는 할당문이 없어 초기화단계만 진행되므로 최종적으로 undefined로 할당됨
변수 네이밍 컨벤션
- Camel Case getNumber
- Snake Case get_number
- Pascal Case GetNumber
- Constant Case GET_NUMBER
자료형이란?
컴퓨터는 어떻게 알고 데이터를 처리할까?
-
우리는 컴퓨터에게 데이터의 종류를 지정하고 알려주어, 데이터 종류에 맞게 적합한 로직처리를 할 수 있게 해주어야 함
-
여기서 말하는 데이터의 종류를 데이터 타입, 자료형이라고 함
-
언어별로 지원하는 데이터의 타입은 모두 다름
- C언어 : 문자, 정수, 실수, ...
- Java: 문자, 정수, 실수, 논리, ...
- Python : 문자, 정수, 실수, ...
자바스크립트의 데이터 타입
-> 자바스크립트는 크게 2가지 타입(원시, 객체)을 제공
- 원시 타입
- 자바스크립트는 String, Number, BigInt, Undefined, Null, Boolean, Symbol 7가지의 원시 타입을 제공
- 특징
- 값은 변경 불가능(immutable value)한 값.
- "값"으로써 전달됨 (참조 형태로 전달되는 것이 아님)
- 자바스크립트에는 원시 레퍼 객체가 따로 존재. 원시 데이터를 사용할 경우, 해당 레퍼 객체들을 상속받아 사용 가능 (원시 래퍼 객체와 원시 타입을 헷갈리면 안됨)
- 객체 타입
- 원시 타입의 값을 제외한 자바스크립트에서 모든 것은 객체
- 객체는 여러 형태로 분류할 수 있음 (일반 객체와 함수, 날짜, 인덱스 컬레션, 키 컬렉션, ...)
- 특징
- 객체는 참조방식으로 전달됨 (= Pass by reference) 객체의 메모리 주소값으로 전달된다고 생각하면 될듯.
- 참조방식으로 전달할 경우 데이터가 의도치않게 변경될 가능성이 있기 때문에 복사본으로 전달해야 함
(Fyi; deep copy, shallow copy)
객체는 속성들을 변경할 수 있는 mutable한 값
원시타입 - Number Type, BigInt Type
Number Type
- 숫자에는 정수, 실수가 존재
다른언어 : int, long, float, double 등..
자바스크립트에는 하나의 숫자 타입만 존재 = Number
- 자바스크립트는 모든 숫자를 실수로 처리 (정수타입 없음)
Number Type-배정밀도 64비트 부동소수점
- 자바스크립트의 숫자표현 : 배정밀도 64비트 부동소수점
- IEEE 754 : 전자기술자 협회의 부동소수점 표현방식 표준
- 실수를 연산할 때, 근사값으로 처리 : 0.1 + 0.2는 0.3이 아님
- -(2^53 - 1)부터 2^53 - 1의 수
- 원시 래퍼객체에서 상수변수로 제공
- Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER
- 숫자형에는 우리가 아는 숫자 이외에 Infinty, NaN이라는 값도 존재
- Infinity : 무한대를 나타내는 숫자(-Infinity)
- NaN : Not A Number의 줄임말. 숫자가 아님을 나타냄
BigInt Type
- 임의 정밀도로 정수를 나타낼 수 있는 JavaScript 숫자 원시 값
- BigInt를 Number의 최대값을 넘는 정수도 안전하게 저장하고 연산할 수 있음
- 다른 타입과 혼합하여 연산할 수 없음
원시타입 - StrType, Boolean Type
String Type
String Type - 표기법
- 따옴표나 쌍따옴표, 백팃(backtick)으로 감싸서 문자열임을 표현
- 템플릿 리터러 표기법(``)
- 백팃의 표현은 ES6이후부터 사용 가능
- 문자열 처리 기능 제공 (줄바꿈 허용, 표현식 삽입 가능)
- String interpolation
My name is ${ 표현식 }
Boolean Type
- 논리적 데이터 유형
- 참 혹은 거짓의 값만 가질 수 있음
- e.g.
- 상태값) input tag의 checkbox타입의 checked 상태
- flag 값) 특정 UI의 노출여부를 보여주는 변수의 상태 isShow
원시타입 - undefined와 null Type, Symbol Type
Undefined Type
- 변수를 선언한 후 값을 할당하지 않은 변수에 할당이 되는 값
- 변수 초기화 단계에서의 Undefined는 개발자가 의도해서 넣은 값이 아님
- 개발자가 의도해서 넣을 수도 있음
-> foo의 경우 의도해서 넣은 것이 아니지만, bar의 경우 의도함
Null Type
-
값이 없다는 것을 의도적으로 표현할 때 null을 사용
-
이전에 참조되어있던 값을 의도적으로 더이상 참조하지 않겠다는 뜻으로도 사용

-
null 타입 체크는 일치연산자(===) 사용
- null의 type은 'object'라고 나오는데, 이는 자바스크립트 스펙 내의 버그
- null의 타입체크는 일치연산자를 활용
Symbol Type
- ES6에 추가된 타입
- 중복되지 않는 유니크한 값
- 객체의 key로 사용될 수 있음
- 클래스나 객체형식의 내부에서만 접근할 수 있도록 전용 객체 속성의 키로 사용
- Symbol 함수를 호출하여 생성
Reference type
객체 타입
- 객체 타입, Object type, Reference type
- 객체 타입 : 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조
- 객체 : 데이터(속성), 데이터에 관련한 동작(method)을 포함하는 개념적인 존재
- 원시 타입의 값을 제외한 자바스크립트에서의 모든 것은 객체
객체 타입 - mutable
- 변경 가능한 값(mutable) : 객체의 속성을 변경, 추가, 삭제 가능
- 힙 메모리에 저장
- 동적으로 변화 가능하므로, 메모리 공간 확보 및 저장
- Pass-by-reference
여러 형태의 객체 타입
- 일반 객체와 함수
- 날짜
- 인덱스 컬렉션
- 키 컬렉션
- ...
동작 타입 언어
동적 타입 언어?
- 자바스크립트는 동적 타입 언어
- 의도적으로 타입을 변환할 수도 있지만, 의도와는 상관없이 변경되기도 함
명시적 타입 변환
- 원시 래퍼 객체를 활용하여 개발자가 의도적으로 타입을 변경할 수 있음
- 값.toString() 문자열 타입으로 변환
- Number(값) 숫자 타입으로 변환
- Boolean(값) 불리언 타입으로 변환
암묵적 타입 변환
- 개발자가 의도하지 않았지만, 타입이 변경될 때가 있음
- 값 + "" 문자열 타입으로 변환
- 값 * 1 숫자 타입으로 변환
- ! !값 불리언 타입으로 변환
- 값이 전달될 때, 참조되어있던 변수 값 타입이 개발자의 의도와 다르게 암묵적 타입변환으로 변경될 가능성이 있음
- 타입 추론이 어려워져, 불필요한 디버깅 시간 발생
- 이를 해결하기 위해
- 전달되는 시점마다 typeof나 일치연산자를 사용하여 타입 guard 구현
- 자바스크립트 superSet 타입스크립트 사용