얕은 복사 깊은 복사

조회수 988회
using System;

namespace CopyingArray
{

    class MainApp
    {
        static void CopyArray<T>(T[] source, T[] target)
        {
            for (int i = 0; i < source.Length; i++)
            {
                target[i] = source[i];
            }
        }

        static void Main(string[] args)
        {
            string a = "hello";
            string b = "GoodBye";
            int[] source = { 1, 2, 3, 4 };
            int[] target = new int[source.Length];

            CopyArray<int>(source, target);

            foreach (int element in target)
                Console.WriteLine(element);
        }
    }
}

배열도 참조형식인데 왜 ref나 out을 쓰지 않고 깊은 복사가 된 건가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 우선 얕은 복사(shallow copy)깊은 복사(deep copy)의 개념을 정확하게 이해하시는게 좋겠습니다.

            static void CopyArray<T>(T[] source, T[] target)
            {
                for (int i = 0; i < source.Length; i++)
                {
                    target[i] = source[i];
                }
            }
    

    올려주신 코드에서 CopyArray method가 source로부터 target에 대한 깊은 복사의 구현입니다.

    얕은 복사는 아래와 같이 구현되었을 때 발생합니다.

                int[] source = { 1, 2, 3, 4 };
                int[] target = source;
    

    추가

    Java Data Type
    ㄴ Primitive Type
        ㄴ Boolean Type(boolean)
        ㄴ Numeric Type
            ㄴ Integral Type
                ㄴ Integer Type(short, int, long)
                ㄴ Floating Point Type(float, double)
            ㄴ Character Type(char)
    ㄴ Reference Type
        ㄴ Class Type
        ㄴ Interface Type
        ㄴ Array Type
        ㄴ Enum Type
        ㄴ etc.
    

    array type은 reference type이기 때문에 call by reference 로 동작합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 제가 약간 질문을 이상하게 했네요.... 깊은 복사 얕은 복사가 아닌 Call by Value를 한 것같은데 왜call by reference 처럼 되었는지가 제가 질문하고자 하는 바였습니다. 이와 관련된 내용을 찾다보니 "앞의 예제에서 참조 형식인 arr 배열은 ref 매개 변수 없이 메서드에 전달됩니다." 라는말이 있는데 맞는 건가요? 알 수 없는 사용자 2019.2.7 17:04
    • 내용 추가 했습니다. 알 수 없는 사용자 2019.2.7 17:25
    • 감사합니다 알 수 없는 사용자 2019.2.7 17:29

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)