C# List<T> Constructor :
List(Of T) Constructor (IEnumerable(Of T))




 Generic Collection 의 등장으로 참 편하게 코딩하고 있다. MFC 할때는... 허흑;;
List<T> 를 아마 가장 많이 사용하지 않을까 싶다. List<T> 생성자는 3가지가 존재한다.



 매개변수가 없는 생성자와, int 인수를 갖는 생성자는 다들 잘 알고 있을테고.. 인수로 IEnumerable<T> 를 갖는 생성자에 대해 테스트해 보았다.

 IEnumerable<T> 인터페이스를 구현한 컬렉션을 인자로 받는다. 인자로 받은 컬렉션의 요소들을 복사하여 새로운 컬렉션 객체를 만든다. 복사라는 말이나왔다. 과연 Deep Copy 일까 Shallow Copy 일까?

테스트 코드는 다음과 같다.
     internal class Product
    {
        public string Name { get; set; }
        public int Cost { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var product1 = new List<Product>() { new Product() { Name = "P1a", Cost = 1 }, 
                                                           new Product() { Name = "P2a", Cost = 2 }};

            foreach (Product item in product1)            
                Console.WriteLine("{0}, {1}", item.Name, item.Cost);

            Console.WriteLine(Environment.NewLine);
            var product2 = new List<Product>(product1);
            foreach (Product item in product2)
                Console.WriteLine("{0}, {1}", item.Name, item.Cost);

            Console.WriteLine(Environment.NewLine);
            foreach (Product item in product1)
            {
                item.Name = item.Name + "Edit";
                Console.WriteLine("{0}, {1}", item.Name, item.Cost);
            }

            Console.WriteLine(Environment.NewLine);
            foreach (Product item in product2)
                Console.WriteLine("{0}, {1}", item.Name, item.Cost);   
        }
    }


출력 결과



 예제에서 보면은 product1 List 객체를 이용하여 product2를 생성하였다. 완전히 다른 두 객체일 거라 생각을 했지만 product1 의 내부 요소를 수정하니까 product2 의 내부 요소도 변경이 되었다. 즉, product1 과 product2 라는 두개의 객체가 생성 되었지만 내부적인 요소는 같은 참조 객체를 가리키고 있다는 것이다.

 List<T>(Enumerable(T)) 를 사용할 때, 완전히 다른 사본이 생성된게 아님을 주의하며 코딩해야 겠다.
Posted by six605
,