원시값(primitive value)
자바스크립트는 기본타입과 참조타입(객체)으로 나눌 수 있습니다.
기본타입을 원시 데이터라고 하며 5, 'foo', true, false, null, undefined 와 같은 자바스크립트 값을 말합니다.
즉, 숫자, 문자열, 불리언, null, undefined 인 다섯가지 기본 타입을 말하며 이 자바스크립트값은 더 이상 단순화할 수 없기 때문에 원시적(primitive)이라 하며, 이러한 값을 가리켜 원시값이라 합니다.
이러한 값은 본질적으로 단순하며, 다른 여러 값으로 구성된 값인 복합값으로 표현할 수 없습니다.
매우 단순하게 말하자면, 원시값은 자바스크립트에서 사용할 수 있는 데이터 및 정보의 가장 단순한 형태인 것입니다.
null, undefined, "문자열", 10, true, false 는 객체가 아니다라는 뜻은 null, undefined 값을 만들기 위해 생성자 함수도 필요 없고 new 연산자도 필요치 않습니다.
나머지의 문자열, 숫자, 불리언 원시값은 기술적으로 생성자 함수에서 반환되지만 객체는 아닙니다.(이에 대한 자세한 내용은 이곳에서 다루지 않습니다.)
자바스크립트 데이터는 기본타입과 참조타입으로 나뉜다.
기본 데이터 타입에는 숫자(Number), 문자열(String), 불린값(Boolean), undefined, null 이라는 타입이 있으며, 참조 데이터 타입에는 객체(Object)가 있다.
객체에는 배열(Array), 함수(Function), 정규표현식(RegExp)으로 이루어져 있다.
이중 기본 데이터타입의 특징은 그 자체가 하나의 값을 나타낸다는 것이다.
자바스크립트는 var 라는 한가지 키워드로만 변수를 선언하고, 변수에 어떤 형태의 데이터를 저장하느냐에 따라 해당 변수의 타입이 결정되는데 이는 엄격한 타입 체크 언어인 C언어,java 와는 달리 느슨한 타입 체크 언어이기 때문이다.
기본 데이터 타입을 제외한 모든 값은 객체이다.
따라서 배열, 함수, 정규표현식 등도 모두 자바스크립트 객체로 표현된다.
원시값은 어떻게 저장·복사 되는가?!
원시값은 액면가 그댈 저장되고 관리됩니다.
단순한 말일 수 있지만 이는 곧 문자열 "foo" 를 str 이라면 변수에 저장하면 "foo" 라는 값이 말 그대로 메모리에 저장된다는 뜻이기도 합니다.
왜 이 사실이 중요할까?
원시값은 정말 말 그대로 "복사"가 되므로 값을 조작할 때는 (예:복사) 항상 이 사실을 기억하고 있어야 합니다.
다음의 코드를 통해 알아보겠습니다
var name = "jaehee"; // 원시 문자열 객체를 생성(문자 리터럴)
var nameCopy = name; // 값을 새 변수로 복사합니다.
var name = null; // name 변수에 저장된 값을 새로 할당합니다.
console.log(name, nameCopy); // 'null, jaehee' 가 콘솔에 출력
위의 코드를 통해 알 수 있듯이 원본 변수의 값을 바꾸더라도 값은 이미 복사가 이루어졌기 때문에 nameCopy 에는 아무런 변화가 생기지 않는 것입니다.
만약에 위의 코드가 참조 타입으로 이루어져 있다면 얘기는 달라집니다.(참조타입 참고)
원시값에 저장되고 수정되는 값은 더 이상 축약할 수 없는 값이며, 원시값을 참조하면 값 자체를 "복사,복제"한다는 뜻입니다.
이를 일상생활에서 일어 날 수 있는 상황을 가정해 봅시다.
여러분은 어떤 문서를 작성하여 다른 누군가에게 나누어 준다고 가정한다면 작성한 문서를 나눠주기 위해 문서를 복사 할 것입니다.
당신이 작성한 문서는 원본이고 제 3자에게 나눠주는 것은 복사,복제본입니다.
하지만, 제 3자는 나눠 받은 복사본의 내용을 업데이트하기 위해 그 내용에 추가하거나 삭제할 수 있습니다. (물론 일상생활에서 필기도구를 이용해서 하겠죠?! 밑줄 쫘아~악)
위의 코드는 이런 상황에 놓인 것과 다름없습니다.
원본을 복사한 후 나누어 준 후 원본을 고친다고 하여 이미 나누어준 복사본이 바뀌지 않는 것과 같습니다.
그래서 name 값을 갱신하더라도 nameCopy 의 값은 여전히 name 에서 복사할 때의 값을 유지하는 것입니다.
이러한 특성은 복합 객체(=참조타입)와 대조됩니다.
원시값은 값 자체를 비교한다
원시 자료형을 비교할 때는 값 자체를 비교하여 같은지를 확인합니다.
예를 들어, 숫자값 20 을 저장한 변수와 숫자값 20 을 저정한 또 다른 변수를 비교할 때, 자바스크립트는 두 변수의 값이 20 으로 동일하기 때문에 (20 === 20), 두 변수가 같다고 판단합니다.
물론 문자열을 저정한 변수도 마찬가지입니다.
다음의 코드는 원시 숫자값을 사용하여 "값 자체를 비교"하는 것과 복합 숫자객체(참조 타입)의 경우를 비교해 보도록 하겠습니다.
var num01 = 10;
var num02 = 10;
var num03 = new Number("10"); // new 키워드를 사용했기 때문에 num03 복합객체(참조타입)
var num04 = num03;
console.log(num01 === num02); // true 출력
// num03 는 복합객체(참조타입)이고 num01 은 원시값이므로 false 가 출력
console.log(num01 === num03); // false 출력
// 참조타입인 복합객체는 참조를 비교하므로 true 가 출력
console.log(num03 === num04);
/**
* num04 는 num03 인 복합객체를 참조(가리키고 있음)하고 있지만
* 이를 참조가 아닌 원시값으로 변수의 값을 재할당한다면??
*/
num04 = 10;
console.log(num03 === num04); // false 가 출력
// num04 은 더이상 복합객체가 아닌 원시데이터이기 때문이다.
정리하자면, 원시값은 비교할 때 값 자체가 같은지 비교를 하고 new 키워드를 사용(e.g new String())해 만든 문자열, 숫자, 불리언 값을 비교할 때는 원시값으로 취급하지 않습니다.
따라서 리터럴 문법을 사용해 만든 값과 new 키워드를 사용해 만든 값을 비교하면 항상 같지 않다고 나타나게 됩니다.
원시값은 저정된 값을 비교하는 반면 복합객체(참조 타입)는 저장되어 있는 참조(메모리의 번지수)를 비교하기 때문이다.
복합 객체는 여러 값을 하나로 합친 합성체이며, 여러 값을 복합적으로 구성할 수 있다는 점에서 원시값과 구별된다.
'JavaScript > Core & 개념ㆍ용어' 카테고리의 다른 글
원시값은 기본타입으로 객체가 아니다 (0) | 2016.09.29 |
---|---|
자바스크립트 DOM 이란 (0) | 2016.09.29 |
유효범위의 효용 (0) | 2016.09.29 |
지역변수와 전역변수 (0) | 2016.09.29 |
undefined와 null의 차이점 (269) | 2016.09.29 |