1. 개념
값(데이터)의 종류를 뜻함
- ES6 기준 6개의 원시 타입과 1개의 객체 타입으로 분류
- 원시 타입
- number, string, boolean, undefined, null, symbol
- 객체 타입
- 객체, 함수, 배열, …
- 원시 타입을 제외한 모든 값들이 객체 타입
- 뒤의 파트에서 객체를 배운 후 알아볼 예정
2. 숫자 타입 number type
2-1. 특징
- 자바스크립트 에서는 한가지의 숫자 타입만 존재
- int, float, double 과 같이 나누어져있지않고 number 하나로만 존재
- 모든 수를 실수로 처리
- 2진수, 8진수, 16진수 들은 참조시 10진수로 해석됨
// 모두 하나의 number 타입 & 실수로 처리됨
var vi = 77; // 77.0
var vd = 77.0; // 77.0
console.log(vi == vd);
// 결과로 true 가 출력
// 하나의 같은 타입으로 둘다 실수값 77.0으로 처리되어 같다고 해석이 된다
2-2. 세 가지 특별한 값
- 세 가지의 특별한 값을 숫자 타입으로 취급
- 양의 무한대 Infinity
- 음의 무한대 -Infinity
- NaN
- 이때, 대.소문자를 구분하므로 유의해야함
3. 문자열 타입 string type
3-1. 특징
- ‘’, “”, `` 으로 텍스트를 감쌈
- 변경 불가능한 값 immutable value
3-2. 템플릿 리터럴
- 편리한 문자열 처리 기능을 제공
- 백틱(``) 을 사용해 표현
3-2-1. 멀티라인 문자열
- 일반 문자열 내에서는 허용되지 않는 줄바꿈을 허용해주며 공백 또한 있는 그대로 적용됨
var html_code = `<div>
<span> multi_line string </span>
</div>`;
console.log(html_code);
// 위의 코드를 실행시킨 결과 개행과 공백을 그대로 유지
<div>
<span> multi_line string </span>
</div>
3-2-2. 표현식 삽입
- + 연산자를 사용해 문자열들을 연결하던 방법을 표현식 삽입을 통해 간단히 수행
- 가독성 좋고 간편하게 문자열을 조합
- ${} 로 감싸여서 입력
- 입력된 표현식의 평가 결과가 문자열이 아니더라도 문자열로 변환됨
var ex_inter = `15 * 5 = ${15*5}`;
console.log(ex_inter);
// 15 * 5 = 75 문자열이 출력된다
// 이때 {} 안의 표현식의 평가가 75로 숫자 타입이지만 문자열로 변환되어 출력됨
4. 불리언 타입 boolean type
4-1. 특징
참과 거짓을 뜻하는 값
- 참 = true
- 거짓 = false
5. undefined 타입
5-1. 특징
undefined 하나의 값만이 존재하는 타입
5-2. 주의할 점
- undefined 는 본래 자바스크립트 엔진이 변수를 초기화할 때 주로 사용되는 값
- 개발자가 의도적으로 변수에 할당하면 본래 취지와 어긋날뿐더러 혼란을 줄 수 있으므로 권장하지 않음
- 이런 경우에는 null 값을 주로 할당
6. null 타입
6-1. 특징
- null 하나의 값만이 존재하는 타입
- 대.소문자를 구분하기 때문에 주의해야 함
- 변수에 값이 없다는 것을 의도적으로 명시할 때 사용
- 변수가 유효한 값을 반환할 수 없는 경우에도 명시적으로 null 을 반환하기도 함
7. 심벌 타입 symbol type
7-1. 특징
- 변경 불가능한 원시 타입
- 다른 값과 중복되지 않는 유일무이한 값
- 주로 이름이 충돌할 위험이 없는 객체의 유일한 property 키를 만들기 위해 사용
- 리터럴을 통해 생성하는 다른 원시 타입들과는 달리 Symbol 함수를 호출해 생성
// 심벌 타입의 값 생성
var key = Symbol('key'); // Symbol 함수를 호출하여 생성
8. 데이터 타입의 필요성
8-1. 메모리 공간의 확보와 참조
8-1-1. 확보
메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 함
→ 변수에 할당되는 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정됨
8-1-2. 참조
참조시 한 번에 읽어 들여야 할 메모리 공간의 크기를 알아야 함
→ 변수에 할당된 값의 데이터 타입에 따라 결정된 메모리 공간의 크기만큼 읽어 들임
💡 심벌 테이블
심벌 테이블이라는 자료 구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리하게 된다.
8-2. 값의 해석
메모리에서 읽어온 값은 2진수
→ 어떻게 해석해야 할지 결정해야 함
→ 값의 데이터 타입에 맞춰 해석할 수 있음
8-3. 결론
3가지의 데이터 타입이 필요한 이유
- 값을 메모리에 저장할 때 공간의 크기를 결정하기 위해
- 값을 참조할 때 읽어 들여야 할 공간의 크기를 결정하기 위해
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
9. 동적 타이핑
값은 데이터 타입을 가짐
→ 값을 할당하는 변수는 어떻게 데이터 타입을 가질까?
9-1. 정적 타입 언어
변수를 선언할 때 변수에 할당할 수 있는 값의 데이터 타입으로 사전에 선언해야 함 → 명시적 타입 선언
- 변수의 타입을 변경할 수 없음
- 변수에 선언한 타입에 맞는 값만 할당 가능
- 컴파일 시점에서 타입 체크가 이루어짐
9-2. 동적 타입 언어
변수는 선언이 아닌 (재)할당에 의해 타입이 결정됨 → 동적 타이핑
- 재할당을 통해 언제든 변수의 타입은 변경될 수 있음
- 자바스크립트는 동적 타입 언어에 해당
- var, let, const 키워드를 통해 변수를 선언하고 (재)할당하는 값의 데이터 타입에 따라 결정
10. 동적 타입 언어와 변수
유연성은 높지만 신뢰성은 떨어지는 동적 타입 언어
10-1. 단점
- 언제든지 동적으로 변경됨 → 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려움
- 값의 데이터 타입에 따라 변수의 타입이 변경됨 → 값을 확인하기 전에는 변수의 타입을 확신할 수 없음
10-2. 변수 사용 시 주의할 점
- 필요한 만큼 최소한으로 유지하도록 주의
- 많을수록 오류 발생 확률의 증가
- 변수의 스코프는 최대한 좁게 만들도록 해야 함
- 어디서든 참조/변경될 수 있는 전역 변수는 최대한 사용하지 않도록 주의
- 변수보다 상수를 사용해 값의 변경을 억제
- 변수의 목적이나 의미를 파악할 수 있도록 이름을 짓도록 주의
결국 가독성이 좋은 코드가 좋은 코드