본문 바로가기

자바스크립트

원시와, 객체에 대한 메모리

메모리

원시 값

  • 원시 값은 불변하다.
  • 변수 하나를 생성하고, 다른 변수에 할당을 한다면 같은 주소를 참조 하는 것이 아니라 새로운 주소를 생성하여 그 주소를 바라 보고 있다.
  • 원시 값은 이러한 특성 떄문에 불변하다는 거다.
  • 다른 변수에 할당되면 새로운 주소가 생성되고, 기존 주소는 영향을 받지 않는다.
  • 불변성 덕분에 원시 값을 변경하는 것은 불가능하고, 새로운 값으로 대체되는 방식
  • 다만 큰 데이터가 있다면 같은 주소를 참조하는 것이 아니기 떄문에 30바이트 라는 문자열이 있다면 생성하고 다른 변수에 할당한다면
  • 새로운 주소를 하나 더 생성하기 때문에 30 * 바이트 이다.
```
  let a = 1;
let b = a;
```






# 참조형
  • 참조형 데이터는 가변성이다. 즉 변경이 가능하다.
  • 참조형 데이터는 객체를 하나 생성 후 다른 객체에 할당 한다면 같은 주소를 가리키고 있다. 즉 참조하고 있다.
  • 만약 객체에 같은 데이터가 있다면 아래처럼 같은 주소를 참조하고 있다. 그래서 같은 주소를 참조 하고 있기 떄문에
  • 객체 데이터는 처음 할당될 때 메모리에서 주소를 찾고 할당하는데, 이 과정에서 참조 비용이 발생
  • 객체 자체는 변경 가능하므로, 주소를 공유하며 원본 데이터도 변경될 수 있다.
  • 그렇기 떄문에 할당한 객체에 프로퍼티를 접근하여 변경을 한다면 원본 데이터도 변경이 된다.
const obj = {
    a: '겁나큰 문자열이다. 30바이트 라고 가정할게',
    b: ['겁나큰 문자열이다. 30바이트 라고 가정할게', 2]
}

const obj2 = obj;

결론적으로

  • 참조형은 같은 메모리 주소를 참조하여, 한 곳에서 데이터가 변경되면 모든 참조하는 변수에 영향을 미친다.
  • 원시 값은 각 변수마다 독립적인 메모리 공간을 가지며, 변경되지 않는다.
  • 게임에 대한 업데이트 라고 생각을 한다면 유저가 게임에 대한 코드를 변경을 할 수 있다고 가정을 하고 유저가 코드를 변경을 한다면 원본 데이터도 변경이 될 것이다 이는 얕은 복사라고 볼 수 있고, 만약 유저가 게임에 대한 내용을 저장하고 혼자 사용을 하고 데이터를 변경을 한다면 원본에 있는 즉 게임 서버에 데이터가 변경이 되는 것은 아니니깐 이는 깊은 복사라고 볼 수 있다.

'자바스크립트' 카테고리의 다른 글