F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

자바스크립트에서 깊은 복사와 얕은 복사 이해하기

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



자바스크립트에서 깊은 복사와 얕은 복사 소개

자바스크립트에서 객체를 복사할 때, 깊은 복사와 얕은 복사의 개념을 이해하는 것은 매우 중요합니다. 얕은 복사는 객체의 참조를 복사하는 반면, 깊은 복사는 객체의 모든 속성을 재귀적으로 복사합니다.

이 글에서는 깊은 복사와 얕은 복사의 차이점을 설명하고, 각각의 사용 사례와 주의사항을 다룹니다. 또한, 자바스크립트에서 깊은 복사를 구현하는 방법을 예제로 소개합니다.

왜냐하면 객체 복사는 자바스크립트에서 데이터 처리와 관련된 중요한 개념이기 때문입니다.

객체 복사를 올바르게 이해하고 사용하면, 데이터의 무결성을 유지하고 예기치 않은 버그를 방지할 수 있습니다.

이제 깊은 복사와 얕은 복사의 개념과 사용법을 자세히 살펴보겠습니다.



얕은 복사(Shallow Copy)란?

얕은 복사는 객체의 참조를 복사하는 방식입니다. 즉, 원본 객체와 복사된 객체는 동일한 메모리 주소를 참조하게 됩니다. 따라서 원본 객체나 복사된 객체 중 하나를 수정하면, 다른 객체에도 영향을 미칩니다.

얕은 복사는 주로 Object.assign()이나 스프레드 연산자(...)를 사용하여 구현할 수 있습니다.

왜냐하면 얕은 복사는 객체의 참조를 복사하기 때문에, 메모리 사용량이 적고 속도가 빠르기 때문입니다.

다음은 얕은 복사를 사용하는 예제입니다:

const original = { name: 'John', age: 30 };
const copy = { ...original };

copy.name = 'Jane';
console.log(original.name); // 'Jane'

이 예제에서 원본 객체와 복사된 객체는 동일한 메모리 주소를 참조하므로, 복사된 객체의 name 속성을 변경하면 원본 객체에도 영향을 미칩니다.



깊은 복사(Deep Copy)란?

깊은 복사는 객체의 모든 속성을 재귀적으로 복사하는 방식입니다. 즉, 원본 객체와 복사된 객체는 서로 다른 메모리 주소를 참조하게 됩니다. 따라서 원본 객체나 복사된 객체 중 하나를 수정해도, 다른 객체에는 영향을 미치지 않습니다.

깊은 복사는 주로 재귀 함수를 사용하여 구현할 수 있습니다. 또한, lodash 라이브러리의 cloneDeep() 함수를 사용하여 쉽게 구현할 수 있습니다.

왜냐하면 깊은 복사는 객체의 모든 속성을 재귀적으로 복사하기 때문에, 데이터의 무결성을 유지할 수 있기 때문입니다.

다음은 깊은 복사를 사용하는 예제입니다:

const original = { name: 'John', age: 30, address: { city: 'New York' } };
const copy = JSON.parse(JSON.stringify(original));

copy.address.city = 'Los Angeles';
console.log(original.address.city); // 'New York'

이 예제에서 원본 객체와 복사된 객체는 서로 다른 메모리 주소를 참조하므로, 복사된 객체의 address 속성을 변경해도 원본 객체에는 영향을 미치지 않습니다.



깊은 복사와 얕은 복사의 차이점

깊은 복사와 얕은 복사는 객체를 복사하는 방식에서 차이가 있습니다. 얕은 복사는 객체의 참조를 복사하는 반면, 깊은 복사는 객체의 모든 속성을 재귀적으로 복사합니다.

얕은 복사는 메모리 사용량이 적고 속도가 빠르지만, 원본 객체와 복사된 객체가 동일한 메모리 주소를 참조하기 때문에 데이터의 무결성을 보장할 수 없습니다.

깊은 복사는 메모리 사용량이 많고 속도가 느리지만, 원본 객체와 복사된 객체가 서로 다른 메모리 주소를 참조하기 때문에 데이터의 무결성을 보장할 수 있습니다.

왜냐하면 깊은 복사와 얕은 복사는 각각의 장단점이 있기 때문입니다.

다음은 깊은 복사와 얕은 복사의 차이를 보여주는 예제입니다:

// 얕은 복사 사용 예제
const originalShallow = { name: 'John', age: 30 };
const copyShallow = { ...originalShallow };

copyShallow.name = 'Jane';
console.log(originalShallow.name); // 'Jane'

// 깊은 복사 사용 예제
const originalDeep = { name: 'John', age: 30, address: { city: 'New York' } };
const copyDeep = JSON.parse(JSON.stringify(originalDeep));

copyDeep.address.city = 'Los Angeles';
console.log(originalDeep.address.city); // 'New York'


깊은 복사와 얕은 복사의 활용 사례

깊은 복사와 얕은 복사는 각각의 장단점이 있기 때문에, 상황에 따라 적절하게 사용해야 합니다. 얕은 복사는 메모리 사용량이 적고 속도가 빠르기 때문에, 객체의 참조를 공유해도 문제가 없는 경우에 사용하면 좋습니다.

깊은 복사는 데이터의 무결성을 유지해야 하는 경우에 사용하면 좋습니다. 예를 들어, 상태 관리 라이브러리인 Redux에서는 상태를 불변 객체로 유지하기 위해 깊은 복사를 사용합니다.

왜냐하면 깊은 복사는 객체의 모든 속성을 재귀적으로 복사하기 때문에, 데이터의 무결성을 유지할 수 있기 때문입니다.

다음은 깊은 복사와 얕은 복사의 활용 사례입니다:

// 얕은 복사 활용 사례
const state = { user: { name: 'John', age: 30 } };
const newState = { ...state, user: { ...state.user, age: 31 } };

console.log(state.user.age); // 30
console.log(newState.user.age); // 31

// 깊은 복사 활용 사례
const stateDeep = { user: { name: 'John', age: 30, address: { city: 'New York' } } };
const newStateDeep = JSON.parse(JSON.stringify(stateDeep));

newStateDeep.user.address.city = 'Los Angeles';
console.log(stateDeep.user.address.city); // 'New York'
console.log(newStateDeep.user.address.city); // 'Los Angeles'


결론

자바스크립트에서 객체를 복사할 때, 깊은 복사와 얕은 복사의 개념을 이해하는 것은 매우 중요합니다. 얕은 복사는 객체의 참조를 복사하는 반면, 깊은 복사는 객체의 모든 속성을 재귀적으로 복사합니다.

얕은 복사는 메모리 사용량이 적고 속도가 빠르지만, 데이터의 무결성을 보장할 수 없습니다. 깊은 복사는 메모리 사용량이 많고 속도가 느리지만, 데이터의 무결성을 보장할 수 있습니다.

왜냐하면 객체 복사는 자바스크립트에서 데이터 처리와 관련된 중요한 개념이기 때문입니다.

이 글에서는 깊은 복사와 얕은 복사의 차이점을 설명하고, 각각의 사용 사례와 주의사항을 다루었습니다. 또한, 자바스크립트에서 깊은 복사를 구현하는 방법을 예제로 소개했습니다.

객체 복사를 올바르게 이해하고 사용하면, 데이터의 무결성을 유지하고 예기치 않은 버그를 방지할 수 있습니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
logo
copyright © F-Lab & Company 2025