다음을 통해 공유


개체 및 컬렉션 이니셜라이저(C# 프로그래밍 가이드)

업데이트: 2010년 10월

개체 이니셜라이저를 사용하면 명시적으로 생성자를 호출하지 않고도 생성 시 개체의 모든 액세스 가능한 필드나 속성에 값을 할당할 수 있습니다. 다음 예제에서는 개체 이니셜라이저에 명명된 형식 Cat를 사용하는 방법을 보여 줍니다. Cat 클래스의 자동 구현된 속성 사용을 확인합니다. 자세한 내용은 자동으로 구현된 속성(C# 프로그래밍 가이드)을 참조하십시오.

private class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };

개체 이니셜라이저에 익명 형식 사용

개체 이니셜라이저는 모든 컨텍스트에서 사용할 수 있지만 특히 LINQ 쿼리 식에 유용합니다. 쿼리 식은 익명 형식을 자주 사용합니다. 이 형식은 다음 선언에 표시된 바와 같이 개체 이니셜라이저를 사용하는 경우에만 초기화될 수 있습니다.

var pet = new { Age = 10, Name = "Fluffy" };

무명 형식을 사용하면 LINQ 쿼리 식의 select 절에서 원래 시퀀스의 개체를 값과 모양이 원본과 다를 수 있는 개체로 변환할 수 있습니다. 이 기능은 각 개체의 일부 정보만 시퀀스에 저장하려는 경우에 유용합니다. 다음 예제에서 제품 개체(p)는 많은 필드와 메서드를 포함하며, 제품 이름과 단위 가격이 들어 있는 개체 시퀀스만 만들려 한다고 가정합니다.

var productInfos =
    from p in products
    select new { p.ProductName, p.UnitPrice };

이 쿼리를 실행하면 다음 예제와 같이 foreach에서 액세스할 수 있는 개체 시퀀스가 productInfos 변수에 포함됩니다.

foreach(var p in productInfos){...}

새 익명 형식의 각 개체에는 원래 개체의 속성이나 필드와 동일한 이름을 받는 두 개의 public 속성이 있습니다. 익명 형식을 만들 때 필드 이름을 바꿀 수도 있습니다. 다음 예제에서는 UnitPrice 필드의 이름을 Price로 바꿉니다.

select new {p.ProductName, Price = p.UnitPrice};

개체 이니셜라이저에 nullable 형식 사용

컬렉션 이니셜라이저에 nullable 구조체를 사용하는 것은 컴파일 타임 오류입니다.

컬렉션 이니셜라이저

컬렉션 이니셜라이저를 사용하면 IEnumerable을 구현하는 컬렉션 클래스를 초기화할 때 하나 이상의 요소 이니셜라이저를 지정할 수 있습니다. 요소 이니셜라이저는 단순한 값, 식 또는 개체 이니셜라이저일 수 있습니다. 컬렉션 이니셜라이저를 사용하면 소스 코드에서 클래스의 Add 메서드에 대한 호출을 여러 번 지정할 필요가 없습니다. 컴파일러가 호출을 추가합니다.

다음 예제에서는 두 개의 단순한 컬렉션 이니셜라이저를 보여 줍니다.

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

다음 컬렉션 이니셜라이저는 개체 이니셜라이저를 사용하여 앞의 예제에서 정의된 Cat 클래스의 개체를 초기화합니다. 개별 개체 이니셜라이저는 괄호로 묶이고 쉼표로 구분됩니다.

List<Cat> cats = new List<Cat>
{
    new Cat(){ Name = "Sylvester", Age=8 },
    new Cat(){ Name = "Whiskers", Age=2 },
    new Cat(){ Name = "Sasha", Age=14 }
};

컬렉션의 Add 메서드에서 허용하는 경우 null을 컬렉션 이니셜라이저의 요소로 지정할 수 있습니다.

List<Cat> moreCats = new List<Cat>
{
    new Cat(){ Name = "Furrytail", Age=5 },
    new Cat(){ Name = "Peaches", Age=4 },
    null
};

예제

// The following code consolidates examples from the topic.
class ObjInitializers
{
    private class Cat
    {
        // Auto-implemented properties.
        public int Age { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        Cat cat = new Cat { Age = 10, Name = "Fluffy" };

        List<Cat> cats = new List<Cat>
        {
            new Cat(){ Name = "Sylvester", Age=8 },
            new Cat(){ Name = "Whiskers", Age=2 },
            new Cat(){ Name = "Sasha", Age=14 }
        };

        List<Cat> moreCats = new List<Cat>
        {
            new Cat(){ Name = "Furrytail", Age=5 },
            new Cat(){ Name = "Peaches", Age=4 },
            null
        };

        // Display results.
        System.Console.WriteLine(cat.Name);

        foreach (Cat c in cats)
            System.Console.WriteLine(c.Name);

        foreach (Cat c in moreCats)
            if (c != null)
                System.Console.WriteLine(c.Name);
            else
                System.Console.WriteLine("List element has null value.");
    }
    // Output:
    //Fluffy
    //Sylvester
    //Whiskers
    //Sasha
    //Furrytail
    //Peaches
    //List element has null value.
}

참고 항목

참조

익명 형식(C# 프로그래밍 가이드)

개념

C# 프로그래밍 가이드

LINQ 쿼리 식(C# 프로그래밍 가이드)

변경 기록

날짜

변경 내용

이유

2010년 10월

LINQ 쿼리에 속하지 않는 익명 형식 선언에 대한 예를 추가했습니다. 익명 형식에 대한 자세한 정보가 있는 항목에 링크를 추가했습니다.

고객 의견