• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

컬렉션의 값 복사 방법 질문.

22.05.04 14:53 작성 조회수 226

1

안녕하세요. 제가 컬렉션으로 이것저것 해보던중 궁금한 점들이 있어 질문 드립니다.

첫째. List<T>, Linked<T> 객체를 생성할때 생성자에 배열을 넣으면 해당 배열의 값을 복사하여 객체가 생성되던데 이것이 딕셔너리를 제외한 모든 컬렉션에 해당하는 것인가요?

둘째. 제가 List<T> list1을 선언, 초기화 하고 이를 List<T> list2 = new List<T>(list1); 으로 생성자에 넣으니 list2가 list1의 값을 복사한채 선언되었습니다. list1의 값을 수정해도 list2의 값이 변하지 않은것을 보니 재대로 깊은 복사가 된것으로 보이는데 인터넷에서 찾아보니 다른 사람들은 리스트 복사에 ToList, ConvertAll 등의 함수를 사용했었습니다. 정리하면 컬렉션 형식들은 객체 선언시 생성자에 같은 형식의 객체를 인수로 넣는것이 깊은 복사 방법으로 올바른 것인가요? 그렇다면 이 방법이 ToList 등 컬렉션 복사 함수들과 어떤 차이가 있나요? 답변 부탁드립니다.

// 참고 코드
using System;
using System.Collections.Generic;

namespace ServeCs
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1,2,3,4,5 };
            List<int> list1 = new List<int>(array);
            List<int> list2 = new List<int>(list1);

            list1.Insert(0, 10);
            foreach (int i in list2)
                Console.WriteLine(i);
        }
    }
}

답변 1

답변을 작성해보세요.

1


헷갈릴 때는 실제로 f12 타고 가서 설명을 읽어보면 됩니다.
List를 만들 때 생성자에서 array, list를 같이 넣어주면 IEnumerable 인터페이스를 받는 형태가 되고
위의 설명처럼 [복사] 방식으로 데이터를 이전해주는 것을 알 수 있습니다.
그리고 모든 데이터를 넣을 수 있는 공간도 할당된다고 친절하게 설명되어 있네요.

동일한 결과를 아주 다양한 방법으로 만들 수 있으니 뭐가 맞고 뭐가 틀리다고 생각할 필요는 없고
결과가 동일하면 일단 만족하고 넘어가시면 됩니다.
스포를 드리자면 ToList() 사용하는 방식은 LINQ 및 Enumerator과 깊은 연관성이 있는데
그건 고~급 C#을 다룰 때 나중에 찬찬히 살펴보시기 바랍니다.