C#/프로그래밍 고급

C# 프로그래밍 고급 - 12. 익명 객체

tita 2024. 5. 30. 18:00

C#은 다음과 같은 형식으로 클래스를 만들지 않아도 객체를 생성할 수 있습니다. 

이처럼 클래스 이름 없이 생성하는 객체를 익명 객체라고 부릅니다.

new { <속성 A> = <값>, <속성 B> = <값> };

 

일반적으로 자주 사용하지는 않지만 Linq와 함께 사용할 때 굉장히 큰 효과를 발휘합니다.

 

다음 코드는 Linq의 select 구문에 익명 객체를 활용했습니다. 

클래스를 따로 선언하지 않고도 객체의 배열을 만들고 활용합니다.

static void Main(string[] args)
{
    List<int> input = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    var output = from item in input
                      where item % 2 == 0
                      select new
                      {
                          A = item * 2;
                          B = item * item;
                          C = 100
                      };
                      
    foreach(var item in output)
    {
        Console.WriteLine(item.A);
        Console.WriteLine(item.B);
        Console.WriteLine(item.C);
        Console.WriteLine();
    }
}

/*
[실행 결과]
4
4
100

8
16
100

12
36
100

16
64
100

20
100
100
*/

 

 

<Linq 구문과 클래스 활용>

Linq 구문은 일반적으로 클래스와 함께 자주 사용됩니다. 관련된 예제를 살펴보겠습니다.

 

다음 코드는 제품의 이름과 가격을 나타내는 Product 클래스를 만들고, Product 클래스의 인스턴스로 리스트를 만들었습니다. 그리고 리스트에 Linq를 적용해 가격이 1500원보다 큰 제품을 이름 순서로 정렬해 선택합니다.

class Program
{
    class Product
    {
        public string Name { get; set; }
        public int Price { get; set; }
        
        public override string ToString()
        {
            return Name + " : " + Price + "원";
        }
    }
    
    static void Main(string[] args)
    {
        List<Product> input = new List<Product>();
        {
            new Product() { Name = "고구마", Price = 1500 },
            new Product() { Name = "사과", Price = 2400 },
            new Product() { Name = "바나나", Price = 1000 },
            new Product() { Name = "배", Price = 3000 },
            new Product() { Name = "감자", Price = 0500 },
            new Product() { Name = "토마토", Price = 2000 },
            new Product() { Name = "옥수수", Price = 1500 },
            new Product() { Name = "자두", Price = 500 },
        };
        
        var output = from item in input
                     where item.Price > 1500
                     orderby item.Name ascending
                     select item;
                     
        foreach(var item in output)
        {
            Console.WriteLine(item);
        }
    }
}

/*
[실행 결과]
배 : 3000원
사과 : 2400원
토마토 : 2000원
*/