11 / 원시값과 객체의 비교

JinKris·2022년 2월 1일
0
post-thumbnail

변수와 값

변수 : 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위해 붙인 이름
: 변수에 저장된 데이터, 표현식이 평가되어 생성된 결과.

원시값 Primitive

원시 타입의 값은 변경할 수 없으나 변수 값은 변경할 수 있다. 변수는 언제든지 재할당을 통해 변수 값을 변경 할 수 있다 (그래서 변수라 부른다).
변수의 반대 개념인 상수는 재할당이 금지된 변수를 말한다.

값에 의한 전달
원시값을 할당한 변수에 새로운 원시 값을 재할당하면 원시 값을 변경하는 것이 아니라 새로운 메모리 공간을 확보하고 재할당한 원시값을 저장한 후, 변수는 새롭게 재할당한 원시 값을 가리킨다. 원시 값은 변경 불가능한 값이기 때문에 변수가 참조하던 메모리 공간의 주소가 바뀌는 것이다.

var score = 80;
var copy = score;

1) 새로운 80을 생성(복사)해서 메모리 주소를 전달. (Javascript)
2) score의 변수값 80의 메모리 주소를 그대로 전달. (Phython)

즉, '값에 의한 전달'은 사실 값을 전달하는 것이 아닌 메모리 주소의 전달을 말한다.
단, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.

불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.

문자열 (원시값)
문자열은 다른 원시 값과 다른 특징을 가지고 있다.

유사 배열 객체이면서 이터러블이므로 배열과 유사하게 각 문자에 접근할 수 있다.
(원시값을 객체처럼 사용하면 원시값을 감싸는 래퍼 객체로 자동 변환된다. 21.3절...)

var str = "string";

//문자열은 배열과 유사하게 인덱스로 각 문자에 접근 가능
console.log(str[0); // s

//원시 값인 문자열이 객체처럼 동작
console.log(str.length); // 6
console.log(str.toUpeerCase()); // STRING

//하지만 문자열은 원시값이므로 변경할 수 없다.
str[0] = 'S' // 에러는 발생하지 않는다.

원시값이므로 변경할 수 없으나 새로운 문자열을 재할당하는 것은 물론 가능하다.

객체 Object

객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제할 수 있다.
따라서 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.

원시값으로의 접근? 원시값을 할당한 변수는 원시 값 자체를 값으로 갖는다.
객체값으로의 접근? 객체를 할당한 변수가 기억하는 메모리 주소를 통해 객체가 저장된 메모리 공간의 주소(참조 값)에 접근할 수 있다.


'변수는 객체를 참조하고 있다' 또는 '변수는 객체를 가리키고 있다'

객체는 변경 가능한 값이다.
따라서 메모리에 저장된 객체를 직접 수정할 수 있다.
이것에 따른 부작용이 있다.
여러개의 식별자가 하나의 객체를 공유할 수 있다는 것이다.

참조에 의한 전달

원본 person을 사본 copy에 할당하면 원본 person의 참조 값을 복사해서 copy에 저장한다. 두개의 식별자가 하나의 객체를 공유한다는 것이다. 따라서 원본 또는 사본 중 어느 한쪽에서 객체를 변경하면 서로 영향을 주고받는다.

결국...
'값에 의한 전달'과 '참조에 의한 전달'은 식별자가 기억하는 메모리 공간(변수)에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일하다. 변수에 저장되어 있는 값이 원시 값이나 참조 값이냐의 차이만 있을 뿐이다.
엄밀히 말해 자바스크립트에는 '값에 의한 전달'만이 존재한다고 말할 수 있다.

profile
hello world

0개의 댓글