자바스크립트의 데이터타입은 크게 2가지(+1)로 구분된다.
Primitive Type은 더이상 _값을 그대로 할당 함
-> 값을 할당할 때 값 그 자체를 다른 메모리에 할당하기 때문에, 원래의 값과 복사된 값이 서로 영향을 미치지 않음
immutable value (변경 불가능한 값)
메모리 내에 고정된 크기로 저장되면서, primitive data 값 자체를 보관
Primitive Type의 종류
- Number
- String
- Boolean
- null
- undefined
- Symbol (New in ECMAScript 6)
(예시)
const a = 1;
let b = a;
b = 2
console.log(a); //1
console.log(b); //2
Reference Type 데이터는 '값이 지정된 주소값'을 할당한다/
-> 참조값은 '해당 변수가 객체의 주소를 가르키는 값'이다
Reference Type은 기본형 데이터의 집합
mmutable Value (변경 가능한 값)
Reference Type 종류
- Object : array, function, map,
(예시)
const a = {number: 1};
let b = a;
b.number = 2
console.log(a); // {number: 2}
console.log(b); // {number: 2}
Shallow Copy는 참조(주소)값의 복사하는 것이다.
const stu = { vaule: 1 }
const newStu = obj;
newStu.vaule = 2;
console.log(stu.vaule); // 2
console.log(stu === newStu); // true
stu 객체를 새로운 newStu 객체에 할당하였으며 이를 참조 할당이라 부른다.
복사 후 newStu 객체의 value값을 변경하였더니 기존의 obj.value값도 같이 변경된다.
두 객체를 비교해도 true로 나온다.
▶ 이는 얕은 복사로, 데이터가 생성되는 것이 아니라
해당 데이터의 참조 값(메모리 주소)를 전달하여 한 데이터를 공유하는 것이다.
값 자체의 복사를 나타낸다
let a = 1;
let b = a;
b = 2;
console.log(a); // 1
console.log(b); // 2
console.log(a === b); // false
변수 a를 새로운 b에 할당하였고 b 값을 변경하여도 기존의 a의 값은 변경되지 않는다.
두 값을 비교하면 false가 출력되며 서로의 값은 단독으로 존재하다는 것을 알 수 있다.
▶ 이렇게 Primitive Type은 Deep copy가 되며,
이는 독립적인 메모리에 값 자체를 할당하여 생성하는 것이라 볼 수 있다.
효율성을 위한 것이다.
예를 들어 객체 내에 개체가 1000개 있는 경우, 개체를 생성하고 할당하는데 시간이 1초 걸린다고 가정하면, Deep Copy를 하게 되면 최소 1000초가 소요되고, Shallow Copy를 하면 메모리를 가르키는데 필요한 시간만 소요하게 된다.
따라서 Shallow Copy만 해도 되는 경우에는, Shallow Copy를 하는 것이 효율적이다.
Syntax
Object.assign(target, ...sources)
const obj={a:1};
const copy = Object.assign({}, obj);
const student={
name : 'ksj',
age : 20,
type : intj
};
let studentCopy = { ...student};
studentCopy.age = 30;
console.log (student, studentCopy); // age가 20, 30으로 바뀜
의도하지 않은 객체의 변경이 발생하여 오류를 발생하기 때문이다. 변경 원인의 대다수는 “레퍼런스를 참조한 다른 객체에서 객체를 변경”하기 때문이다.
Cost는 들지만 객체를 immutable data pattern으로 만들어 프로퍼티의 변경을 방지하며
객체의 변경이 필요한 경우에는 참조가 아닌 Defensive copy (객체의 방어적 복사)를 통해 새로운 객체를 생성한 후 변경한다.
① 객체의 방어적 복사(defensive copy) : Object.assign, 전개연산자 (위 내용 참조)
② 불변객체화를 통한 객체 변경 방지 : Object.freeze
Deep Copy를 진행함
Object.freeze()를 하면 객체에 다른 값을 할당해도 무시되고 변하지 않는다.