서론
프로그래밍을 하다 보면 때로는 코드 자체를 데이터처럼 다뤄야 할 때가 있습니다. 특히 컴파일러나 코드 분석 도구를 개발할 때 이러한 필요성이 두드러집니다. C#은 이를 위해 식 트리(Expression Tree)라는 강력한 기능을 제공합니다.
본론
1. 식 트리(Expression Tree): 코드를 데이터로 다루기
1.1 식 트리의 기본 개념
식 트리는 말 그대로 프로그램의 식(Expression)을 트리 구조로 표현한 자료구조입니다. 예를 들어 a + b * c라는 식이 있다면, 다음과 같은 구조로 표현됩니다:
(+)
/ \\
a (*)
/ \\
b c
Plain Text
복사
이러한 트리 구조는 연산자 우선순위를 명확히 표현하며, 코드의 구조적 분석을 가능하게 합니다.
1.2 System.Linq.Expressions 네임스페이스
C#에서는 System.Linq.Expressions 네임스페이스를 통해 식 트리 기능을 제공합니다. 핵심이 되는 Expression 클래스는 다음과 같은 특징을 가집니다:
using System.Linq.Expressions;
// Expression 클래스를 사용한 식 트리 생성 예시
Expression<Func<int, int, int>> exp = (x, y) => x + y;
// Expression 파생 클래스를 사용한 식 트리 생성 예시
ParameterExpression param1 = Expression.Parameter(typeof(int), "x");
ParameterExpression param2 = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Add(param1, param2);
Expression<Func<int, int, int>> expr =
Expression.Lambda<Func<int, int, int>>(body, param1, param2);
C#
복사
주요 특징:
1.
Expression 클래스는 추상 클래스로, 식 트리의 기본 노드를 표현
2.
다양한 정적 팩토리 메소드를 통해 식 트리 노드 생성 가능
3.
불변(Immutable) 특성을 가져 한번 생성된 후 수정 불가
1.3 식 트리와 람다식의 관계
식 트리는 두 가지 방법으로 생성할 수 있습니다:
1.
람다식을 이용한 방법:
Expression<Func<int, int>> square = x => x * x;
C#
복사
2.
Expression 클래스의 팩토리 메소드를 이용한 방법:
ParameterExpression param = Expression.Parameter(typeof(int), "x");
BinaryExpression operation = Expression.Multiply(param, param);
Expression<Func<int, int>> square = Expression.Lambda<Func<int, int>>(operation, param);
C#
복사
생성된 식 트리는 Compile() 메소드를 통해 실행 가능한 코드로 변환할 수 있습니다:
var compiledFunc = square.Compile();
int result = compiledFunc(5);// 결과: 25
C#
복사
2. 식 트리의 특징과 활용
1.
불변성(Immutability)
•
Expression 객체는 한번 생성되면 변경할 수 없음
•
수정이 필요한 경우 새로운 Expression 객체를 생성해야 함
2.
직렬화 가능
•
식 트리는 데이터 구조이므로 파일 저장이나 네트워크 전송 가능
•
원격 실행이나 지연 실행 시나리오에서 유용
3.
동적 쿼리 생성
•
LINQ to SQL이나 Entity Framework에서 데이터베이스 쿼리 생성에 활용
•
런타임에 조건에 따라 다른 쿼리 생성 가능
결론
식 트리를 학습하면서 C#의 강력한 메타프로그래밍 기능에 감탄했습니다. 특히 컴파일러의 동작 원리를 이해하는 데 큰 도움이 되었고, 동적 코드 생성의 가능성을 보았습니다. 향후에는 이를 실제 프로젝트에서 활용할 수 있는 방안을 탐구해보고자 합니다.
참고 자료
•
박상현, "이것이 C#이다", 한빛미디어, 2023