Javascript

Javascript 타입 (원시타입, 참조타입, 원시래퍼타입)

superchae 2023. 2. 7. 23:05

원시타입

원시 타입은 있는 그대로 저장되는 데이터를 표현한다.
종류: 불리언, 숫자, 문자열, null, undefined

typeof를 통해 원시값의 타입을 알 수 있다. 주의할 점으로 null 일 경우 object로 표시된다. (object는 참조타입인데, 이것은 js재단에서 실수라고 인정했다.)

var str = "abc";
console.log(typeof str);     // string

var tmp = null
console.log(typeof tmp);     // object  (주의!)

참조타입

참조 타입은 변수에 값을 직접 저장하지 않고 변수에 저장되는 것은 메모리 안에서 객체의 위치를 가리키는 포인터이다.
무엇이 저장되느냐가 원시타입과 참조타입의 큰 차이점이다.
종류: 객체 {}, 배열 [], 함수 function, Date, 정규표현식 RegExp (원시 타입빼고 전부 참조 타입으로 봐도 좋음)

var objOne = {one : 1};
var objTwo = {two : 2};
objTwo = objOne;
objTwo.one = 3;
console.log(objOne);    // 3

원시 래퍼 타입

원시 래퍼 타입은 원시 타입을 객체처럼 편리하게 사용하도록 도와준다.
종류: String, Number, Boolean

원시 타입을 객체(참조타입)처럼 사용하는 순간, 자바스크립트 내부에서 사용하는 데이터의 인스턴스를 만든다. 이렇게 만들어진 객체는 코드를 실행 후 바로 다음 줄에서 파괴된다. 이러한 과정을 오토박싱 (autoboxing) 이라고 한다.

var str = "hello world";
console.log(str.length);

위 코드에서 str은 원시타입이다. str.length는 어떻게 사용되는 것일까?

예시 1.

var name = "bit"
console.log(name.concat("coin");   // "bitcoin"

autoboxing

var name = "bit"
var temp = new String(name);
console.log(temp.concat("coin");
temp = null;

실제 JS에서는 임시 변수를 만들어서 원시 타입을 객체처럼 사용할 수 있도록 한다.

예시 2.

var name = "bit";
name.coin = "coin";
console.log(name.coin);    // undefined

autoboxing

var name = "bit";
var temp = new String(name);
temp.coin = "coin";
temp = null;

var temp = new String(name);
console.log(temp.coin);
temp = null;