원시 자료형과 참조 자료형

WooSeong·2021년 3월 16일
0

학습 노트

목록 보기
6/22

JS 2가지 타입 원시&참조

배열과 객체를 배우면서 데이터에 따라 데이터 보관함의 크기가 유동적으로 변할 수 있음을 알았다. 기존에 다뤘던 String, Number, Boolean, undefined 등의 데이터 타입은 하나의 변수에 하나의 자료만 넣을수 있었다. 새로운 데이터를 넣으면 기존의 데이터는 삭제되고 입력한 데이터가 들어가게 되는데 그렇기 때문에 위의 자료 타입들은 데이터를 '추가' 하는 것이 아닌 '재할당'을 한다고 말한다.

원시 자료형(Primitive data types)

JavaScript에서 원시 값(primitive, 또는 원시 자료형)이란 객체가 아니면서 메서드도 가지지 않는 데이터입니다.

이런 정의를 만족하는 JS의 원시자료형은 6가지가 있다. string, number, bigint, boolean, undefined, symbol 그리고 조금 특이한 예외로 (null)이 존재한다.

원시 자료형의 특징

  • 원시 자료형은 하나의 정보만 담고 있다.
  • 원시 자료형이 담기는 공간은 stack이며 stack은 공간이 변하지 않는다.
  • 원시 자료형은 immutable하지만, 재할당은 가능하다.

bigint? symbol?

bigint는 수리적 원시 자료형으로 임의적 정확성을 가진 정수를 표현할때 사용할 수 있습니다. bigint를 사용하면 number 타입이 가지는 정수 한계를 안전하게 넘어서는 큰 정수 값을 보관하고 사용할수 있습니다.

  • bigint는 number와 동일하게 산술 연산자를 사용할수 있다.
  • bigint는 number와 동일하게 작동한다.
  • bigint와 number는 상보적으로 사용될 수 없다. bigint를 number로 타입 변경할 경우 혹은 그 반대의 경우 TypeError가 발생한다.

큰 숫자를 다뤄야 할때 쓸수 있는 원시 자료형!


Symbol() 함수는 심볼(symbol) 형식의 값을 반환하는데, 이 심볼은 내장 객체(built-in objects)의 여러 멤버를 가리키는 정적 프로퍼티와 전역 심볼 레지스트리(global symbol registry)를 가리키는 정적 메서드를 가지며, "new Symbol()" 문법을 지원하지 않아 생성자 측면에서는 불완전한 내장 객체 클래스(built-in object class)와 유사합니다.

symbol은 객체 프로퍼티에 대한 식별자로 사용될 수 있고 이것이 symbol의 유일한 목적이다. 이는 대표적인 symbol을 살펴보면 확인할수 있다.

  • symbol.iterator : 객체의 기본 반복자를 반환하는 메소드 for...in에서 사용
  • symbol.split : 인덱스에서 문자열을 나누는 String.prototype.split() 메소드에서 사용됨

참조 자료형(Reference data type)

자바스크립트에서 원시 자료형이 아닌 모든 것은 참조 자료형입니다.

참조 자료형엔 대표적으로 배열([]), 객체({}), 함수(function(){})이 있으며 데이터의 크기가 동적으로 변하는 데이터 보관함을 가지고 있다.

원시 자료형과의 차이

  • 참조 자료형의 데이터가 보관되어 있는 보관함은 'heap'이다.
  • 참조 자료형은 데이터의 보관함의 크기가 동적이다.
  • 참조 자료형은 데이터 자체를 보관하지 않는다.
  • 참조 자료형은 주소를 보관한다. 이 주소는 데이터가 저장되어 있는 보관함으로 연결된다.
  • 참조 자료형은 주소를 통해 데이터를 '조회'(혹은 참조)한다.

이러한 차이 혹은 참조 자료형의 특징은 특이한 결과로 연결 되는데, 자바스크립트에서 빈배열은 서로 같지 않다!(????)

let a = [];
let b = [];
a === b // false를 반환한다.

이는 참조 자료형이 데이터 자체를 보관하지 않고 데이터를 보관하고 있는 보관함의 주소를 가지고 있으며, 변수를 호출할때 데이터의 주소를 참조하여 데이터를 조회하고 조회한 결과를 출력하기 때문에 발생하는 현상이다.

배열을 생성할때 마다 각 배열은 다른 주소(다른 보관함)을 할당 받는다. 따라서 a배열과 b배열은 보기에는 빈배열로 동일하지만, a 배열과 b배열의 주소는 다르다.

참조 자료형은 메소드를 사용할시 원본 배열을 변경(mutate)하는지 혹은 새로운 배열을 생성하는지 여부가 중요하다!

profile
성장하는 개발자를 꿈꿉니다

0개의 댓글