재우니의 블로그



C# 2.0 에서 제공하는 Generic 에 대해서 조금이나마 예제가 필요하시는 분들을 위해서 기재해 볼 까 합니다.


List(T) 제네릭은 index 를 이용하여 접근할 수 있기도 하면서 최대한의 수행을 제공하기 위한 최상의 optimize 가 된 강한 type 형인 collection 으로써 보여줍니다.


해당 클래스를 이용하여 loop, filter, sort 그리고 collection 조합 등을 제공하는 메소드가 있습니다.

이와 비슷한 클래스가 c# 1.x 버전에 존재하는 ArrayList 클래스가 있습니다.


이번에 설명할 내용은 조합된 list 내용을 가지고 search, sort, loop 와 같은 공통적인 수식어를 이용하는 것을 보실 수 있습니다. 해당 설명한 내용에서 눈여겨 볼 부분은 Generics List(T) 클래스의 몇가지의 공통적인 operation 입니다.

따라서 이를 콘솔 어플리케이션을 가지고 간단한 샘플을 테스트 할 것입니다.



이제 제네릭인 List(T) 에 저장하기 위해서 Person 이라는 클래스의 collection 을 사용할 것입니다.

아래는 Person 이라는 클래스입니다.


using System;
using System.Collections.Generic;
using System.Text;
 
namespace CommonGenericOperations
{
    public class Person
    {
        public Person()
        {
 
        }
 
        public Person(int id, string first_name, string mid_name, string last_name, short age, char sex)
        {
            this.p_id = id;
            this.first_name = first_name;
            this.mid_name = mid_name;
            this.last_name = last_name;
            this.p_age = age;
            this.p_sex = sex;
        }
 
        private int p_id = -1;
        private string first_name = String.Empty;
        private string mid_name = String.Empty;
        private string last_name = String.Empty;
        private short p_age = 0;
        private char? p_sex = null;
 
 
        public int ID
        {
            get
            {
                return p_id;
            }
            set
            {
                p_id = value;
            }
        }
 
        public string FirstName
        {
            get
            {
                return first_name;
            }
            set
            {
                first_name = value;
            }
 
        }
 
        public string MiddleName
        {
            get
            {
                return mid_name;
            }
            set
            {
                mid_name = value;
            }
        }
 
        public string LastName
        {
            get
            {
                return last_name;
            }
            set
            {
                last_name = value;
            }
        }
 
        public short Age
        {
            get
            {
                return p_age;
            }
            set
            {
                p_age = value;
            }
        }
 
        public char? Sex
        {
            get
            {
                return p_sex;
            }
            set
            {
                p_sex = value;
            }
        }
    }  
}

 


c# 3.0 에는 아래와 같이 약어로 구현할 수 있습니다. 이는 ‘Automatic properties’    라는 새로운 기능으로 이를 아래와 같이 기술할 수 있습니다.


public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public int Age { get; set; }

public char Sex { get; set; }



이제 해당 Person 클래스를 이용하여 List 제네릭에 값을 할당하겠습니다.


static void Main(string[] args)
        {
            List<Person> pList = new List<Person>();
            pList.Add(new Person(1, "John""""Shields", 29, 'M'));
            pList.Add(new Person(2, "Mary""Matthew""Jacobs", 35, 'F'));
            pList.Add(new Person(3, "Amber""Carl""Agar", 25, 'M'));
            pList.Add(new Person(4, "Kathy""""Berry", 21, 'F'));
            pList.Add(new Person(5, "Lena""Ashco""Bilton", 33, 'F'));
            pList.Add(new Person(6, "Susanne""""Buck", 45, 'F'));
            pList.Add(new Person(7, "Jim""""Brown", 38, 'M'));
            pList.Add(new Person(8, "Jane""G""Hooks", 32, 'F'));
            pList.Add(new Person(9, "Robert""""", 31, 'M'));
            pList.Add(new Person(10, "Cindy""Preston""Fox", 25, 'F'));
            pList.Add(new Person(11, "Gina""""Austin", 27, 'F'));
            pList.Add(new Person(12, "Joel""David""Benson", 33, 'M'));
            pList.Add(new Person(13, "George""R""Douglas", 55, 'M'));
            pList.Add(new Person(14, "Richard""""Banks", 22, 'M'));
            pList.Add(new Person(15, "Mary""C""Shaw", 39, 'F'));

        }


List 제네릭에는 많은 메소드를 제공하며,  Add 함수를 이용하여 해당 클래스를 원하는 만큼 Collection 처럼 추가할 수 있습니다.


이제 위에 할당한 값을 출력하기 위해서 콘솔창에 출력하는 메소드를 구현하겠습니다.


static void PrintOnConsole(List<Person> pList, string info)
        {
            Console.WriteLine(info);
            Console.WriteLine("\n{0,2} {1,7}    {2,8}      {3,8}      {4,2} {5,3}",
                "ID""FName""MName""LName""Age""Sex");           
            pList.ForEach(delegate(Person per)
            {
                Console.WriteLine("{0,2} {1,7}    {2,8}      {3,8}      {4,2} {5,3}",
                    per.ID, per.FirstName, per.MiddleName, per.LastName, per.Age, per.Sex);
            });
 
            Console.ReadLine();
 

        }



info 매개변수 값은 간단한 코맨트용으로써 사용되는 용도이며, List<Person> 제네릭 값을 출력하는 것은 foreach 구문과 delegate 로 콘솔창에 loop 를 이용하여 Console.WriteLine 명령어로 출력을 하게끔 하는 메소드입니다.



이제 출력을 하도록 구현해 볼까요?


PrintOnConsole(pList, "1. --- Looping through all items in the List<T> ---");





참고로 vb.net 은 2.0 버전에 anonymous methods 을 제공하지 않기 때문에 위와 같은 구문을 사용할 수 없습니다.


이를 이용하여, sql 의 where 조건처럼 조건에 맞게 내용을 출력하는 방법을 알아볼까 합니다.


List<Person> filterOne = pList.FindAll(delegate(Person p) { return p.Age > 35; });

PrintOnConsole(filterOne, "2. --- Filtering List<T> on single condition (Age > 35) ---");


Age 라는 속성에 35 라는 숫자보다 큰 값을 반환하도록 FindAll 메소드를 이용하여 조건에 맞게 새로운 list 제네릭 변수인 fileterOne 에 담아서 출력합니다.






다른 속성을 이용해서 위와 같은 조건에 맞게 값을 얻을 수 있습니다.





감사합니다. 



posted by 심재운 (shimpark@gmail.com)