얕은 복사와 깊은 복사 (Shallow vs Deep Copy)
객체와 배열은 참조 타입(Reference Type)이므로 단순히 =로 할당하면 원본이 같이 변경되는 대참사가 일어납니다. 이를 막기 위한 복제 기술을 알아봅니다.
const original = {
name: "민수",
hobbies: ["독서", "게임"]
};
// ❌ 1. 참조 할당 (위험! 리모컨만 복사됨)
const refCopy = original;
refCopy.name = "철수";
console.log("원본 이름:", original.name); // "철수" (원본도 바뀜!)
// 원래대로 되돌림
original.name = "민수";
// ⚠️ 2. 얕은 복사 (Shallow Copy - 껍데기만 복사)
// 전개 연산자(...)를 사용하면 1단계는 완벽히 복사됩니다.
const shallowCopy = { ...original };
shallowCopy.name = "앨리스";
console.log("얕은 복사 후 원본 이름:", original.name); // "민수" (안 바뀜! 성공!)
// 하지만 내부에 있는 배열(2단계)은 여전히 참조가 연결되어 있습니다.
shallowCopy.hobbies.push("영화");
console.log("원본 취미 목록:", original.hobbies); // ["독서", "게임", "영화"] (원본 배열이 오염됨!)
// ✅ 3. 깊은 복사 (Deep Copy - 완벽한 독립 복제)
// 모던 브라우저와 Node.js 최신 버전에서는 structuredClone()을 사용합니다.
const deepCopy = structuredClone(original);
deepCopy.hobbies.push("코딩");
console.log("깊은 복사 후 원본 취미에 코딩이 있나요?:", original.hobbies.includes("코딩")); // false (원본 완벽 보호!)