Javascript는 느슨한 타입(loosely typed) 동적 언어이다.
C나 Java와 같은 프로그래밍 언어와 다르게, 변수가 특정 자료형과 연결되지 않으며, 한 변수에 여러 자료형의 값으로 할당 및 재할당이 가능하다. 자료형은 크게 윈시 값과 객체로 나뉘며, 이번 글에서는 Javascript로 프로그래밍할 때 가장 기본이 되는 자료형인 원시 값에 대해 알아본다.
원시 값(Primitive Value)
원시 값은 Javascript로 프로그래밍을 할 때 가장 기본이 되는 자료형으로, 한 번 할당된 값은 불변하다는 특징이 있으며,
Boolean, Null, Undefined, Number, Bigint, String, Symbol
총 7개의 자료형이 있다.
Boolean
Boolean은 논리 요소를 나타내며, true와 false 두 가지의 값을 가질 수 있다.
boolean 타입을 활용하는 간단한 코드 예제는 다음과 같다.
const t = true;
const f = false;
if (t) {
console.log("This will be executed if const t is true");
}
if (f) {
console.log("This will never be executed if const f is false");
}
Null
Null 타입은 오직 null 한 가지의 값만 가질 수 있다.
null은 의도적으로 비어있는 값을 나타내며, 이는 undefined와 null을 구분짓는 특징이다.
식별되지 않았고, 변수가 아무런 객체를 가리키지 않음을 표현한다.
const nullVar = null;
console.log(nullVar); // null
Undefined
값을 할당하지 않은 변수는 undefined 값을 가진다.
변수에 값이 할당되었는지에 따라 다른 문을 실행하는 코드 예제를 살펴보자. 동등연산자 '=='가 아닌 일치 연산자 '==='를 사용한다는 것에 주의해야 한다.
let x;
if (x === undefined) {
console.log("x is undefined");
} else {
console.log(`x is ${x}`);
}
값이 할당되지 않은 변수뿐만 아니라, 함수도 명시적으로 값을 반환하지 않으면 undefined를 반환한다.
*undefined는 예약어가 아니기 때문에 변수명으로 사용할 수 있지만, 이는 디버깅에 어려움을 줄 수 있다.
(예제로 보는 undefined과 null의 차이)
// (출처:MDN Web Docs)
typeof null // "object" (하위호환 유지를 위해 "null"이 아님)
typeof undefined // "undefined"
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
const nullVar = null; // 선언 후 null을 할당한 상태
console.log(nullVar); // null
let undefinedVar; //선언 후 할당하지 않은 상태
console.log(undefinedVar); //undefined
Number
Number타입은 배정밀도 64비트 이진 형식 IEEE 754 값으로, -(2^53 - 1) ~ 2^53 - 1 사이의 값이고, 이는 Number 객체의 MAX_SAFE_INTEGER와 MIN_SAFE_INTEGER 속성의 값을 통해 확인할 수 있다.
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
또한 Number 타입은 부동소수점 숫자 외에도 +Infinity, -Infinity, NaN 세 개의 상징적인 값을 가진다.
Bigint
Bigint 타입으로는 임의 정밀도로 정수를 나타낼 수 있고, Number의 안전 한계를 넘는 정수 값도 저장 및 연산할 수 있다.
정수 끝에 n을 추가하거나 생성자를 통해 생성할 수 있다.
const withCon = BigInt("9007199254740992"); // 9007199254740992n
const withOutCon = 9007199254740992n; // 9007199254740992n
Number의 안전 한계가 -(2^53 - 1) 부터 2^53 - 1 사이의 값이라고 서술했다.
Bigint 타입을 활용하면 다음과 같이 안전 한계 범위를 넘는 수의 연산이 가능하다.
Bigint와 Number간 연산은 불가하며,
Bigint를 Number로 형변환 할 때 Number 자료형의 안전 한계를 넘는 값이면 정확하지 않은 값이 저장될 수 있다.
const x = 2n ** 53n; // 9007199254740992n
const y = x + 1n; // 9007199254740993n
const z = y + 1; // TypeError: Cannot mix BigInt and other types, use explicit conversions
String
String은 텍스트 데이터를 나타낼 때 사용하고, 16비트 부호 없는 정수 값 요소로 구성된 집합이며, 각 요소에 인덱스로 접근이 가능하다.
원시 값에 속하는 자료형은 불변하다는 특성이 있고, String은 원시 값에 속하기 때문에, Javascript에서는 한 번 생성한 문자열의 값을 변경할 수 없다.
대신 기존 문자열을 통해 새롭게 생성한 문자열을 변수에 재할당해야 한다.
다음은 String 객체의 toUpperCase() 메서드를 활용해 문자열의 각 원소를 모두 대문자로 바꾸는 코드 예제이다.
let str = "string";
str.toUpperCase(); // STRING
console.log(str); // string
let upperStr = str.toUpperCase();
console.log(upperStr); // STRING
문자열 변수 str에 toUpperCase를 실행해도 변수 str의 값에는 영향을 주지 못한다. 대신 str.toUpperCase()의 반환 값을 새로운 변수에 할당함으로써 str의 모든 원소를 대문자로 변경할 수 있다.
Symbol
Symbol 자료형은 유일한 식별자를 만드는 데 사용된다. 그 이름이 같아도, 식별자 값은 유일하다.
const id = Symbol("id");
const id2 = Symbol("id");
console.log(id == id2); // false
또한 Symbol 자료형의 값을 객체의 프로퍼티 키로 활용할 수 있고, 객체의 프로퍼티 키로 활용할 때는 대괄호로 감싸주어야 한다.
const id = Symbol("id");
const objWithSymbol = {
name: "omin",
weight: "70kg",
[id]: "helloOminId",
};
console.log(objWithSymbol[id]); // helloOminId
참고자료
https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures
https://ko.javascript.info/symbol
'SW > Javascript' 카테고리의 다른 글
만들면서 배우는 React (Vanilla JS로 React 기능 구현) (0) | 2022.09.27 |
---|
댓글