[Javascript] 데이터 타입(Data Type)

유동균·2022년 12월 3일
0

JavaScript

목록 보기
2/13
post-thumbnail

데이터 타입(Data Type)

  • 자바스크립트의 변수는 자료형에 관계없이 모든 데이터일 수 있다.
    따라서 변수는 어떤 순간에 문자열일 수 있고 어떤 순간에는 숫자일 수 도 있다.
let iAm = 123;	// 숫자
iAm = '문자';	// 문자열
  • 이처럼 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바꿀 수 있는 언어를
    "동적 타입(Dynamically typed) 언어" 라고 부른다.
  • 데이터 타입이란?
    • 프로그래밍 언어에서 사용할 수 있는 데이터의 종류

1. 원시 타입(Primitive data type)

1.1. 원시 타입이란?

  • 원시 타입의 값은 변경 불가능한 값(Immutable value)이며 pass-by-value(값에 의한 전달) 이다.

    Immutable value란?

    • 변경이 불가능 한 값(primitive value)
      재할당은 가능하지만 메모리 영역에서의 변경이 불가능
      let str = 'Hello';
       str = 'world';
      위와 같이 변수의 값 재할당이 가능하지만, 'Hello'의 'H'만을 'A'로 바꾸는 등 값의 변경은 불가능하다.

    pass-by-value란?

    • 원시 타입은 값으로 전달 된다. 즉, 값이 복사 되어 전달된다. (원시 타입은 값이 한번 정해지면 변경이 불가능)
      let a = 1;			// a에 원시 타입 숫자 1 할당
      let b = a;			// b에 a을 할당 할 경우 a의 값이 복사되어 b에 저장
      console.log(a,b);	// a = 1, b = 1
      a = 10;				// a에 10을 재할당 할 경우
      console.log(a,b);	// a = 10, b = 1
    • 2행에서 변수 b의 값은 1행의 변수 a의 값인 1을 복사해서 할당했기 때문에,
      4행에서 a의 값을 재할당한다 해도 b의 값은 변하지 않음
      let obj = {
      	a: 1,
          b: 2,
      };
      let obj2 = obj;			// obj2에 obj의 객체가 저장된 주소만 복사(참조)
      console.log(obj,obj2);	// {a:1, b:2}, {a:1, b:2}
      obj2.a = 999;
      console.log(obj,obj2);	//	{a:999, b:2}, {a:999, b:2}
    • 위의 예시와 달리 obj, obj2는 원시 타입이 아닌 객체타입이기 때문에
      5행에서 obj2는 obj의 주소를 복사해 값을 참조함
      7행에서 obj2의 프로퍼티 a 값을 999로 변경하게 되면
      obj의 주소와 매칭되어있는 obj2의 값이 변경되기 때문에
      8행에서와 같이 obj.a, obj2.a의 값이 모두 변경됨

1.2. 원시 타입의 종류

숫자열(Number)

let num = 1;
num = 1.234;
  • 숫자형은 정수 및 부동소수점 숫자(Floating point number)를 나타낸다.
  • 숫자형은 일반적인 숫자 외에
    Infinity 양의 무한대, -Infinity 음의 무한대, NaN Not-A-Number 가 있다.
console.log(1 / 0);			// Infinity 어떤 숫자든 0으로 나누면 무한대
console.log('string' / 2);	// NaN 부정확하거나 정의되지 않은 수학 연산 사용

BigInt

  • 자바스크립트에선 (253-1)보다 큰 값 또는 -(253-1)보다 작은 정수는 '숫자형'을 사용해서 나타낼 수 없다.
  • 대부분의 상황에서는 문제가 되지 않지만, 암화 관련 작업같이 큰 숫자가 필요한 상황이나 정밀도가 높은 작업 상황에서는 문제가 될 수 있다.
  • BigInt형 값은 숫자열 끝에 n을 붙여 만들 수 있다.
    혹은 BigInt함수를 호출해 사용할 수 있다.
let BigInt = 1234567890123456789012345678901234567890n;
let BigInt2 = BigInt(1234567890123456789012345678901234567890);

문자열(String)

  • 자바스크립트에서 문자열은 따옴표로 묶는데 따옴표는 세 종류가 있다.
    • '' : 작은 따옴표
    • "" : 큰 따옴표
    • `` : 역따옴표(백틱,Backtick)
let str = 'Hello';
let str1 = "My Name is Kane";
let str2 = `${str} World! ${str1}`;
  • 변수 str2와 같이 백틱 안에는 변수나 1 + 1 과 같은 수학 관련 표현식을 작성 가능.
  • 문자열은 배열처럼 인덱스(Index)번호를 통해 접근이 가능한데, 이와 같은 특성을 갖는 데이터를 유사 배열이라고 한다.
let str = 'Hello';
console.log(str[0]);	// 'H'

// 유사 배열이지만 문자열은 원시타입 즉, 값을 변경할 수 없음
str[0] = 'A';
console.log(str);	// 'Hello'

불리언(Boolean)

  • 불리언 타입의 값은 논리적 참 true, 거짓 false 두가지 밖에 없다.
let str = '';
let str1 = 'Hello';
console.log(Boolean(str));	// false
console.log(Boolean(str1));	// true
  • 비어있는 문자열, null, undefined, 숫자 0false로 간주.

undefined

  • undefined 는 변수가 선언이 되었지만 값을 할당하지 않은 경우 반환된다.
    또는 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되기도 한다.
let name;
console.log(name);	// undefined

null

  • null은 값이 없음을 의미한다.
  • 의도적으로 값이 없음을 명시할 수 있는데 이는 변수가 기억하는 메모리 주소의 참조 정보를 제거하는 것을 의미한다.
let age = 29;
age = null;	// 참조 정보가 제거

symbol

  • symbol 심볼은 ES6에서 새롭게 추가되었다.
  • 심볼은 주로 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키를 만들기 위해 사용.
  • 심볼은 Symbol함수를 호출해 생성하는데 이때 생성된 심볼 값은 다른 심볼 값과 다른 유일한 심볼 값이다
let key = Symbol('key');
console.log(key);	// symbol
let obj = {};
obj[key] = 'value';
console.log(obj[key]);	// value

2. 객체 타입 (Object/Reference type)

  • 자바스크립트는 객체 기반의 스크립트 언어이며 객체는 자바스크립트를 이루고있는 거의 "모든것"이다. 원시 타입을 제외한 나머지 값들(function함수, array배열, 정규표현식 등)은 모두 객체이다.

  • 객체(Object)는 키(Key)와 값(Value)으로 구성된 프로퍼티(Property)들의 집합.
    프로퍼티의 값으로 자바스크립트에서 사용할 수 있는 모든 값을 사용할 수 있는데,
    자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있다.
    따라서 프로퍼티 값으로 함수를 사용할 수도있으며 프로퍼티 값이 함수일 경우,
    일반 함수와 구분하기 위해 Method메소드라 부른다.

    일급 객체(First-class Object)
    다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

    • 일급객체의 조건
      • 변수나 상수에 저장 및 할당할 수 있어야 한다.
      • 파라미터(객체의 인자)로 전달할 수 있어야 한다.
      • 함수의 반환 값으로 사용될 수 있어야 한다.
    • 일급객체의 사용
      • callback콜백 사용 가능
      • 고차 함수를 만들 수 있다.
  • 이와 같이 객체는 데이터를 의미하는 프로퍼티와 데이터를 참조하고 조작할 수 있는 동작을 의미하는 메소드로 구성된 집합.

    프로퍼티

    • 프로퍼티 키와 프로퍼티 값으로 구성됨.
    • 프로퍼티는 프로퍼티 키로 유일하게 식별할 수 있다.
      즉, 프로퍼티 키는 프로퍼티를 식별하기 위한 식별자.
      • 프로퍼티 키의 명명 규칙과 프로퍼티 값으로 사용할 수 있는 값
        프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 symbol
        프로퍼티 값 : 모든 값
    • 프로퍼티 키에 문자열이나 symbol 값이나 이외의 값을 지정하면 암묵적으로 타입이 변환되어 문자열이 된다.
    • 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.
    • 배열과 달리 객체는 프로퍼티를 열거할 때 순서를 보장하지 않는다.

    메소드

    • 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라 부른다
      즉, 메소드는 객체에 제한되어 있는 함수를 의미

참고 문헌

PoiemaWeb: 웹 프로그래밍 튜토리얼 https://poiemaweb.com
모던 JavaScript 튜토리얼 https://ko.javascript.info
벨로퍼트와 함께하는 모던 자바스크립트 https://learnjs.vlpt.us
MDN https://developer.mozilla.org/ko/

0개의 댓글