변수 최종 정리

박찬욱·2023년 5월 31일
0

Basic JavaScript

목록 보기
2/13
post-thumbnail

값에 의한 전달

let score = 80;
let copy = score;

console.log(score, copy);
console.log(score === copy);

score = 100;

console.log(score, copy);
console.log(score === copy);

이 내용의 핵심은 변수에 변수를 할당했을 때 무엇이 어떻게 전달되는가? 이다.
score 는 메모리 어딘가에 (주소는 예시로 100) 80 이라는 값을 가진 상태로 저장이 된다. 그리고 copyscore 을 할당하면 변수의 값 즉, 80이 copy 에 할당되게 된다.
하지만 copyscore서로 다른 주소에 위치한 변수이다.
copy 의 주소는 100이 아니라 120, 또는 다른 주소에 할당된다. 그렇기에 score 의 값을 100으로 바꿔도 copy 에는 영향을 미치지 못한다. 서로 다른 주소에 저장되어 있기 때문이다. 이것을 값에 의한 전달 이라고 한다. 엄격하게 말하면 값에 의한 전달도 값을 전달하는 것이 아니라 메모리 주소를 전달하여 값을 참조하는 개념이다. 이유는 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하기 때문이다.
중요한 것은 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다 는 것이다.


참조에 의한 전달

let person = {
  name: "Lee",
};

let copy = person;

객체 타입은 참조값이 전달된다.
위 예제에서 copyperson 객체가 저장되어 있는 메모리의 주소를 전달받게 된다. 즉 copyperson 은 서로 같은 객체를 가리키게 되는 것이다. 두 개의 식별자가 하나의 객체를 공유하는 것을 의미한다.


🤔 참조값을 비교하는가? 원시값을 비교하는가?

var person1 = {
  name: "Lee",
};

var person2 = {
  name: "Lee",
};

console.log(person1 === person2);
console.log(person1.name === person2.name);

위 예제에서 person1person2 는 똑같이 생겼다. 안에 들어가는 프로퍼티도 동일하다. 하지만 두 객체는 서로 다른 메모리에 저장되어있고 객체의 이름 즉, person1person2 는 서로 다른 메모리 주소를 가지고 있다. 그러므로 첫번째 콘솔은 false 가 나올 것이다.
두번째로 각 객체의 프로퍼티를 비교하고 있다. name 이라는 키 값을 가진 값은 원시 값이다. 즉, 원시값을 할당한 변수를 비교하므로 원시 값을 비교하면 true 가 나온다.
중요한 핵심은 객체를 할당한 변수를 비교하면 참조 값을 비교하고, 원시 값을 할당한 변수를 비교하면 원시값을 비교하는 것이다.


🌟 const로 정의된 오브젝트

const obj = {
  name : 'chanuk',
  age : 20,
};
obj.name = 'ukgi';

const 로 정의된 객체가 있다. 객체의 멤버 변수인 name 을 다른 값으로 변경하려고 한다. 지금까지 배웠던 const 는 값의 재할당이 되지 않는다. 어떻게 될까?
당연히 다른 값으로 수정이 된다. 이유는 위에 전부 나와있다. 객체의 이름은 주소값을 가지고 있기 때문이다. const 로 정의된 것은 바로 객체이다. 즉, 객체가 가지고 있는 참조값을 변경할 수 없는 것이지 obj가 가리키고 있는 객체의 name 값에 접근해서 값을 변경하는 것은 가능하다.

// ❌❌ 즉, 이렇게 obj에 새로운 객체를 할당하는 것은 안된다. 
// obj는 const로 선언되었기 때문이다.

obj = {
  name : 'ukgi',
  age : 22,
};
profile
대체불가능한 사람이다

0개의 댓글