본문으로 바로가기

Deepclone 구현하기 (객체와 배열 모두)

category JavaScript 2025. 1. 17. 20:37

오늘 문제 은행을 풀며 그래도 고민하다가 다 풀렸었는데 이 놈의 깊은 복사가 제 발목을 잡았습니다....

* 중첩 객체와 배열을 복사하는 깊은 복사 함수를 작성하세요.
* 재귀를 통해 객체나 배열을 만나면 내부까지 복사해야 합니다.

 

일단 전에 배웠던대로 코드를 먼저 작성해봤습니다.

function deepClone(obj) {
    let result = {};
    if(typeof obj === 'object' && obj !== null){
        for(let prop in obj){
            result[prop] = deepClone(obj[prop]);
        }
    }else{
        result = obj;
    }
    return result;
}

 

일단 객체인지 확인을 하고....

 

이 말도 안되는 오류를 걸러내줍니다.

그런데 여기서 만약 배열이면 let result = []; 로 선언하고 if문에 배열인지 확인하는 코드가 있어야 하지 않나...?  라는 생각이 들었습니다.

 

그런데 여기서 또 충격적인게 객체도 'object'고 배열도 'object'라는 사실....

 

그럼 배열은 뭘 통해 검사할 수 있느냐... 바로 Array.isArray() 메서드입니다

 

Array.isArray() - JavaScript | MDN

Array.isArray() 정적 메서드는 전달된 값이 Array인지 판단합니다.

developer.mozilla.org

배열이면 true 아니면 false를 반환합니다.

function deepClone(obj) {
    if(typeof obj === 'object' && obj !== null){
    	let result = Array.isArray(obj) ? [] : {};
        for(let prop in obj){
            result[prop] = deepClone(obj[prop]);
        }
    }else{
        result = obj;
    }
    return result;
}

 

위에 객체로 한정 지어났던 result를 배열인지 아닌지를 통해서 각각 배열과 객체로 선언해주는 코드로 변경합니다.

그 이후로는 for(let prop in obj)를 통해 배열이면 인덱스값 객체면 키값에 접근하여 새로운 객체 혹은 배열을 복사할 수 있다...!입니다.

 

근데 저 위에 코드로 해도 잘 돌아가길래 튜터님께 질문했더니 테스트코드를 휙휙 보시더니 배열인지 객체인지 확인하는 코드는 없다고 하셨습니다....

 

어쨋든 통과...!

 

그래도 재귀를 통해 객체와 배열을 깊은 복사하는 방법을 다시 한 번 확인할 수 있어서 좋은 기회였습니다!