C#

[C#] 식 트리 (Expression Tree)

Prooni 2024. 10. 11. 15:26

안녕하세요~

오늘은 C# 식 트리 (Expression Tree)에 대해 공부해요!

 

식 트리란 식을 트리로 표현한 자료구조에요.

 

예시로 1 * 2 + (7 - 6) 을 식 트리로 표현하면 아래와 같아요.

 

 

 

식트리 자료구조는 컴파일러나 인터프리터를 제작하는데도 응용된다고 해요!

식트리를 다루는데 필요한 클래스들은

System.Linq.Expressions 네임스페이스 안에 준비되어 있어요.

 

Expression 클래스나 Expression 클래스를 상속받는 클래스는 식트리를 구성하는 노드를 표현해요

Expression 클래스는 Abstract로 선언되어 자신의 인스턴스를 만들 수 없지만, 파생 클래스의 인스턴스를 생성하는

정적 팩토리 메소드를 제공해요.

 

예시 코드 첨부할게요.

class MainApp
{
    static void Main(string[] args)
    {
        //1*2 + x - y
        Expression const1 = Expression.Constant(1);
        Expression const2 = Expression.Constant(2);

        Expression leftExp = Expression.Multiply(const1, const2);
        Expression param1 = Expression.Parameter(typeof(int));
        Expression param2 = Expression.Parameter(typeof(int));

        Expression rightExp = Expression.Subtract(param1, param2);

        Expression exp = Expression.Add(leftExp, rightExp);

        Expression<Func<int, int, int>> expression =
            Expression<Func<int, int, int>>.Lambda<Func<int, int, int>>(
                exp, new ParameterExpression[]
                {
                    (ParameterExpression)param1,
                    (ParameterExpression)param2,
                });

        Func<int, int, int> func = expression.Compile();

        // x = 7, y = 8
        Console.WriteLine($"1*2+({7} - {8}) = {func(7, 8)}");
    }
}

 

위 코드에서 람다식을 이용하면 더 간결하게 식트리를 만들 수 있어요.

하지만 Expression 형식은 Immutable 형식이기 때문에 동적으로 식트리를 만들기는 어려워져요

 

람다식을 사용한 코드를 첨부할게요.

 class MainApp
 {
     static void Main(string[] args)
     {
         Expression<Func<int, int, int>> expression =
             (a, b) => 1 * 2 + (a - b);
         Func<int, int, int> func = expression.Compile();

         //x = 7, y = 8
         Console.WriteLine($"1*2 + {7}- {8} = {func(7, 8)}");
     }
 }

 

 

'C#' 카테고리의 다른 글

[C#] 리플렉션과 애트리뷰트  (1) 2024.10.14
[C#] LINQ  (1) 2024.10.13
[C#] Func, Action  (0) 2024.10.11
[C#] 대리자와 이벤트 (delegate 와 event)  (5) 2024.10.10
[C#] 예외 처리  (1) 2024.10.09