원시자료형과 참조자료형

최경락 (K_ROCK_)·2021년 11월 25일

stack, heap

  • JS가 데이터를 저장할 때 사용하는 저장소는 stack 과 heap 이 있다.
  • stack은 이름과 함께 데이터 하나만을 저장하고, heap의 경우 다수의 데이터를 저장하고 이를 주소로 저장한다.
  • stack 은 데이터를 위해 하나의 공간만을 가지지만, heap 의 경우 주소에 연결된 데이터의 공간을 동적으로 확장 시키거나, 축소 시킬 수 있다.

원시자료형

  • stack 에 저장된다.
  • 변수를 선언하면 stack의 한 자리를 확보하게 되고, 값을 할당하면 해당 stack에 할당한 값을 저장한다.
    → 변수를 선언하는 것은 stack 의 공간에 이름표를 붙히는 것과 같다.
  • 이후, 변수명을 작성하여 호출하면 해당 stack에 저장되어 있는 데이터를 가져온다.
  • 원시자료형에 지정된 값은 변경될 수 없는 값이지만, 변수를 재할당하여 다른 값을 할당 시킬 수 있다.
    → 결국 해당 값이 변경되는 것이 아니라, 다른 값이 할당되는 것
let pri = 'text' // 'text' 라는 값은 변경 될 수 없다.
pri = 'word' // pri 에 'word' 라는 새로운 값을 할당하는 것

참조 자료형

  • 배열, 객체, 함수가 이에 해당된다.
    → 반대로, 이에 해당되지 않으면 원시자료형이라고 볼 수 있다.
  • 변수를 선언, 할당 할 때 그 변수명이 stack의 자리를 차지하는 것은 같지만, 그 값은 heap 에 생성된 주소에 저장된다.
  • 변수를 호출할 때는 stack 과 연결된 heap 의 주소에서 해당 데이터를 참조하여 반환한다.
    → 참조 자료형이라는 이름의 유래
  • 즉, 변수명은 stack, 자료는 heap 에 저장되며, 데이터가 저장된 heap의 주소를 변수의 이름을 가진 stack 에 제공한다.
  • 완전히 같은 값을 가진 서로 다른 배열이나 객체를 일치연산자로 비교할 때 false 라고 출력되는 이유도 이곳에 있다.
    → 일치연산자는 주소의 값을 비교하는데, 서로 다른 배열이나 객체는 각각 다른 heap 의 주소값을 참조하기 때문.
[1,2,3] === [1,2,3] // false
{a : 1} === {a : 1} // false

// 서로 다른 주소값에 저장되어 호출되므로, 주소가 다르기 때문에 false 를 출력한다.
  • 만약 객체 안에 데이터로 다른 객체가 있는 경우에도 둘의 주소값은 다르다.
    → 내부의 다른 객체에 대한 주소값을 참조하는 것.

+

  • 원시자료형이란 뜻은 컴퓨터의 초기 단계(원시)에 하나의 변수에 하나의 데이터 밖에 담지 못했다는 점에서 유래하여 원시의 컴퓨터의 자료형이란 뜻이다.
  • 원시 자료형의 경우 데이터 값을 복사하여 사용하기 때문에 기존에 지정한 값이 변경되지 않는다.
    (immutable)
  • 반면 참조 자료형의 경우 주소를 복사하기 때문에, 데이터가 변경될 경우 주소의 데이터 자체가 변경되므로, 기존의 데이터에도 영향을 미친다.
    (mutable)

0개의 댓글