원시 자료형과 참조 자료형

도현수·2022년 7월 11일
0

javascript

목록 보기
7/20

자바스크립트에서 데이터 타입(number, string, boolean, undefined, null, 심벌, 객체)은 다시 데이터를 저장하는 방식에 따라 원시 타입(primitive type)과 참조형 타입(reference type)으로 나눌 수 있다.

  • 원시 타입 - number, string, boolean, undefined, null, 심벌
  • 참조 타입 - 원시타입을 제외한 다른 모든 타입 (객체, 함수, 배열)

원시 타입(primitive type)

원시 타입은 변경이 불가능한 값이다. 다만, 여기서 변경이 불가능하다는 말은 값에 대한 말이다. 이는 곧 원시 값 자체를 변경할 수 없다는 말이지 변수 값의 변경(다시말해 재할당을 통한 교체)이 불가능 하다는 말은 아니다. 불변한다는 점에서 원시타입은 데이터의 신뢰성을 보장한다.
재할당의 경우를 생각해보자. 변수에 할당된 원시 값을 재할당 하면 새로운 메모리 공간(= 메모리 셀)을 확보하고 거기에 값을 저장한다. 만약 원시 값이 변경이 가능했다면 이런 과정 필요 없이 단순히 값을 변경시키면 끝이지만, 원시값은 변경이 불가능하기 때문에 원시값을 재할당하면 메모리 공간을 새로 확보하고 거기에 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경한다. 이러한 특성을 불변성(immutability)라고 한다. 원시 값을 할당받은 변수는 오직 재할당으로만 변수 값을 변경할 수 있다.

값에 의한 전달

var test1 = 1;
var test2 = test1;

test1 = 2;

console.log(test2) ; // 결과는?

console.log(test2)에서 출력값을 구하려면 test2에 재할당 된 값이 영향을 끼치느냐 그렇지 않느냐가 중요할 것이다. 결론부터 말하자면 console.log(test2)에선 1이 출력된다.
한 변수(test2)에 원시 값을 할당받은 다른 변수(test1)를 할당한다면 그 변수(test2)에는 할당된 변수(test1)의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달이라고 부른다. 이 때, 두 변수가 1 이라는 값을 할당받는다는 것은 동일하지만, test1과 test2의 1은 서로 다른 메모리 공간에 저장되었음을 기억해야 한다. 따라서 위의 경우, test1에 2를 재할당해도 test2에는 어떠한 영향도 끼치지 못한다.

참조 타입 (객체 타입)

참조 타입의 값은 변경 가능한 값(mutable value)이다. 원시 타입을 할당받은 변수의 경우 원시 값 자체가 변수의 값이 된다. 하지만 객체를 할당받은 변수의 경우 그 메모리 공간에는 참조 값, 즉, 객체가 저장된 메모리 공간의 주소가 저장되어 있다. 이를 참조 값이라고 한다. 따라서 참조 값을 할당받은 변수는 이를 이용해 객체가 저장된 메모리 공간을 찾아 객체에 접근한다. 또한 참조 타입은 재할당 없이 프로퍼티를 동적으로 추가하거나 삭제, 갱신할 수 있다. 그런데 잠시 생각해 보아야 한다. 원시 타입은 사용하도록 정해진 메모리 공간의 크기가 다르다. 하지만 변경이 가능한 참조 타입은 어떨까? 객체의 프로퍼티가 지속적으로 추가, 갱신, 삭제되는 상황에서 메모리 공간의 크기를 미리 정해두는 것은 비효율적이다. 따라서 참조 타입은 마음대로 그 크기를 줄이거나 늘릴 수 있는 특별한 메모리 공간에 저장되고, 이 공간을 heap이라고 부른다.

참조에 의한 전달

var test1 = {
	hi : 1
} ;
var test2 = test1 ;

test2.hello = 2;

console.log(test1) ; // 결과는?

이번에도 결과부터 말하자면 결과는 {hi : 1, hello : 2} 이다. 원시 값을 할당받은 변수는 서로 영향을 받지 않았는데, 왜 이번에는 결과가 다를까? 여기선 변수가 메모리 공간에 무엇을 가지고 있는지를 봐야 한다. 원시 타입의 경우와 이 경우 모두 메모리 공간에 저장된 값을 복사한다는 점에서는 같다. 다만 무엇이 복사되었는가 또한 생각해야 한다. 원시 타입의 경우 원시 값 그 자체가 복사된다. 하지만 참조 타입의 경우 참조 타입이 있는 메모리 공간의 주소(참조값)이 메모리 공간에 복사된다. 따라서 test1과 test2는 동일한 객체를 가리키며, 어느 하나에서 객체를 변경하면 다른 한 쪽도 영향을 받는다. (사실 둘 다 메모리 공간의 값을 복사해서 전달한다는 점은 동일하다. 이 때문에 참조에 의한 전달은 없고 값에 의한 전달만이 존재한다고도 할 수 있다.)

0개의 댓글