[JS Basic] 원시 값과 객체의 비교

재오·2022년 9월 24일
1

JavaScript

목록 보기
8/48
post-thumbnail

간단하게 설명하자면 원시 값은 변경이 불가능한 값이고 객체는 변경이 가능한 값을 의미한다. 원시 값을 변수에 할당하면 실제 값이 저장되고, 객체를 변수에 할당하면 참조 값이 저장된다.

원시 값

우리는 값을 변수에 할당한다. 하지만 변경이 불가능한 것은 값이지 변수가 아니라는 점을 명심하기를 바란다. 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간이다. 변수라는 범주 안에는 상수가 포함되어 있는데, 상수는 재할당이 금지된 변수를 의미한다. 흔히 const 키워드를 사용한다.

원시 값이 무엇인지 설명해주는 하나의 이미지이다. 원시 값은 변수를 선언하고 값을 재할당 할 때마다 메모리 공간의 주소가 바뀐다. 이러한 특성을 불변성이라고 하는데 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.

자바스크립트에서 문자열

자바스크립트에서 문자열은 원시 타입이며 변경이 불가능하다.

var str = 'Hello';
str = 'World';

다음 코드는 모두 메모리가 존재한다. 값이 변경된 것이 아니다. 가리키는 값이 변경되었을 뿐이다. 참고로 문자열은 유사 배열 객체이다. 인덱싱과 length 프로퍼티를 갖고있다. 그래서 다음과 같은 코드 실행이 가능하다.

var str = 'string';

console.log(str[0]); // s
console.log(str,length); // 6

하지만 문자를 변경하는 것은 불가능하다! 하지만 오류가 발생하지는 않는다.

str[0] = "S"; 
console.log(str); // string

값에 의한 전달 (call by value)

원시 값은 값에 의한 전달이라고 했다. 값에 의한 전달은 값이 바뀌지는 않고 메모리 공간이 바뀌는 것 뿐이라는 점만 기억하면 된다.

var score = 80;
var copy = score;

score = 100;

console.log(score); // 100
console.log(copy); // 80

객체

객체는 변경이 가능한 값이다. 이를 참조 값이라고 한다.

위 이미지를 이용해 설명을 해보자. 먼저 person 이라는 변수를 생성한다. 그렇다면 이 메모리 주소가 있을 것이다. 그리고 여기서 우리는 참조라는 것을 한다. 0x00001332라는 참조 값을 통해 실제 객체가 있는 메모리에 접근을 하는 원리이다.

우리는 객체가 변경이 가능하다고 했다. 따라서 재할당 없이 객체를 직접 변경할 수 있다.

person.name = "Kim";

person.address = "Seoul";

참조에 의한 전달(call by reference)


우선 person과 copy 메모리 주소는 서로 다르다. 하지만 참조 값이 같아 하나의 객체를 서로 공유한다. 이는 즉 여러 개의 식별자가 하나의 객체를 공유할 수 있고, 이는 객체가 서로 영향을 주고 받기 때문에 내용이 변경될 수도 있음을 의미한다.
하나의 값을 변경하게 된다면 person과 copy를 호출하더라도 서로 내용이 변경되어 있다는 것이다. 이는 보안에 취약하다는 단점을 가지고 있다.

var person1 = {
	name: 'Lee';
};

var person2 = {
	name: 'Lee';
};

console.log(person1 === person2); // false 다른 메모리에 저장된 별개의 값
console.log(person1.name === person2.name); // true 원시값 'Lee' = 변경 불가능한 값
profile
블로그 이전했습니다

0개의 댓글