Search

이것이 C#이다: 14장 - 람다식 (2/2)

서론

프로그래밍을 하다 보면 때로는 코드 자체를 데이터처럼 다뤄야 할 때가 있습니다. 특히 컴파일러나 코드 분석 도구를 개발할 때 이러한 필요성이 두드러집니다. 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