원시(기본타입)값은 객체가 아니다.
기본타입인 원시값 null, undefined, "string", 10, true, false 는 객체가 아닙니다.
null 과 undefined 값은 값을 만들기 위해 생성자 함수도 필요없으며, new
연산자도 필요하지 않습니다.
마치 연산자를 사용하듯 그냥 사용하면 된다는 의미입니다.
나머지 문자열, 숫자, 불리언인 원시값은 기술적(내부적)으로 생성자 함수에서 반환되지만 객체는 아닙니다.
다음은 원시값과 자바스크립트 네이티브 객체를 비교하는 코드입니다.
// "new" 키워드를 사용하지 않고, 원시값을 만들면 객체가 만들어지지 않습니다.
var str1 = "foo";
var str2 = String('foo');
var num1 = 10;
var num2 = Number('10');
var boolean1 = true;
var boolean2 = Boolean('true');
// typeof 를 사용해 객체가 아님을 확인해 봅니다.
console.log(typeof str1, typeof str2); // 'string, string' 이 기록된다.
console.log(typeof num1, typeof num2); // 'number, number' 가 기록된다.
console.log(typeof boolean1, typeof boolean2); // 'boolean, boolean' 이 기록된다.
다음은 문자열, 숫자, 불리언 기본값을 new 키워드와 함께 생성자 함수를 사용해 만든 객체를 비교해 보도록 합니다.
var str = new String('bar');
var num = new Number(23);
var boolean = new Boolean(false);
console.log(typeof str, typeof num, typeof boolean);
// 'object, object, object' 가 기록된다.
new
키워드를 사용하면 복합(합성) 객체를 반환합니다.
typeof 연산자
typeof
연산자는 다루는 값의 자료형을 문자열로 반환할 때 사용합니다. 하지만 반환되는 문자열은 정확하거나 논리적이라고 보기는 어렵습니다.
이 연산자를 사용할 때는 다루고 있는 값(원시값이든 복합 객체이든)이 반활할 문자열이 무엇일지 주의를 기울여야 합니다.
원시값이 아닌 참조타입의 경우
기본 타입(원시값)이 아닌 배열,객체,함수 등의 참조 타입은 new 키워드와 상관없이 object, function 을 반환합니다.
다음의 코드는 참조타입에 new 를 사용한 경우와 아닌 경우를 비교한 코드입니다.
var obj1 = Object();
var obj2 = new Object();
var arr1 = Array('foo', 'bar');
var arr2 = new Array('foo', 'bar');
console.log(typeof obj1, typeof obj2, typeof arr1, typeof arr2);
// 'object, object, object, object' 가 기록된다.
var fn1 = Function('x', 'y', 'return x * y');
var fn2 = new Function('x', 'y', 'return x * y');
var date1 = Date();
var date2 = new Date();
var regExp1 = RegExp('\\bt[a-z]+\\b');
var regExp2 = new RegExp('\\bt[a-z]+\\b');
var err1 = Error('에러 발생함.');
var err2 = new Error('에러 발생함.');
console.log(typeof fn1, typeof fn2, typeof date1, typeof date2, typeof regExp1, typeof regExp2, typeof err1, typeof err2);
// 'function function string object object object object object' 가 기록된다.
거의 모든 참조타입은 object
를 반환합니다.
하지만 function 과 date 객체는 다릅니다.
함수도 객체이지만 함수 객체에 대해서 new
사용여부에 상관없이 typeof
는 항상 function 을 반환하고,
date 객체는 new
를 사용하지 않으면 string
을 new
를 사용하면 object
를 반환하는 것에 주의를 해야합니다.
주의해야 할 점은 원시값은 객체가 아니라는 것입니다.
원시값은 단순한 값을 표현하기 위해 사용되는 특수한 값이라는 것입니다.
그리고 참조타입의 경우 typeof
연산자로 체크시 함수는 항상 function 을 반환한다는 것입니다.
복합 객체(=합성 객체)
Object(),Array(), Function(), Date(), Error(), RegExp() 와 같은 네이티브 객체 생성자들은 한개 이상의 원시값이나 복합 객체를 저장할 수 있기 때문에 복합적이라 볼 수 있습니다.
근본적으로 복합 객체는 여러 종류의 자바스크립트 객체로 구성됩니다.
복합 객체는 어떤 값이든 포함할 수 있기 때문에 복합 객체가 메모리에서 차지하는 크기는 명확하지 않다고 말할 수 있습니다.
다음은 원시 객체를 저장하는 객체와 배열을 만드는 코드입니다.
var object = {
str: 'string',
num : 10,
boolean : true,
myNull : null,
myUndefined : undefined
};
var array = ['string', 10, true, null, undefined];
위의 값을 다음의 코드에 작성된 원시값의 단순함과 비교해 보도록 하겠습니다.
위에서 보는 복합 객체는 여러 값을 포함할 수 있지만 아래에 작성된 원시값은 더이상 복합적으로 만들 수 없는 것입니다.
var str1 = 'string';
var num1 = 10;
var boolean1 = true;
var myNull = null;
var myUndefined = undefined;
복합 객체는 여러 값을 하나로 합친 합성체이며, 여러 값을 복합적으로 구성할수 있다는 점에서 원시값과 구별됩니다.
"복합 객체(complex object)" 라는 용어를 "합성 객체(composite objects)" 또는 "참조 자료형(reference types)"으로 표현하기도 합니다.
이 모든 용어는 원시값이 아닌 자바스크립트 값의 특성을 설명하기 위한 것들이고 원시값은 "값으로 참조"되지 않고 다른 여러 값으로 구성된 합성체를 표현할 수 없습니다.
반변에 복합 객체는 "값으로 참조"되며 다른 값을 포함하거나 캡슐화할 수 있습니다.
'JavaScript > Core & 개념ㆍ용어' 카테고리의 다른 글
반복문(for문, while문, do-while문) (2) | 2016.09.29 |
---|---|
JavaScript vs JAVA (0) | 2016.09.29 |
자바스크립트 DOM 이란 (0) | 2016.09.29 |
자바스크립트 기본타입(원시값=단순값) (0) | 2016.09.29 |
유효범위의 효용 (0) | 2016.09.29 |