프로그래밍 세계에서 데이터 복사는 일반적인 작업입니다. 그러나 모든 복사본이 동일하게 생성되는 것은 아닙니다. 자주 나타나는 두 가지 용어는 얕은 사본과 깊은 사본입니다. 감지하기 어려운 오류를 피하려면 둘 사이의 차이점을 이해하는 것이 중요합니다.
얕은 복사본은 개체의 첫 번째 수준만 복사하고 더 깊은 수준의 원본 데이터에 대한 참조는 남겨 둡니다. 즉, 원본 개체 내부에 다른 개체가 있는 경우(중첩) 얕은 복사본은 개체 자체가 아닌 해당 개체에 대한 참조만 복사합니다.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]
import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) shallow_copy[2][0] = 99 print(original_list) # [1, 2, [99, 4]] print(shallow_copy) # [1, 2, [99, 4]]
얕은 복사본은 중첩된 개체를 수정할 필요가 없다는 것을 알고 있는 경우 유용합니다. 전체 복사보다 속도가 빠르고 메모리를 덜 소모합니다.
JavaScript에서 Array.slice() 또는 Object.할당()을 사용하면 얕은 복사를 수행하는 것입니다!
깊은 복사는 객체의 모든 수준을 복사하여 중첩된 구조도 복제합니다. 이는 복사본에 대한 변경 사항이 원본 개체에 영향을 미치지 않음을 의미합니다.
const originalArray = [1, 2, [3, 4]]; const deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[2][0] = 99; console.log(originalArray); // [1, 2, [3, 4]] console.log(deepCopy); // [1, 2, [99, 4]]
import copy original_list = [1, 2, [3, 4]] deep_copy = copy.deepcopy(original_list) deep_copy[2][0] = 99 print(original_list) # [1, 2, [3, 4]] print(deep_copy) # [1, 2, [99, 4]]
복잡하거나 중첩된 데이터 구조로 작업하는 경우 원치 않는 부작용을 피할 수 있는 가장 안전한 옵션은 전체 복사입니다.
Python에서는 복잡한 객체를 안전하게 복제해야 할 때 copy.deepcopy()가 도움이 됩니다.
다음은 얕은 복사와 깊은 복사를 직접 비교한 것입니다.
특징 | 얕은 사본 | 깊은 복사 |
---|---|---|
얕은 사본 | 응 | 아니요 |
딥 카피 | 아니요 | 응 |
원본 개체를 수정하면 복사본에 영향을 미칩니다. | 응 | 아니요 |
복잡성 | 낮은 | 높은 |
복잡한 개체를 작업할 때는 얕은 복사본이 더 빠르지만 깊은 복사본이 더 안전하다는 점을 기억하세요.
얕은 복사본은 간단한 애플리케이션 설정이나 임시 데이터를 복제하는 데 적합합니다!
일반적인 실수는 데이터가 중첩될 때 전체 복사본 대신 얕은 복사본을 사용하는 것입니다. 이로 인해 원본 개체가 원치 않게 수정될 수 있습니다.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
얕은 복사본과 깊은 복사본 중에서 결정하기 전에 항상 개체에 중첩된 레벨이 있는지 확인하세요.
const originalObject = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, originalObject);
const originalArray = [1, 2, 3]; const shallowCopy = [...originalArray];
const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = structuredClone(originalObject);
structuredClone()은 머리를 아프게 하지 않고도 복잡하거나 원형 구조를 복사하는 데 적합합니다.
const _ = require('lodash'); const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = _.cloneDeep(originalObject);
import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) deep_copy = copy.deepcopy(original_list)
Python에서는 때때로 목록이 실수로 변경되는 것을 방지하기 위해 얕은 복사본만 있으면 됩니다!
요약하자면 얕은 복사본과 깊은 복사본 모두 용도가 있습니다. 중요한 것은 작업 중인 데이터의 구조를 이해하고 적절한 복사 방법을 선택하는 것입니다.
예, 더 적은 데이터를 복사하기 때문입니다.
예, JSON.parse(JSON.stringify()) 또는 StructuredClone()을 사용합니다.
원본 개체도 영향을 받습니다.
반드시 그런 것은 아닙니다. 복잡한 데이터 구조로 작업할 때만 가능합니다.
기본이고 순환 구조를 지원하며 JSON.parse(JSON.stringify())보다 효율적이며 한 개체에서 다른 개체로 값을 완전히 전송할 수 있습니다.
깊은 복사본 대신 얕은 복사본을 사용할 때 발생하는 실수는 생각보다 더 흔합니다! 이 작은 가이드가 데이터 복사 시 문제를 방지하는 데 도움이 되기를 바랍니다.
댓글로 알려주세요. Deep Copy와 Shallow Copy에 대해 이미 알고 계시고 이로 인해 문제가 발생한 적이 있으신가요?
Unsplash의 Mohammad Rahmani 사진
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3