2010년 9월 11일 토요일

List Constructor : List(Of T) Constructor (IEnumerable(Of T))

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)) 를 사용할 때, 완전히 다른 사본이 생성된게 아님을 주의하며 코딩해야 겠다.

댓글 없음:

댓글 쓰기