익명 타입(Anonymous Type)이란?
C#에서 어떤 클래스를 사용하기 위해서는 일반적으로 먼저 클래스를 정의한 후 사용한다. 하지만 C# 3.0부터 클래스를 미리 정의하지 않고 사용할 수 있게 하는 익명 타입(Anonymous Type)을 지원하게 되었다.
익명 타입은 new { ... }와 같은 형식을 사용하며, new 블록 안에 속성 = 값 할당을 하고, 각 속성/값은 콤마로 분리한다.
익명 타입은 읽기 전용이므로 속성값을 갱신할 수 없다. C# 키워드 var는 컴파일러가 타입을 추론해서 찾아내도록 할 때 사용되는데, 익명 타입 객체를 변수에 할당할 때는 특별히 타입명이 없으므로 var를 사용한다. 컴파일러는 익명 타입에 대해 내부적으로 임의의 클래스를 생성하여 사용하게 된다.
// 익명 타입 : new { 속성1=값, 속성2=값; }
var t = new { Name="홍길동", Age=20 };
string s = t.Name;
SQL의 임시테이블이라고 생각하면 쉽게 이해할 수 있다. 익숙해지도록 하자!
익명 타입 사용
익명 타입은 공식적으로 클래스를 정의할 필요 없이 Type을 간단히 임시로 만들어 사용할 때 유용하다.
특히 익명 타입은 LINQ를 사용할 때 많이 활용된다.
아래 예제는 LINQ의 Where() 메서드를 이용해 특정 조건의 데이터를 찾은 후, Select() 메서드를 사용하여 일부 칼럼들로만 구성된 새 익명 타입을 만들어서 리턴하는 예를 보여주고 있다.
private void RunTest()
{
var v = new[] {
new { Name="Lee", Age=33, Phone="02-111-1111" },
new { Name="Kim", Age=25, Phone="02-222-2222" },
new { Name="Park", Age=37, Phone="02-333-3333" },
};
// LINQ Select를 이용해 Name과 Age만 갖는 새 익명타입 객체들을 리턴.
var list = v.Where(p => p.Age >= 30).Select(p => new { p.Name, p.Age });
foreach (var a in list)
{
Debug.WriteLine(a.Name + a.Age);
}
}
SelectMany() 메서드의 인자로 익명 타입을 사용한 예
List<Winner> list = new()
{
new Winner() { name = "Boston", years = new [] { 1989, 1999 } },
new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } },
new Winner() { name = "Newyork", years = new [] { 1934, 2021, 2022 } },
};
var years = list.SelectMany(l => l.years, (l, y) => new { name = l.name, years = y}).ToList();
years.ForEach(c => Console.WriteLine(c));
'프로그래밍 > C#' 카테고리의 다른 글
C# where 제네릭 형식 제약(generic type constraint) (6) | 2023.06.28 |
---|---|
Queue vs ConcurrentQueue로 쓰레드 환경에서 테스트 (12) | 2023.06.27 |
C# List에서 HashSet으로 변환하기 (26) | 2023.06.15 |
계속 실행되어야 하는 작업을 위한 BackgroundService in .NET Core (58) | 2023.06.05 |
예제로 복습하는 C# 쓰레드 생성 (27) | 2023.06.01 |
댓글