자료형

RHUK2·2021년 12월 15일
0

Javascript

목록 보기
3/56

📢 22/07/26 복습


📚 Reference


javascript.info, https://ko.javascript.info/types

참고 사이트에 내용을 개인적으로 복습하기 편하도록 재구성한 글입니다.
자세한 설명은 참고 사이트를 살펴보시기 바랍니다.


자바스크립트에서 값은 항상 문자열이나 숫자형 같은 특정한 자료형에 속합니다. 그리고 자바스크립트에는 여덟 가지 기본 자료형이 있습니다.

자바스크립트의 변수는 자료형에 관계없이 모든 데이터일 수 있습니다. 따라서 변수는 어떤 순간에 문자열일 수 있고 다른 순간엔 숫자가 될 수도 있습니다.

let message = "hello";
message = 123456;

이처럼 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바꿀 수 있는 언어를 "동적 타입(dynamically typed)" 언어라고 부릅니다.


숫자형


let n = 123;
n = 12.345;

숫자형(number type) 은 정수 및 부동소수점 숫자(floating point number)를 나타냅니다.

숫자형엔 일반적인 숫자 외에 Infinity, -Infinity, NaN같은 "특수 숫자 값(special numeric value)"이 포함됩니다.

Infinity는 무한대(∞)를 나타내고, 어느 숫자든 0으로 나누면 무한대를 얻을 수 있습니다.

alert( 1 / 0 ); // 무한대
alert( Infinity ); // 무한대

NaN은 계산 중에 에러가 발생했다는 것을 나타내주는 값입니다. 부정확하거나 정의되지 않은 수학 연산을 사용하면 계산 중에 에러가 발생하는데, 이때 NaN이 반환됩니다.

alert( "숫자가 아님" / 2 ); // NaN, 문자열을 숫자로 나누면 오류가 발생합니다.

NaN은 여간해선 바뀌지 않습니다. NaN에 어떤 추가 연산을 해도 결국 NaN이 반환됩니다.

alert( "숫자가 아님" / 2 + 5 ); // NaN

연산 과정 어디에선가 NaN이 반환되었다면, 이는 모든 결과에 영향을 미칩니다.

자바스크립트에서 행해지는 수학 연산은 "안전"하다고 볼 수 있습니다. 0으로 나눈다거나 숫자가 아닌 문자열을 숫자로 취급하는 등의 이례적인 연산이 자바스크립트에선 가능합니다.

말이 안 되는 수학 연산을 하더라도 스크립트는 치명적인 에러를 내뿜으며 죽지 않습니다. NaN을 반환하며 연산이 종료될 뿐입니다.


BigInt


내부 표현 방식 때문에 자바스크립트에선 2532^{53} 이상이거나 253-2^{53} 이하인 정수는 "숫자형"을 사용해 나타낼 수 없습니다.

사실 대부분의 상황에서 이런 제약사항은 문제가 되지 않습니다. 그렇지만 암호 관련 작업같이 아주 큰 숫자가 필요한 상황이거나 아주 높은 정밀도로 작업을 해야 할 때는 이런 큰 숫자가 필요합니다.

BigInt형은 표준으로 채택된 지 얼마 안 된 자료형으로, 길이에 상관없이 정수를 나타낼 수 있습니다.

BigInt형 값은 정수 리터럴 끝에 n을 붙이면 만들 수 있습니다.

// 끝에 "n"이 붙으면 BigInt형 자료입니다.
const bigInt = 1234567890123456789012345678901234567890n;

문자형


자바스크립트에선 문자열(string)을 따옴표로 묶습니다. 따옴표는 세 종류가 있습니다.

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;

큰따옴표와 작은따옴표는 "기본적인" 따옴표로, 자바스크립트에서는 이 둘에 차이를 두지 않습니다.

역 따옴표(백틱)로 변수나 표현식을 감싼 후 ${...}안에 넣어주면, 아래와 같이 원하는 변수나 표현식을 문자열 중간에 손쉽게 넣을 수 있습니다.

let name = "John";

// 변수를 문자열 중간에 삽입
alert( `Hello, ${name}!` ); // Hello, John!

// 표현식을 문자열 중간에 삽입
alert( `the result is ${1 + 2}` ); // the result is 3

${...} 안에는 name 같은 변수나 1 + 2 같은 수학 관련 표현식을 넣을 수 있습니다. 물론 더 복잡한 표현식도 넣을 수 있죠. 무엇이든 들어갈 수 있습니다. 이렇게 문자열 중간에 들어간 변수나 표현식은 평가가 끝난 후 문자열의 일부가 됩니다.

큰따옴표나 작은따옴표를 사용하면 중간에 표현식을 넣을 수 없다는 점에 주의하시기 바랍니다. 이 방법은 역 따옴표를 써야만 가능합니다.

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2}

일부 언어는 글자 하나를 저장할 때 쓰이는 자료형, "글자(character)"형을 따로 지원합니다. C 언어와 Java의 char가 대표적인 예입니다.

자바스크립트는 글자형을 지원하지 않습니다. 문자형만 있을 뿐입니다. 여기엔 글자가 하나 혹은 여러 개 들어갈 수 있습니다.


불린형


불린형(논리 타입)은 truefalse 두 가지 값밖에 없는 자료형입니다.

불린형은 긍정(yes)이나 부정(no)을 나타내는 값을 저장할 때 사용합니다. true는 긍정, false는 부정을 의미합니다.

불린값은 비교 결과를 저장할 때도 사용됩니다.

let isGreater = 4 > 1;

alert( isGreater ); // true (비교 결과: "yes")

null 값


null 값은 지금까지 소개한 자료형 중 어느 자료형에도 속하지 않는 값입니다.

null 값은 오로지 null 값만 포함하는 별도의 자료형을 만듭니다.

let age = null;

자바스크립트의 null은 자바스크립트 이외 언어의 null과 성격이 다릅니다. 다른 언어에선 null을 "존재하지 않는 객체에 대한 참조"나 "널 포인터(null pointer)"를 나타낼 때 사용합니다.

하지만 자바스크립트에선 null을 "존재하지 않는(nothing)" 값, "비어 있는(empty)" 값, "알 수 없는(unknown)" 값을 나타내는 데 사용합니다.

let age = null;은 나이(age)를 알 수 없거나 그 값이 비어있음을 보여줍니다.


undefined 값


undefined 값도 null 값처럼 자신만의 자료형을 형성합니다.

undefined는 "값이 할당되지 않은 상태"를 나타낼 때 사용합니다.

변수는 선언했지만, 값을 할당하지 않았다면 해당 변수에 undefined가 자동으로 할당됩니다.

let age;

alert(age); // "undefined"가 출력됩니다.

개발자가 변수에 undefined를 명시적으로 할당하는 것도 가능하긴 합니다.

let age = 100;

// 값을 undefined로 바꿉니다.
age = undefined;

alert(age); // "undefined"

하지만 이렇게 undefined를 직접 할당하는 걸 권장하진 않습니다. 변수가 "비어있거나" "알 수 없는" 상태라는 걸 나타내려면 null을 사용하세요. undefined는 값이 할당되지 않은 변수의 초기값을 위해 예약어로 남겨둡시다.


객체


객체(object)형은 특수한 자료형입니다.

객체형을 제외한 다른 자료형은 문자열이든 숫자든 한 가지만 표현할 수 있기 때문에 원시(primitive) 자료형이라 부릅니다. 반면 객체는 데이터 컬렉션이나 복잡한 개체(entity)를 표현할 수 있습니다. 이런 특징 때문에 자바스크립트에서 객체는 좀 더 특별한 취급을 받습니다.


심볼


심볼(symbol)형은 객체의 고유한 식별자(unique identifier)를 만들 때 사용됩니다.


typeof 연산자


typeof 연산자는 인수의 자료형을 반환합니다. 자료형에 따라 처리 방식을 다르게 하고 싶거나 변수의 자료형을 빠르게 알아내고자 할 때 유용합니다.

typeof 연산자는 두 가지 형태의 문법을 지원합니다.

📌 typeof value (연산자 방식)
📌 typeof(value) (함수 방식)

괄호가 있든 없든 결과가 동일합니다.

typeof value를 호출하면 인수의 자료형을 나타내는 문자열을 반환합니다.

typeof undefined // "undefined"

typeof 0 // "number"

typeof true // "boolean"

typeof "foo" // "string"

typeof Symbol("id") // "symbol"

typeof Math // "object"  (1)

typeof null // "object"  (2)

typeof alert // "function"  (3)

마지막 세 줄은 약간의 설명이 필요해 보이네요.

Math는 수학 연산을 제공하는 내장 객체이므로 "object"가 출력됩니다. 내장 객체는 객체형이라는 것을 알려주기 위해 이런 예시를 작성해 보았습니다.

typeof null의 결과는 "object"입니다. null은 별도의 고유한 자료형을 가지는 특수 값으로 객체가 아니지만, 하위 호환성을 유지하기 위해 이런 오류를 수정하지 않고 남겨둔 상황입니다. 언어 자체의 오류이므로 null이 객체가 아님에 유의하시기 바랍니다.

typeof는 피연산자가 함수면 "function"을 반환합니다. 그러므로 typeof alert"function"을 출력해줍니다. 그런데 "함수"형은 따로 없습니다. 함수는 객체형에 속합니다. 이런 동작 방식이 형식적으론 잘못되긴 했지만, 아주 오래전에 만들어진 규칙이었기 때문에 하위 호완성 유지를 위해 남겨진 상태입니다. 한편, 실무에선 이런 특징이 매우 유용하게 사용되기도 합니다.

profile
생각 많이 하지 않기 😎

0개의 댓글