"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 얕은 복사와 깊은 복사 – 실제로는 무엇입니까? - JavaScript 및 Python의 예

얕은 복사와 깊은 복사 – 실제로는 무엇입니까? - JavaScript 및 Python의 예

2024-08-31에 게시됨
검색:842

소개

프로그래밍 세계에서 데이터 복사는 일반적인 작업입니다. 그러나 모든 복사본이 동일하게 생성되는 것은 아닙니다. 자주 나타나는 두 가지 용어는 얕은 사본깊은 사본입니다. 감지하기 어려운 오류를 피하려면 둘 사이의 차이점을 이해하는 것이 중요합니다.

얕은 복사본이란 무엇입니까?

얕은 복사본은 개체의 첫 번째 수준만 복사하고 더 깊은 수준의 원본 데이터에 대한 참조는 남겨 둡니다. 즉, 원본 개체 내부에 다른 개체가 있는 경우(중첩) 얕은 복사본은 개체 자체가 아닌 해당 개체에 대한 참조만 복사합니다.

JavaScript의 예

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]]

Python의 예

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.할당()을 사용하면 얕은 복사를 수행하는 것입니다!

딥 카피란 무엇입니까?

깊은 복사는 객체의 모든 수준을 복사하여 중첩된 구조도 복제합니다. 이는 복사본에 대한 변경 사항이 원본 개체에 영향을 미치지 않음을 의미합니다.

JavaScript의 예

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]]

Python의 예

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!)

팁:

얕은 복사본과 깊은 복사본 중에서 결정하기 전에 항상 개체에 중첩된 레벨이 있는지 확인하세요.

JavaScript로 복사하기 위한 도구 및 기능

얕은 복사를 위해 Object.sign() 사용

const originalObject = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, originalObject);

얕은 복사에 ...spread 사용

const originalArray = [1, 2, 3];
const shallowCopy = [...originalArray];

깊은 복사를 위해 StructuredClone() 사용

const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(originalObject);

팁:

structuredClone()은 머리를 아프게 하지 않고도 복잡하거나 원형 구조를 복사하는 데 적합합니다.

Deep Copy를 위해 Lodash와 같은 라이브러리 사용

const _ = require('lodash');
const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(originalObject);

Python에서 복사본을 만드는 도구 및 기능

복사 모듈 사용

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

copy.copy()와 copy.deepcopy()의 차이점

  • copy.copy(): 얕은 사본.
  • copy.deepcopy(): 딥 카피.

메모:

Python에서는 때때로 목록이 실수로 변경되는 것을 방지하기 위해 얕은 복사본만 있으면 됩니다!

요약 및 결론

요약하자면 얕은 복사본과 깊은 복사본 모두 용도가 있습니다. 중요한 것은 작업 중인 데이터의 구조를 이해하고 적절한 복사 방법을 선택하는 것입니다.

자주 묻는 질문

1. 얕은 복사는 항상 깊은 복사보다 빠르나요?

예, 더 적은 데이터를 복사하기 때문입니다.

2. JavaScript에서 외부 라이브러리 없이 전체 복사를 수행할 수 있습니까?

예, JSON.parse(JSON.stringify()) 또는 StructuredClone()을 사용합니다.

3. 얕은 복사본에 중첩된 개체를 수정하려고 하면 어떻게 됩니까?

원본 개체도 영향을 받습니다.

4. 문제를 피하기 위해 항상 전체 복사를 사용하는 것이 더 낫습니까?

반드시 그런 것은 아닙니다. 복잡한 데이터 구조로 작업할 때만 가능합니다.

5. StructuredClone()은 JavaScript의 다른 전체 복사 방법에 비해 어떤 장점이 있습니까?

기본이고 순환 구조를 지원하며 JSON.parse(JSON.stringify())보다 효율적이며 한 개체에서 다른 개체로 값을 완전히 전송할 수 있습니다.


깊은 복사본 대신 얕은 복사본을 사용할 때 발생하는 실수는 생각보다 더 흔합니다! 이 작은 가이드가 데이터 복사 시 문제를 방지하는 데 도움이 되기를 바랍니다.

댓글로 알려주세요. Deep Copy와 Shallow Copy에 대해 이미 알고 계시고 이로 인해 문제가 발생한 적이 있으신가요?


Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python

BYXN의 노트? | 서브스택

내 공개 노트! ???. Substack 출판물인 BYXN의 노트북?을 읽으려면 클릭하세요. 17일 전에 출시되었습니다.

Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python bhyxen.substack.com

Unsplash의 Mohammad Rahmani 사진

릴리스 선언문 이 글은 https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 에 재현되어 있습니다.1 침해가 있는 경우 , [email protected]로 문의해주세요.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3