Shallow Copy는 A가 B에 대입을 하고


A의 값을 바꿨을 때 B의 값도 따라서 변경이 된다.


이 현상은 대입 할 때 A의 값을 그대로 넣는게 아니고


값을 참조하는 것이기 때문이다.


C언어에서 포인터를 배운 사람은 이해가 갈 것이다.



처음 접하는 사람은 이게 무슨 소리인가 하는데


예를 들자면


A의 값이 "한식이, 두식이, 석삼"이 있을 때


각각의 값의 주소가 1번지 2번지 3번지라고 치자


이럴 때 B에게 대입을 하면 "한식이, 두식이, 석삼"을 받는것이 아니고


1번지, 2번지, 3번지를 받아 그 위치에 있는 값을 참조하라는 것이다.


이 문제를 해결하기 위한 방법으로 값을 하나하나 씩 대입하면 된다.


예제를 한번 확인해보자.



<html>
    <head>
        <meta charset="UTF-8">
        <title>배열 통 카피</title>
        <link rel="icon" href="img/favicon.ico">
        <style>
            /*css 주석*/
        </style>
        <!--스크립트를 여기에 넣어도 되지만 페이지가 느려지는 등 원인으로 바디 아래에 넣음-->
    </head>
    <body>
        <!--html 주석-->
    </body>
    <script>
        
        var num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

        function shallowCopy(){
            var copyNum = num;
            console.log("num : " + num);
            console.log("copyNum : " + copyNum);
            num[0] = 50;
            console.log("num : " + num);
            console.log("copyNum : " + copyNum);
        }
        shallowCopy();
        // 위 코드를 동작하면 num을 나중에 바꾸는데 copy엔 값도 안넣었지만
        // copy도 따라서 변경된다. 이 현상을 shallow copy현상이라고 한다.

        function copyArr(){
            var copy = [];
            // 배열간 복사를 위해서는 값을 하나씩 전달 해야 한다.
            for(var i = 0; i < num.length; i++){
                copy[i] = num[i];
            }
            copy[0] = 99;
            console.log("copy : " + copy);
            console.log("num : " + num);
        }

        copyArr();

    </script>
</html>





콘솔의 결과가 다음과 같이 나온다.


두번째의 결과는 하나하나 씩 대입하여 참조 형식으로 들어가지 않았다.


이 현상은 자기도 모르게 아무 생각없이 대입하여 나오는 실수로


값이 예상과 다르게 나온다면 꼭 의심해보고 주의하여야 한다.


+ Recent posts