
javascript에서 자료형은 크게 두가지라고 볼 수 있다.
1. 원시 자료형(primitive data types)
2. 참조 자료형(reference data types)
한정된 메모리 안에서 최대한의 작업을 수행하기 위해서 데이터 종류에 따라 적절하게 분배하려고
얄코 첫번째 정리에서 말했듯 javascript는 인터프리터 언어이다.
(그냥 생 인터프리터 언어는 아니지만)
인터프리터와 대조되는 개념이 컴파일이라는 것 부터 보자.
!! 컴파일 언어와 인터프리터의 언어의 경계는 절대적이지 않습니다!!
컴파일 언어의 대표적인 예시는 java라고 볼 수 있다. java는 코드를 짜고 컴파일러가 컴파일 된 파일을 뱉으면 jvm에서 실행한다.
컴파일 언어를 사용하는 경우 컴파일 오류를 자주 볼 수 있다.
컴파일 오류란?
실행 전 오류를 잡아내야하기 때문에 컴파일 과정에서 개발자에게 일관성을 요구하여
대부분 자료형에 변화가 없는 정적 타입에서 일어나는 오류이다.
인터프리터 언어는 코드를 배포한 후에 인터프리터를 거쳐서 실행하는데
이때 javascript는 배포 후의 과정에서 컴파일 단계를 거치기도 한다.
javascript는 자료형에 변화가 있다. 그래서 동적이라고 볼 수 있다.
얄코 선생님께서는 컴파일 언어를 집에서 세는 바가지고
인터프리터 언어가 밖에서 세는 바가지라고 표현하셨다.
'하'+'이'와 같은 표현보다 근래에는 백틱(`)을 이용한 표현이 많아졌다.
<예를 들어>
const num = 100;
console.log(`내 성적은 ${num}점이다.`);
이런식으로 많이 사용된다.
이런 방식을 Template literals라고 부른다.
종류
NaN은 비교연산자로 비교할 수 없다.
비교하는 방법 1. isNaN() 2.Number.isNaN()
1번은 숫자가 아니다 싶으면 무조건 true를 뱉지만
2번은 숫자 자료형이지만 숫자가 아니면 true를 반환한다.number는 다양한 산술 연산자가 사용되는데부동 소수점(floating point)
컴퓨터는 이진법을 주로 사용하는데 각 0.1 등 소수점을 이진법 혹은 심진법과 같은 원리로 정확하게 표현하기 힘들다. (무한소수를 발생시키기 때문에)
따라서 어느정도의 소수점 이하로 내려갔을 때 반올림하여 계산한다.
0.1+0.2!==0.3
그래서 이러한 결과가 나오는 것이다.
number를 사용하다보면 숫자가 크거나 다양한 소수도 존재한다.
따라서 부동 소수점이 생겨났다.
부동 소수점과 대조되는 방식은 고정 소수점인데
고정 소수점은 15bits로 정수를 표현하고 16bits로 소수를 표현한다. 따라서 지수 부분에서 소수점의 위치를 변할 수 있는 8bits가 있는 부동 소수점보다 적은 범위의 숫자를 나타낸다.
종류
부정연산자
ex) 
AND(&&)/ OR(||)연산자
&&는 하나라도 false이면 false
||는 하나라도 true이면 true
이 연산자에서는 단축 평가가 일어난다.
AND연산자는 앞의 것이 false이면 뒤의 것을 평가 x
OR연산자는 앞의 것이 true이면 뒤에 것을 평가 x
삼항 연산자 (~?~:~)
이 부분에서는 Truthy, falsy 를 기억하자
- Truthy : 0, 빈문자, null, undefined, NaN 을 제외하고는 true
- falsy : 0, 빈문자, null, undefined, NaN 는 false 취급
?? 연산자
이 연산자는 null이나 undefined만 대체한다.

하지만 비교연산자를 사용했을 때 ex) 1234 == true 는 false이다.
다만 1 == true , 0 == false이다.
원시 타입이 아닌 데이터는 대체로 객체이다.
원시 타입이 데이터로 저장했다면 객체는 프로퍼티(키와 값의 조합)로 저장하는 자료형이다.
접근 방법

이렇게 (.)와 ([])를 사용하는 두가지의 방법이 있다.
객체 안에 어떤 키가 포함되어있나 확인하는 방법

객체의 특별한 기능
const는 원래 바뀌지 않는 상수를 선언할 때 사용하지만 바뀌게 만들 수 있다.
어떻게?
객체를 사용해서!
const로 할당한 객체가 바뀌지는 않는다. 하지만 그 안에 객체의 내용은 바뀔 수 있다!
배열도 객체와 마찬가지로 인덱스를 활용해서 그 안의 내용을 변경 할 수 있다.
객체와 배열은 서로 중첩 사용이 가능하다.
즉, 배열안에 객체 가능 && 객체 안에 배열 가능
원시타입
값에 의한 복사다.

즉 b는 a의 값 자체를 복사한 것이다.
b가 재할당 되기 전에는 같은 데이터 영역을 가르키고 있다.
이후에는 각각 다른 메모리를 가르키고 있다.
참조타입
참조에 의한 복사다.
const obj1 = {
num: 1, str: 'ABC', bool: true
};
const obj2 = obj1;
// obj2 = {};
// const 로 선언했기 때문에 다른 값으로 재할당 x
이후 obj2의 내용을 바꿔도 obj1의 내용도 같이 바뀐다.
배열도 마찬가지.

javascript는 왜 자료형에 변화가 있을까?
섹션 2는 내용이 많다. 하지만 역시나 참조 개념을 잘 설명해주셔서 너무 좋았다.
하지만 개념을 한번에 약간 축약해서 빠른 시간내에 정복? 개념으로 하려다보니 세세한 부분은 조금 부족한 경향이 있었지만 핵심은 잘 잡아줘서 아직 괜찮게 듣고 있다고 생각한다.
사실 앞 부분은 약간의 이론이고 거의 기본적인 것이라서 크게 후기라고 달게 없다.
+) 원시 자료형을 함수에 인자로 넘길 때는 call by value방식으로 전달된다.
참조 자료형을 함수에 인자로 넘길 때는 call by reference방식으로 전달된다? (o/x)
답 : x => 참조 자료형을 넘겨도 call by value이다.(서적, 블로그, 심지어 유명한 자료와 서적에서 조차도 call by reference라고 나오는 경우가 매우 많은데 오류이다.)
궁금하면 찾아봐. 언젠간 알아야하는 내용중 하나.
v8 바이트 코드를 뜯어보면 두 경우에 인자가 같은 방식으로 전달됨을 알 수 있다.
퀴즈 : 왜 굳이 원시 자료형과 참조 자료형을 나눈 것일까? 객체하고 배열을 원시 자료형처럼 구현하면 안됐을까?
참조 자료형을 도입함으로서 데이터 복사에 이슈가 발생한다. 그러한 이슈가 발생하는 이유는 무엇인가?