컴퓨터는 데이터를 어떻게 처리할까?
- 컴퓨터에게 데이터의 종류를 지정하고, 알려주어서 데이터 종류에 맞게 적합한 로직처리를 할 수 있게 해주어야합니다.
- 여기서 말하는 데이터의 종류를 '데이터타입', '자료형'이라고 합니다.
자바스크립트의 데이터 타입
1️⃣ 원시타입
: String, Number, BigInt, Undefined, Null, Boolean, Symbol
특징
- 값은 변경 불가능한 값입니다. (immutable value)
- 참조 형태로 전달되는 것이 아닌, '값'으로써 전달됩니다.
- 자바스크립트에는 원시 래퍼 객체가 따로 존재합니다. 원시 데이터를 사용할 경우, 해당 래퍼 객체들을 상속받아 사용할 수 있습니다. (원시 래퍼 객체와 원시 타입을 헷갈리지 말자!)
🤔 값은 변경되지 않나?
let a = 10;
a = 20;
10이라는 값은 그대로 존재하고, 변수 a가 새로운 값 20을 가리키게 된 것
-> 원시값 자체는 변경되지 않는다
객체타입은 객체 자체 주소는 그대로인데 내부 값이 바뀜!
2️⃣ 객체 타입
- 원시 타입의 값을 제외한 자바스크립트에서의 모든 것은 객체
- 여러 형태로 분류 할 수 있습니다 : 일반 객체, 함수, 날짜 ,인덱스 컬렉션, 키 컬렉션, ...
- 객체는 참조방식으로 전달됩니다. (Pass by reference) : 메모리 주소값이 전달, 의도치않게 데이터 변경될 수 있으므로 복사본을 전달해야함 (deep copy, shallow copy)
- 객체는 속성들을 변경할 수 있는 mutable한 값입니다.
Number Type - 배정밀도 64비트 부동소수점(IEEE 754)
- 숫자에는 정수, 실수가 존재하는데, 자바스크립트에서는 Number라는 하나의 숫자 타입만 존재합니다.
- 자바스크립트에서는 모든 숫자를 실수로 처리하기때문에, 정수타입이 없습니다.
- IEEE 754: 전자기술자 협회의 부동소수점 표현방식 표준
- 실수를 연산할 때 근사값으로 처리 : 0.1 + 0.2 != 0.3
- -(2^53-1) ~ (2^53 - 1)의 수 : 원시 래퍼객체에서 상수변수로 제공
- 숫자 이외
- Infinity (-Infinity) : 무한대를 나타내는 숫자
- Nan : Not A Number, 숫자가 아님
BigInt Type
- 임의 정밀도로 정수를 나타낼 수 있는 JavaScript 숫자 원시 값으로, 매우 큰 정수를 다룰 때 사용합니다.
- BigInt를 Number의 최대값을 넘는 정수도 안전하게 저장하고 연산할 수 있습니다.
- 다른 타입과 혼합하여 연산할 수 없습니다.
String Type
- 텍스트 데이터를 나타낼 때 사용
- UTF-16 코드 단위의 시퀀스 표현 (UTF-16 : 유니코드 문자 인코딩 방식 중 하나)
- 16bit 정수값의 요소로 구성된 집합
- 각 요소가 string의 한 자리
- 0번째 index부터 시작하여 배열처럼 접근 가능
- 원시값은 불변 -> 문자값은 불변!
- 표기법
- 따옴표나 쌍따옴표, 백팃(backtick)으로 감싸서 문자열임을 표현
- 템플릿 리터럴 표기법 (``)
- 백팃의 표현은 ES6 이후부터 사용가능
- 문자열 처리 기능 제공(줄바꿈 허용, 표현식 삽입 가능)
- String interpolation : `My name is ${표현식}`
Boolean Type
- 논리적 데이터 유형
- 참 혹은 거짓의 값만 가질 수 있음
- e.g.
- 상태값) input tag의 checkbox타입의 checked 상태
- flag값) 특정 UI의 노출여부를 보여주는 변수의 상태 isShow
Undefined Type
- 변수를 선언한 후 값을 할당하지 않은 변수에 할당이 되는 값
- 변수 초기화단계에서의 Undefined는 개발자의 의도해서 넣은 값이 아님
- 개발가 의도해서 넣을 수도 있습니다.
Null Type
- 값이 없다는 것을 의도적으로 표현할 때 null을 사용합니다.
- 이전에 참조되어있던 값을 의도적으로 더이상 참조하지 않겠다는 뜻으로도 사용합니다.
- null 타입 체크는 일치연산자(===) 사용 <- 자바스크립트 스펙 내의 버그 : null의 type 'object'로 나옴
Symbol Type
const a = Symbol();
const b = Symbol();
console.log(a === b); // false
- ES6에 추가된 타입
- 중복되지 않는 유니크한 값
- 객체의 key로 사용될 수 있음
- 클래스나 객체형식의 내부에서만 접근할 수 있도록 전용 객체 속성의 키로 사용
- Symbol함수를 호출하여 생성
const key = Symbol();
const obj = {
[key]: "value"
};
Reference Type
객체 타입
- 객체 타입, Object type, Reference type
- 객체 타입: 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조
- 객체: 데이터(속성), 데이터에 관련한 동작을(method) 포함하는 개념적 존재
- 원시 타입의 값을 제외한 자바스크립트에서의 모든 것은 객체
- 변경 가능한 값(mutable): 객체의 속성을 변경, 추가, 삭제 가능
- 힙 메모리에 저장
- 동적으로 변화 가능하므로, 메모리 공간 확보 및 저장
동적 타입 언어
- 자바스크립트는 동적 타입 언어
- 의도적으로 타입을 변환할 수도 있지만, 의도와 상관없이 변경되기도 함
- 명시적 타입 변환
- 암묵적 타입 변환
- 개발자가 의도하지 않았지만 타입이 변경될 가능성이 있습니다. -> 타입추론이 어려워져, 불필요한 디버깅 시간 발생
- 값 + "" : 문자열 타입으로 변환
- 값 * 1 : 숫자타입으로 변환
- !!값 : 불리언 타입으로 변환
- 해결 위해 전달되는 시점마다 typeof나 일치연산자 사용해 타입 guard 구현
- 자바스크립트 superSet 타입스크립트 사용
- 개발자가 의도하지 않았지만 타입이 변경될 가능성이 있습니다. -> 타입추론이 어려워져, 불필요한 디버깅 시간 발생
function foo(인자) {
if(typeof 인자 !== 'number') {
throw new Error('invalid 인자')
}
return 인자 + 3;
}
foo('apple');
>> Error: invalid 인자
'FE > Javascript' 카테고리의 다른 글
| [JavaScript] flow control (0) | 2026.03.17 |
|---|---|
| [JavaScript] 자바스크립트의 데이터처리 : 함수 (0) | 2026.03.17 |
| [JavaScript] 변수 생성 방법(var vs const, let), 호이스팅 , 변수 네이밍 컨벤션 (0) | 2026.03.13 |
| [JavaScript] javaScript의 기본 특징 (0) | 2026.03.09 |
| [JavaScript] 애니메이션, form, 조건문 (0) | 2025.06.30 |