기본 자료형은 이전 글에서 자세히 적어놓았으니 오늘은 객체 자료형에 대해서 알아보자.
객체 자료형과 기본형 자료형의 가장 큰 차이점은 Reference(참조)에 있다. 기본형 변수는 다른 변수에 값을 할당하거나 함수 인자로 넘길 때 값을 복사하여 전달하지만, 객체는 메모리 주소를 복사시키며 값 자체는 복사되지 않아 같은 객체를 참조하게 된다.
즉, 함수를 호출할 때 new을 붙이면 새로운 객체를 만든 후에 이를 리턴한다.
얕은복사는 복사한 변수에 다른 값을 넣어도 변경되지 않지만 깊은 복사는 기존의 값도 변경이 된다.
shallow copy(얕은 복사)와 deep copy(깊은 복사)인데요. shallow copy는 가장 상위 객체만 새로 생성되고 내부 객체들은 참조 관계인 경우를 의미합니다. deep copy는 내부 객체까지 모두 새로 생성된 것을 의미합니다.
얕은 복사와 깊은 복사를 그림으로 나타내면 위에 같은 그림으로 설명이 가능하다.
let people = {
name : 'a',
gender : 'male',
age : '10,
// 더욱 많은 프로퍼티가 있다고 가정해보자
const changeName = function(people, newname)
{
let newpeople = people;
newpeople.name = newname;
return newpeople;
}
let people1 = changeName(people, "b")
let people2 = changeName(people, "c")
let people3 = changeName(people, "d")
let people4 = changeName(people, "e")
//console.log를 찍으면 결국 name e로 모두 동일하다.
객체를 복사해서 name에 newname으로 바꿔주었지만 깊은 복사가 일어나서 해당 객체의 프로퍼티 값도 같이 바꿔버리게 된 것이다.
결국 이러한 문제를 해결하기위해 불변 객체가 필요하다.
모든 변수가 같은 주소공간을 바라보기 때문에 생기는 현상, 이러한 문제를 해결하기 위해 원본 객체 내부의 값들을 복사한 새로운 객체를 생성하여 변수에 할당해주어야 한다.
const changeName = function(people, newname)
{
return {
name : newname,
gender : people.gender,
age : people.age,
key : people
}
}