해당 포스팅은 MDN Web Docs의 JavaScript의 타입과 자료구조 중 일부를 요약한 내용입니다.
우선 어떤 데이터 타입이 있는지 먼저 알아보자.
데이터 타입
1. Number : 매우 큰 정수를 제외한 모든 숫자값(정수 및 부동 소수점)
2. BigInt : 임의의 큰 정수
3. String : 문자열
4. Boolean : true/false, 일반적으로 조건 논리에 사용
5. Symbol : 충돌하지 않는 고유 식별자를 만드는 데 사용
6. Undefined : 변수에 값이 할당되지 않았음을 나타냄
7. Null : 의도적으로 값이 없음을 나타냄.
다른 모든 것은 객체라고 한다. 일반적인 객체 타입은 다음과 같다.
1. Function : 함수의 메서드를 제공. 자바스크립트에서 모든 함수는 사실 Function 객체.
2. Array : 배열. 크기 조정이 가능하고, 데이터 타입을 혼합하여 저장 가능.
3. Date : 1970년 1월 1일 UTC(협정 세계시) 자정과의 시간 차이를 밀리초로 나타내는 정수 값
4. RegExp : 패턴을 사용해 텍스트를 판별할 때 사용
5. Error : 런타임 오류가 발생했을 때 던져지는 객체
자세한 내용은 여기 참조
동적 및 약타입
자바스크립트는 동적 타입이 있는 동적 언어. 동적 언어의 자료형은 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 결정하게 된다. 타입 없이 변수만 선언하여 값을 지정할 수 있고, 다른 타입의 값으로 재할당도 가능하다.
let foo = 39; // 숫자
foo = "bar"; // 문자열
foo = true; // boolean
자바스크립트는 약타입 언어이기도 하다. 즉, 작업에 타입 오류가 발생하는 대신, 일치하지 않는 타입이 포함된 경우 암시적 타입 변환이 가능.
const foo = 39; // foo는 숫자
const result = foo + "1"; // foo를 문자열로 강제 변환하여 다른 피연산자와 연결
console.log(result);
// 출력 : 391
이런 암시적 형변환은 매우 편리하지만, 개발자가 의도하지 않았거나, 다른 방향으로 변환하려는 경우(ex. 숫자->문자열 대신, 문자열->숫자로 변환)에는 잠재적인 오류(footgun)가 될 수 있다. 다만, Symbol과 BigInt의 경우, 자바스크립트는 의도적으로 특정 암시적 타입 변환을 허용하지 않는다.
원시 값 (Primitive values)
객체를 제외한 모든 타입은 언어의 최하위 수준에서 직접 표현되는 불변 값을 정의하는데, 이러한 타입의 값을 원시 값이라고 한다. 쉽게 말하자면 앞서 얘기한 Number, String과 같은 데이터 타입이라고 할 수 있다.
`null`을 제외한 모든 기본 타입은 `typeof` 산자로 테스트할 수 있다.`typeof null`은 `object`를 반환하므로 `=== null`을 사용하여 `null`을 테스트해야 한다.

`null` 및 `undefined`를 제외한 모든 원시 타입에는 원시 값으로 작업하는 데 유용한 메서드를 제공하는 해당 객체 래퍼 타입이 있다. 예를 들자면 `Number` 객체는 `toExponential()`와 같은 메서드를 제공한다. 원시 값에서 속성에 접근하면, 자바스크립트는 해당 래퍼 객체로 자동으로 감싸는 대신 객체의 속성에 접근한다. 그러나 `null` 또는 `undefined`에서 속성에 접근하면, `TypeError` 예외가 발생하므로 Optional chaining 연산자를 도입해야 한다.
Type | typeof return value | Object wrapper |
Null 타입 | "object" | N/A |
Undefined 타입 | "undefined" | N/A |
Boolean 타입 | "boolean" | Boolean |
Number 타입 | "number" | Number |
BigInt 타입 | "bigInt" | BigInt |
String 타입 | "string" | String |
Symbol 타입 | "symbol" | Symbol |
Null 타입
Null 타입은 `null`이라는 오직 하나의 값만 가질 수 있다.
Undefined 타입
Undefined 타입도 `undefined`이라는 오직 하나의 값만 가질 수 있다.
개념적으로, `undefined`는 값이 없음을 의미하고, `null`은 객체가 없음을 의미한다. 일반적으로 값이 없는 경우 언어의 기본값은 `undefined`이다.
Boolean 타입
Boolean 타입은 논리 요소를 나타내며 `true`와 `false` 두 가지의 값을 가질 수 있다.
일반적으로 삼항 연산자, `if ... else`, `while` 등을 포함한 조건부 연산에 사용된다.
Number 타입
Number 타입은 정수, 실수, 양수, 음수, 지수 등 모든 숫자 값을 나타낼 수 있다. 그렇지만 배정밀도 64비트 이진 형식 IEEE 754 값이기 때문에 모든 범위의 숫자를 저장할 수는 없고, -(2^53-1) ~ 2^53-1 범위의 정수만 안전하게 저장할 수 있다.

이 예시를 보면 최대 범위를 벗어나는 값은 정확성을 잃고 배정밀도 부동 소수점 근사값으로 표시된다. `Number.isSafeInterger()`을 사용하여 숫자가 안전한 정수 범위내에 있는지 확인할 수 있다. 만약 Number가 표현할 수 있는 범위보다 큰 숫자를 저장하고 싶다면 BigInt를 사용하면 된다.
BigInt 타입
BigInt 타입은 임의 정밀도로 정수를 나타낼 수 있는 자바스크립트 숫자 원시 값이다. BigInt로 `Number.MAX_SAFE_INTEGER`을 넘어서는 큰 정수도 안전하게 저장하고 연산할 수 있다.
BigInt는 정수 끝에 `n`을 추가하거나 `BigInt()` 함수를 호출해 생성할 수 있다.
BigInt는 `+`, `-`, `*`, `**`, `%` 연산자는 사용할 수 있지만, `>>>`는 사용할 수 없다. BigInt는 Number와 엄격하게 같지(===)는 않지만, 느슨하게(==) 유사하다.
BigInt는 소수를 나타낼 수는 없지만, 큰 정수를 더 정확하게 나타낼 수 있다.
String 타입
String 타입은 텍스트 데이터를 나타내며, UTF-16 코드 단위 수를 나타내는 16비트 부호 없는 정수 값의 나열로 인코딩된다. String의 각 요소는 인덱스로 접근할 수 있다.
자바스크립트의 String은 한 번 생성하면 수정이 불가능하다. String 메서드는 현재 String의 내용을 기반으로 새 String을 만든다. 예를 들면, substring()을 이용하여 원래 String의 하위 String을 만들거나 연결 연산자(`+`) 또는 `concat()`을 사용하여 두 문자열을 연결할 때 말이다.
Symbol 타입
Symbol은 고유하고 변경 불가능한 원시 값이며 객체의 속성 키로 사용할 수 있다.
심볼은 객체에 속성을 추가할 때 고유한 키를 부여하여 다른 코드와 충돌하지 않도록 할 때 많이 쓰이며, 이렇게 추가한 속성은 일반적인 방법으로는 접근할 수 없으므로 약한 형태의 캡슐화, 혹은 정보 은닉을 제공한다.
'Language > Javascript·Typescript' 카테고리의 다른 글
[Javascript/자바스크립트] 대문자 소문자 변환 (0) | 2024.06.21 |
---|---|
[Javascript/자바스크립트] 자바스크립트로 입력 받기 (0) | 2024.06.19 |
[TypeScript/타입스크립트] 클래스 Class (0) | 2023.04.06 |
[TypeScript/타입스크립트] 리터럴, 유니온/교차 타입 (0) | 2023.03.31 |
[TypeScript/타입스크립트] 함수 (0) | 2023.03.31 |
해당 포스팅은 MDN Web Docs의 JavaScript의 타입과 자료구조 중 일부를 요약한 내용입니다.
우선 어떤 데이터 타입이 있는지 먼저 알아보자.
데이터 타입
1. Number : 매우 큰 정수를 제외한 모든 숫자값(정수 및 부동 소수점)
2. BigInt : 임의의 큰 정수
3. String : 문자열
4. Boolean : true/false, 일반적으로 조건 논리에 사용
5. Symbol : 충돌하지 않는 고유 식별자를 만드는 데 사용
6. Undefined : 변수에 값이 할당되지 않았음을 나타냄
7. Null : 의도적으로 값이 없음을 나타냄.
다른 모든 것은 객체라고 한다. 일반적인 객체 타입은 다음과 같다.
1. Function : 함수의 메서드를 제공. 자바스크립트에서 모든 함수는 사실 Function 객체.
2. Array : 배열. 크기 조정이 가능하고, 데이터 타입을 혼합하여 저장 가능.
3. Date : 1970년 1월 1일 UTC(협정 세계시) 자정과의 시간 차이를 밀리초로 나타내는 정수 값
4. RegExp : 패턴을 사용해 텍스트를 판별할 때 사용
5. Error : 런타임 오류가 발생했을 때 던져지는 객체
자세한 내용은 여기 참조
동적 및 약타입
자바스크립트는 동적 타입이 있는 동적 언어. 동적 언어의 자료형은 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 결정하게 된다. 타입 없이 변수만 선언하여 값을 지정할 수 있고, 다른 타입의 값으로 재할당도 가능하다.
let foo = 39; // 숫자 foo = "bar"; // 문자열 foo = true; // boolean
자바스크립트는 약타입 언어이기도 하다. 즉, 작업에 타입 오류가 발생하는 대신, 일치하지 않는 타입이 포함된 경우 암시적 타입 변환이 가능.
const foo = 39; // foo는 숫자 const result = foo + "1"; // foo를 문자열로 강제 변환하여 다른 피연산자와 연결 console.log(result); // 출력 : 391
이런 암시적 형변환은 매우 편리하지만, 개발자가 의도하지 않았거나, 다른 방향으로 변환하려는 경우(ex. 숫자->문자열 대신, 문자열->숫자로 변환)에는 잠재적인 오류(footgun)가 될 수 있다. 다만, Symbol과 BigInt의 경우, 자바스크립트는 의도적으로 특정 암시적 타입 변환을 허용하지 않는다.
원시 값 (Primitive values)
객체를 제외한 모든 타입은 언어의 최하위 수준에서 직접 표현되는 불변 값을 정의하는데, 이러한 타입의 값을 원시 값이라고 한다. 쉽게 말하자면 앞서 얘기한 Number, String과 같은 데이터 타입이라고 할 수 있다.
`null`을 제외한 모든 기본 타입은 `typeof` 산자로 테스트할 수 있다.`typeof null`은 `object`를 반환하므로 `=== null`을 사용하여 `null`을 테스트해야 한다.

`null` 및 `undefined`를 제외한 모든 원시 타입에는 원시 값으로 작업하는 데 유용한 메서드를 제공하는 해당 객체 래퍼 타입이 있다. 예를 들자면 `Number` 객체는 `toExponential()`와 같은 메서드를 제공한다. 원시 값에서 속성에 접근하면, 자바스크립트는 해당 래퍼 객체로 자동으로 감싸는 대신 객체의 속성에 접근한다. 그러나 `null` 또는 `undefined`에서 속성에 접근하면, `TypeError` 예외가 발생하므로 Optional chaining 연산자를 도입해야 한다.
Type | typeof return value | Object wrapper |
Null 타입 | "object" | N/A |
Undefined 타입 | "undefined" | N/A |
Boolean 타입 | "boolean" | Boolean |
Number 타입 | "number" | Number |
BigInt 타입 | "bigInt" | BigInt |
String 타입 | "string" | String |
Symbol 타입 | "symbol" | Symbol |
Null 타입
Null 타입은 `null`이라는 오직 하나의 값만 가질 수 있다.
Undefined 타입
Undefined 타입도 `undefined`이라는 오직 하나의 값만 가질 수 있다.
개념적으로, `undefined`는 값이 없음을 의미하고, `null`은 객체가 없음을 의미한다. 일반적으로 값이 없는 경우 언어의 기본값은 `undefined`이다.
Boolean 타입
Boolean 타입은 논리 요소를 나타내며 `true`와 `false` 두 가지의 값을 가질 수 있다.
일반적으로 삼항 연산자, `if ... else`, `while` 등을 포함한 조건부 연산에 사용된다.
Number 타입
Number 타입은 정수, 실수, 양수, 음수, 지수 등 모든 숫자 값을 나타낼 수 있다. 그렇지만 배정밀도 64비트 이진 형식 IEEE 754 값이기 때문에 모든 범위의 숫자를 저장할 수는 없고, -(2^53-1) ~ 2^53-1 범위의 정수만 안전하게 저장할 수 있다.

이 예시를 보면 최대 범위를 벗어나는 값은 정확성을 잃고 배정밀도 부동 소수점 근사값으로 표시된다. `Number.isSafeInterger()`을 사용하여 숫자가 안전한 정수 범위내에 있는지 확인할 수 있다. 만약 Number가 표현할 수 있는 범위보다 큰 숫자를 저장하고 싶다면 BigInt를 사용하면 된다.
BigInt 타입
BigInt 타입은 임의 정밀도로 정수를 나타낼 수 있는 자바스크립트 숫자 원시 값이다. BigInt로 `Number.MAX_SAFE_INTEGER`을 넘어서는 큰 정수도 안전하게 저장하고 연산할 수 있다.
BigInt는 정수 끝에 `n`을 추가하거나 `BigInt()` 함수를 호출해 생성할 수 있다.
BigInt는 `+`, `-`, `*`, `**`, `%` 연산자는 사용할 수 있지만, `>>>`는 사용할 수 없다. BigInt는 Number와 엄격하게 같지(===)는 않지만, 느슨하게(==) 유사하다.
BigInt는 소수를 나타낼 수는 없지만, 큰 정수를 더 정확하게 나타낼 수 있다.
String 타입
String 타입은 텍스트 데이터를 나타내며, UTF-16 코드 단위 수를 나타내는 16비트 부호 없는 정수 값의 나열로 인코딩된다. String의 각 요소는 인덱스로 접근할 수 있다.
자바스크립트의 String은 한 번 생성하면 수정이 불가능하다. String 메서드는 현재 String의 내용을 기반으로 새 String을 만든다. 예를 들면, substring()을 이용하여 원래 String의 하위 String을 만들거나 연결 연산자(`+`) 또는 `concat()`을 사용하여 두 문자열을 연결할 때 말이다.
Symbol 타입
Symbol은 고유하고 변경 불가능한 원시 값이며 객체의 속성 키로 사용할 수 있다.
심볼은 객체에 속성을 추가할 때 고유한 키를 부여하여 다른 코드와 충돌하지 않도록 할 때 많이 쓰이며, 이렇게 추가한 속성은 일반적인 방법으로는 접근할 수 없으므로 약한 형태의 캡슐화, 혹은 정보 은닉을 제공한다.
'Language > Javascript·Typescript' 카테고리의 다른 글
[Javascript/자바스크립트] 대문자 소문자 변환 (0) | 2024.06.21 |
---|---|
[Javascript/자바스크립트] 자바스크립트로 입력 받기 (0) | 2024.06.19 |
[TypeScript/타입스크립트] 클래스 Class (0) | 2023.04.06 |
[TypeScript/타입스크립트] 리터럴, 유니온/교차 타입 (0) | 2023.03.31 |
[TypeScript/타입스크립트] 함수 (0) | 2023.03.31 |