잉? deepcopy를 쉽게 할 수 있다고? - structuredClone

이제 deep copy를 손쉽게 구현 할 수 있습니다. 바로 javascript 내부 함수 structuredClone 를 활용하면 말이죠ㅎㅎ
사용 방법은 아주 아주 간단합니다만. 우선 설명을 하기 전에 shallow copy , deep copy 에 대해서 알아보도록 하겠습니다.

Shallow Copy

shallow copy (얕은 복사)는 객체의 한 단계까지만 복사를 합니다 (같은 메모리 주소를 복사). 그 이유로 중첩 객체에 대해서는 복사 객체와 기존 객체가 서로 영향을 줄 수 있습니다.
  • Object.assign();
  • spread operator
위 과정의 메모리 할당 상태를 다음과 같이 표현할 수 있습니다.
notion image
 

Deep Copy

deep copy(깊은 복사)는 객체의 모든 것들을 복사하여 별개 객체를 생성합니다. 즉, 기존의 메모리 주소를 참조하는 것이 아닌 완전히 새로 메모리를 할당 받아 객체를 생성하는 것입니다.
  • lodash의 cloneDeep 함수 활용
  • JSON.parse() + JSON.stringify() 활용
JSON 방법의 경우 매우 간단하고 쉽지만 다음과 같은 단점들이 있습니다.
  • 함수, Date 객체, 정규표현식 등등의 데이터들은 정상적으로 복사가 될 수 없습니다.
  • JSON 메소드의 성능이 그렇게 좋지 않다 느릴수 있습니다.
그렇다면 deepcopy의 경우 메모리 할당 상태는 어떻게 표현이 될 까요? 바로 다음과 같습니다
notion image
notion image

StructuredClone

javascript에서 deep copy를 쉽게 구현할 수 있도록 해주는 내부 함수 structuredClone 의 사용방법은 아래 코드와 같이 아주 간단합니다. deepCopy를 하고자하는 객체를 함수에 넘겨주면 됩니다.
JSON을 활용하는 방법보다 성능도 좋고 쉽게 사용할 수 있으며 아래 타입들에 대해서 지원을 하고 있습니다.
notion image
 
하지만 다음과 같은 제약사항이 있습니다.
  • class instance인 경우 prototype이 폐기되고 일반객체로 반환합니다.
  • DOM, 함수의 경우 복사에 실패하고 에러가 발생합니다.
비록 한계점이 있지만 객체의 원본에 영향을 주지않는 복사본 객체를 생성해야되는 경우 추가 용량이 필요한 라이브러리 설치 없이 javascript 제공함수인 structuredClone 사용을 고려해보는것도 괜찮을거 같습니다.
 
참고

© 2024 dan.dev.log, All right reserved.

Built with NextJS