surf core js : 자료형

Dino_·2021년 7월 20일
0

surf javascript

목록 보기
3/28
post-thumbnail

언어 특성

정적 타입 언어 (Statically typed)

컴파일 시 변수의 타입이 결정되는 언어를 말한다.

따라서, 프로그래머가 변수에 들어갈 값의 형태에 따라 직접 변수의 타입을 명시해줘야 한다.

타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성이 높고, 컴파일 시에 미리 타입을 결정하기 때문에 실행속도가 빠르다.

Java, C/C++, kotlin, typescript

동적 타입 언어 (dynamically typed)

컴파일 시 자료형을 정하는 것이 아니라 런타임 시 결정된다.

타입 없이 변수만 선언하여 값을 지정할 수 있다.

런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 유연성이 높고, 컴파일시 타입을 명시해주지 않아도 되기 때문에 빠르게 코드를 작성할 수 있다.

javascript, python, ruby

Javascript의 자료형

자바스크립트에는 여덟 가지 기본 자료형이 있다.

숫자형

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

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

Infinity는 어떤 숫자보다 더 큰 특수 값, 무한대(∞)를 나타낸다.

어느 숫자든 0으로 나누면 무한대를 얻을 수 있다.

alert( 1 / 0 ); // Infinity

//Infinity를 직접 참조할 수도 있습니다.

alert( Infinity ); // Infinity

NaN은 계산 중에 에러가 발생했다는 것을 나타내주는 값이다.

부정확하거나 정의되지 않은 수학 연산을 사용하면 계산 중에 에러가 발생하는데, 이때 NaN이 반환된다.

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

NaN은 여간해선 바뀌지 않는다. 연산 과정 어디에선가 NaN이 반환되었다면, 이는 모든 결과에 영향을 미칩니다.

수학 연산은 안전하다.

javascript에서의 수학 연산은 '안전’하다고 볼 수 있다.

0으로 나눈다거나 숫자가 아닌 문자열을 숫자로 취급하는 등의 이례적인 연산이 가능하다.

말이 안 되는 수학 연산을 하더라도 NaN을 반환하며 연산이 종료될 뿐이며 특수 숫자 값을 숫자형으로 분류한다.

BigInt

내부 표현 방식 때문에 javascript에선 (2^53-1)(9007199254740991) 보다 큰 값 혹은 -(2^53-1) 보다 작은 정수는 '숫자형’을 사용해 나타낼 수 없다.

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

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

// 끝에 'n'이 붙으면 BigInt
const bigInt = 1234567890123456789012345678901234567890n;

BigInt형 숫자는 자주 쓰이지 않지만 아주 큰 숫자를 사용해야하는 경우 사용할 수 있다는 것을 알아두면 좋다.

IE 에선 지원하지 않는다.

문자열

자바스크립트에선 문자열(string)을 따옴표로 묶는다.

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

따옴표는 세 종류가 있다.

  • 큰따옴표: "Hello"
  • 작은따옴표: 'Hello'
  • 역 따옴표(백틱, backtick): Hello

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

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

이를 '템플릿 리터럴'이라고 한다.

let name = "John";

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

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

${…} 안에는 name 같은 변수나 1 + 2 같은 수학 관련 표현식을 넣을 수 있습니다. 문자열 중간에 들어간 변수나 표현식은 평가가 끝난 후 문자열의 일부가 된다.

문자형은 없다.

불린형

불린형(논리 타입)은 true와 false 두 가지 값밖에 없는 자료형이다.

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

let nameFieldChecked = true; 
let ageFieldChecked = false; 

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

let isGreater = 4 > 1;

alert( isGreater ); // true

null 값

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

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

let age = null;

자바스크립트의 null은 자바스크립트 이외 언어의 null과 성격이 다르다.

다른 언어에선 null을 '존재하지 않는 객체에 대한 참조’나 '널 포인터(null pointer)'를 나타낼 때 사용한다.

하지만 자바스크립트에선 null을

  • ‘존재하지 않는(nothing)’ 값,
  • ‘비어 있는(empty)’ 값, ‘
  • 알 수 없는(unknown)’ 값
    을 나타내는데 사용된다.

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)를 표현할 수 있다.

이런 특징 때문에 자바스크립트에서 객체는 좀 더 특별한 취급을 받는다.

추후에 참조(Reference) 자료형에 대해 깊게 다뤄보자.

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

심볼형에 대해선 객체를 학습하고 난 이후에 자세히 알아보자.

typeof

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

typeof 연산자는 두 가지 형태의 문법을 지원한다. 결과는 동일하다.

  • 연산자: typeof x
  • 함수: typeof(x)
typeof undefined // "undefined"

typeof 0 // "number"

typeof 10n // "bigint"

typeof true // "boolean"

typeof "foo" // "string"

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

typeof null // "object"  (1)

typeof alert // "function"  (2)

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

언어 자체의 오류이므로 null이 객체가 아님에 유의하자.

(2) typeof는 피연산자가 함수면 "function"을 반환한다. 그런데 '함수’형은 따로 없다. 함수는 객체형에 속한다.

이런 동작 방식이 형식적으론 잘못되긴 했지만, 아주 오래전에 만들어진 규칙이었기 때문에 하위 호완성 유지를 위해 남겨진 상태이다. 한편, 실무에선 이런 특징이 매우 유용하게 사용되기도 한다.

Reference

profile
호기심 많은 청년

0개의 댓글