원시자료형 참조자료형/얕은복사와 깊은복사

문종후·2023년 3월 2일
0

자바스크립트에서 type이란 값의종류를의미한다.
여기서 두가지자료형인 원시자료형과 참조자료형으로 나눠지는데
원시자료형인 number, string, boolean, undefined, null 등을 제외하고나면 모두 참조자료형이라고 보면된다.

원시자료형과 참조자료형은 자료의값이 어떤식으로 저장되느냐에따라 매우다른 특징을 가진다.
먼저 원시자료형의 경우 하나의공간을차지해 저장하기때문에 값의 수정이 불가능하며 다른변수에 할당할경우 그대로복사되어 전달된다.

참조자료형의 경우 공간을 차지해 저장하는것이아니라 heap이라는 특별한 공간에 따로 값이저장되며 이 heap에 저장된 값을 참조해 가져오기때문에 다른변수에 할당할경우 주소값이 복사되며 값의 수정이 가능하다.


앞에서 원시자료형과 참조자료형은 복사할때 서로 다른특징을 가지게된다고했다.

먼저 원시자료형은 값자체를 복사하기때문에 이를 수정하더라도 복사된복사본과 원본은 수정해도 서로에게 영향을 미치지않는다.

하지만 참조자료형의경우 같은참조자료를 사용하기때문에 수정할시 서로영향을미치게된다.


그렇다면 참조자료형의 대표격인 배열과 객체는 어떻게 복사할수있을까?
먼저 배열을 복사하는 방법은 크게 두가지가있다.
1. slice()
2. spread syntax(..)
마찬가지로 객체를 복사하는 방법도 두가지가있는데
1.Object.assign()
2.spread syntax(..)

그러나 이 4가지 복사방법으로도 복사할수없는 경우가있다.
만약 배열이나 객체자료안에 키값이 또 배열과 객체가 속성을가진다면 앞에말한 방법으로 복사가불가능하다. 왜냐하면 위복사방법들은 배열이 중첩되있다면 딱 한단계의경우만 복사할수있기떄문이다. 이를 "얕은복사"라고한다.

그렇다면 복잡한 중첩이되있는 배열이나 객체를 어떻게 전체를 복사할수있을까?
이는 내장된 메서드로는 불가능하고 다른함수를이용하거나 외부라이브러리를 사용해가능하다.

먼저 함수를 이용하는 방법은 JSON.stringify()와 JSON.parse() 를이용하는방법이있는데
JSON.stringify()는 참조자료형을 문자열형태로 변경해준다. 그래서 먼저 문자열형태로 바뀐 자료를 수정한후 JSON.parse() 를사용해 문자열형태를 객체로바꿔준다. 이런식으로 값 전체를 복사하는것을 "깊은복사"라고한다.

profile
개발자가되고싶은사람

0개의 댓글