깊은 복사와 얕은 복사

Kimu·2021년 9월 23일
0
post-thumbnail

자료형이 불린, 넘버, 스트링이 아닌 참조형이라고 불리는 배열, 객체는 복사할 때 값이 아니라 주소를 복사한다는 것을 온 세상이 다 알고 있다. 그러면, 얘네들은 복사를 어떻게 함?

값이 아니라 주소가 복사가 되면 무슨 문제가 생김?
복사한 배열과 원본 배열이 같은 주소를 공유하게 되면서, 복사한 배열의 값을 바꾸면 원본 배열의 값도 바뀐다. 이름만 다른 같은 배열...

그렇다면 이를 어떻게 해결하느냐, 바로 ...!!!
스프레드 연산자이다. 이것으로 해결한다.

let array1 = [1, 2, 3]
let array2 = [...array1]

이렇게 복사하면 값이 다른 주소에 저장되면서 같은 값을 가져올 수 있다.
그런데 만약에 배열 안에 또 배열이 있다면?

그렇다면 스프레드 연산자로 카피가 안된다. (주소만 가져옴) => 복사의 복사를 못하는 이런 복사를 얕은 복사라고 함.

깊은 복사가 필요할 때는?
JSON.stringify()와 JSON.parse()가 있다.

let object1 = { a:1, b:[ 2, 'c'], c:{d: 'dry'} }
JSON.parse(JSON.stringify(object1))

이렇게 JSON.stringify()로 객체의 모든 값을 스트링으로 변환해 준 뒤, 다시 JSON.parse()로 그 값을 모두 자바스크립트 객체로 변환해주면 된다.

이 과정을 간단하게 할 수 있는 깊은 복사용 라이브러리가 바로 lodash이다.
이런 것이 있다 정도만 일단 알아두고 로다쉬 사용법은 나중에 포스팅할 예정이다.

profile
지속가능한 개발자

0개의 댓글