원시 값과 객체의 비교

김민수·2023년 10월 12일
0
post-thumbnail

원시 타입과 객체 타입의 다른점

원시 타입객체 타입
변경 여부xo
변수에 할당시실제값 저장참조 값이 저장
자신 타입의 다른 변수에 할당시원본의 원시 값이 복사되어 전달원본의 참조 값이 복사되어 전달

1. 원시 값

변경 불가능한 값

  • 재할당 시, 메모리 공간에서 값이 바뀌는게 아니다.
    1. 새로운 메모리 공간을 확보한다.
    2. 재할당한 값을 저장한다.
    3. 변수가 참조하던 메모리 공간을 변경한다.

만약 값이 변한다면, 상태 변경을 추적하기 어렵다.
데이터의 신뢰성을 보장하며 이런 특성을 불변성이라 한다.

문자열과 불변성

다른 언어는 문자의 배열 or string 객체로 처리한다.
JavaScript는 문자열이라는 원시타입 객체를 제공한다.

문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 각 문자에 접근할 수 있다.

유사배열 객체 : 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length프로퍼티를 갖는 객체.

var str = 'test';
console.log(str[0]); // t
str[0] = 'T';        // 원시 값이라서 변경 불가. 에러도 발생하지 않는다.
console.log(str);    // test

값에 의한 전달

값에 의한 전달 방식

  1. 주소에서 값을 복사하여 새로운 메모리에 할당하고 변수와 연결하는 것
    ex) a = 메모리 1 = 80 , b = 메모리 2 = 80

  2. 같은 주소 할당, 재할당시 다른 메모리에 새로운 값 할당하는 것 (python)
    ex) a, b = 메모리 1 = 80

var score = '80';
var copy = score;
score = 100;

console.log(score) // 100
console.log(copy)  // 80

// 여기는 1번처럼 움직인다!

2. 객체

객체는 프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가되고 삭제할 수 있고, 제약도 없다.
따라서 메모리 공간을 사전에 정해 둘 수 없다.

변경가능한 값

  • 크기가 매우 클 수 있어서 복사해서 생성하는 비용이 많이 들고, 메모리의 효율적 소비를 어렵고 성능이 나빠지게 만든다. 이러한 점을 감안해서 만들어진 설계이다.
  • 변수를 참조하면 참조 값을 통해 실제 객체에 접근할 수 있기 때문에 변경이 가능하다.
  • 여러 개의 식별자가 하나의 객체를 공유할 수 있다
    • 이러한 부분에서 복사에 대해 이슈가 생김.
var person = {
  name : 'Lee',
  test : {
  	age : 20
  }
};
var copy = person;

copy.name = 'kim'			 // person, copy 둘 다 바뀜
copy.test.age = '22'         // person, copy 둘 다 바뀜

console.log(person)          // {name : 'kim', test:{age:'22'}};
console.log(copy)            // {name : 'kim', test:{age:'22'}};

0개의 댓글