📦

Deep Clone

Deep Clone - Explanation

어려움 객체 O(n) O(n)

Problem Summary

Write a function that creates a deep clone of an object.

Go to Problem →

Detailed Explanation

이 문제는 **얕은 복사 vs 깊은 복사**의 차이를 이해하고, 재귀를 통한 깊은 복사를 구현합니다. **얕은 복사(Shallow Copy)의 문제** `const copy = {...obj}`는 1단계만 복사합니다: ```javascript const original = { a: 1, b: { c: 2 } }; const shallow = {...original}; shallow.b.c = 99; // original.b.c도 99로 변경됨! ``` **깊은 복사(Deep Copy)가 필요한 이유** 중첩된 객체까지 완전히 새로운 복사본을 만들어 원본과 완전히 독립적으로 만들어야 합니다. **재귀적 접근법** 1. null이거나 객체가 아니면 → 그대로 반환 (기저 조건) 2. 배열이면 → 각 요소를 재귀적으로 복사 3. 객체이면 → 각 속성을 재귀적으로 복사 **{ a: 1, b: { c: 2 } } 처리 과정** 1. 객체이므로 새 객체 생성 2. a: 1 → 원시값이므로 그대로 복사 3. b: { c: 2 } → 객체이므로 재귀 호출 - c: 2 → 원시값이므로 그대로 복사 4. 결과: 완전히 새로운 객체 **JSON 방식의 한계** `JSON.parse(JSON.stringify(obj))`는 간단하지만: - 함수, undefined, Symbol 복사 불가 - Date가 문자열로 변환됨 - 순환 참조 처리 불가

Solution Code

solution.js
function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.map(item => deepClone(item));
  }

  const cloned = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      cloned[key] = deepClone(obj[key]);
    }
  }
  return cloned;
}

Key Concepts from This Problem

1. 깊은 복사 vs 얕은 복사
2. 재귀적 객체 순회
3. typeof 연산자
4. hasOwnProperty 메서드

Common Mistakes

null의 typeof는 "object"이므로 별도 체크가 필요합니다
Array.isArray()로 배열과 일반 객체를 구분해야 합니다
for...in은 상속된 속성도 순회하므로 hasOwnProperty 체크가 필요합니다

Hints

Hint 1: 재귀를 사용하세요.
Hint 2: 배열과 객체를 구분해야 합니다.
Hint 3: 원시 타입은 그대로 반환합니다.

Complexity Analysis

Time Complexity

O(n)

Grows linearly with input size

Space Complexity

O(n)

Uses memory proportional to input size

Related Tags

#객체 #재귀 #깊은복사