본문 바로가기
JavaScript Study

JavaScript - #13. 원시값과 객체(2)

by KMS_99 2023. 8. 28.

2. 객체

객체는 프로퍼티의 집합으로 프로퍼티 개수가 정해져있지 않다.

프로퍼티는 동적으로 계속 추가되고 삭제 될 수 있으며, 값 역시 제한이 없다.

이러한 특성 때문에 원시값과 객체는 분리되어 정의하며, 어떤 점이 원시값의 개념과 다른지 비교를 통해 알아보자.

 

- 변경가능한 값

객체는 변경가능한 값이다. 

객체 변수에 할당하면, 실제 객체 그 자체는 새로운 공간에 할당이 되며, 변수가 가지고 있는 값은 실제 객체가 아닌, 실제 객체가 저장된 공간의 주소가 저장이 된다.

즉, 값이 아닌 참조값이 저장되는 것이다.

 

원시값은 변경이 불가능하기 때문에 재할당 외에 값을 바꿀 수 있는 방법이 없다.

하지만 객체는 변경이 가능한 값이다.

재할당 없이도 값의 변경이 가능하며, 동적으로 값을 추가할 수도 있다.

let person = {
    name:'Kim'
};

person.name = 'Lee'; // 프로퍼티 값 갱신, 변경
person.city = 'Seoul'; // 프로퍼티 값 동적 추가

console.log(person); // {name:'Lee', city:'Seoul'}

값의 변경이 일어나면 메모리에서는 어떻게 동작할까?

person이라는 변수는 실질적인 객체 자체의 참조값을 가지고 있기 때문에 참조값의 변동사항은 없다.

다만 객체는 변경 가능한 값으로 설계되었기에 실질적인 객체는 동적으로 변동이 생긴다.

 

변경을 해도 새로운 공간을 할당하지 않고 내부에서 변경만 이루어지기 때문에 메모리 관리에서 효율적이지만,

변수 자체는 실직적 객체의 참조값만을 가지고 있기 때문에 다른 변수도 해당 참조값을 가지게 된다면 객체 자체의 값에 영향을 줄 수 있다는 문제점이 있다.

 

- 참조에 의한 전달

여러개의 식별자가 하나의 객체를 공유한다는 것이 뭘까?

다음 코드를 보자

let user = {
    name:'Kim'
}

//참조 값을 복사 (얕은 복사)
let anotherUser = user; 

anotherUser.name='Lee';
console.log(user) // {name:Lee}

위 코드에서는 user라는 변수에 저장된 객체의 참조값을 새로운 변수 anotherUser에 복사하여 저장한다.

결론적으로 user와 anotherUser에 들어있는 참조값은 하나의 객체를 가리키고 있다.

때문에 두개의 변수 중 하나의 변수에서라도 객체의 변경을 진행한다면 객체 자체의 값이 변경되기 때문에 변경하지 않은 변수에서도 변경된 값을 가지게 된다.