자바스크립트

자바스크립트 원시 타입과 참조 타입

포칼이 2023. 3. 23. 16:44

I. 값 복사 결과 비교

1. 원시 타입 - 값에 의한 복사 copy by value

let number1 = 1;
let string1 = 'ABC';
let bool1 = true;

let number2 = number1;
let string2 = string1;
let bool2 = bool1;

number2 = 2;
string2 = '가나다';
bool2 = false;

console.log('~1:', number1, string1, bool1); //~1: 1 ABC true
console.log('~2:', number2, string2, bool2); //~2: 2 가나다 false

이 코드를 실행하면 다음과 같은 일이 일어난다.

2. 참조 타입- 참조에 의한 복사 cpoy by reference

배열과 객체가 있다.

우선 객체먼저 살펴보면 다음과 같다.

const obj1 = {
  num: 1, str: 'ABC', bool: true
};
const obj2 = obj1;
// obj2 = {}; // ⚠️ 오류

console.log('obj1:', obj1);
console.log('obj2:', obj2);

// ⭐️ const임에도 내부 값은 변경 가능함 주목
// 내부 변경 방지는 이후 배울 Object.freeze 함수로
obj2.num = 2;
obj2.str = '가나다';
obj2.bool = false;

console.log('obj1:', obj1);
console.log('obj2:', obj2);
//obj1과 obj2의 프로퍼티의 값이 둘 다 변경됐다

여기서 주의깊게 봐야할 부분은 왜 obj2의 프로퍼티의 값을 바꿨는데 obj1의 프로퍼티의 값이 같이 바뀌었나~이다. 

 

배열도 한번 살펴보자.

const array1 = [1, 'ABC', true];
const array2 = array1;
// array2 = []; // ⚠️ 오류

console.log('array1:', array1);
console.log('array2:', array2);

// ⭐️ const임에도 내부 값은 변경 가능함 주목
array2[0] = 3;
array2[1] = 'def';
array2[2] = false;

console.log('array1:', array1);
console.log('array2:', array2);
//둘다 프로퍼티 값이 변경됨

역시 array2의 요소만 변경했는데 array1의 요소도 같이 바뀐 것을 볼 수 있다.

왜 그런지는 다음 그림을 보면 알 수 있다. 

간단히 말하자면 값을 복사해 온 것이 아니라 그 값을 가리키는 주소를 복사한 것이다. 

 

이번엔 메모리 영역에서 확인해보자.

const obj1 = {
  num: 1,
  str: 'ABC',
  bool: true
};

const obj2 = obj1;

obj2.num = 2;

console.log(obj1, obj2);

obj1과 obj2는 어떤 값들을 가지고 있는 주소값을 공유한다 (값 그 자체가 아니라).

obj2.num = 2로 그 주소에 있는 값을 변경하면 obj1도 같은 주소를 가리키고 있기 때문에 obj1역시 프로퍼티 값의 변경이 일어나는 것이다.

 

배열도 마찬가지다. 

const array1 = [1, 'ABC', true];
const array2 = array1;

array2[1] = '가나다';

console.log(array1, array2);