개체 및 컬렉션 이니셜라이저(C# 프로그래밍 가이드)
업데이트: 2007년 11월
개체 이니셜라이저를 사용하면 명시적으로 생성자를 호출하지 않고도 생성 시 개체의 모든 액세스 가능한 필드나 속성에 값을 할당할 수 있습니다. 다음 예제에서는 개체 이니셜라이저에 명명된 형식을 사용하는 방법을 보여 줍니다. Test 클래스의 자동 구현된 속성 사용을 확인합니다. 자세한 내용은 자동으로 구현된 속성(C# 프로그래밍 가이드)을 참조하십시오.
private class Cat
{
// Auto-implemented properties
public int Age { get; set; }
public string Name { get; set; }
}
static void MethodA()
{
// Object initializer
Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}
개체 이니셜라이저에 익명 형식 사용
개체 이니셜라이저는 모든 컨텍스트에서 사용할 수 있지만 특히 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
};