다음을 통해 공유


식 트리

식 트리는 트리와 유사한 데이터 구조의 코드를 나타낼 수 있습니다. 여기서 각 노드는 식(예: 메서드 호출 또는 x < y 같은 이진 연산)입니다.

LINQ를 사용했다면 Func 형식이 API 집합의 일부인 풍부한 라이브러리 경험이 있는 것입니다. LINQ에 익숙하지 않은 경우 LINQ 자습서람다 식에 대한 문서를 먼저 읽어보는 것이 좋습니다. 식 트리에서는 함수인 인수를 사용하는 보다 풍부한 조작을 제공합니다.

LINQ 쿼리를 만들 때 일반적으로 람다 식을 사용하여 함수 인수를 작성합니다. 일반적인 LINQ 쿼리에서 이러한 함수 인수는 컴파일러가 만드는 대리자로 변환됩니다.

식 트리를 사용하는 코드를 이미 작성했을 수 있습니다. Entity Framework의 LINQ API는 LINQ 쿼리 식 패턴에 대한 인수로 식 트리를 허용합니다. 따라서 Entity Framework는 C#에서 작성된 쿼리를 데이터베이스 엔진에서 실행되는 SQL로 변환할 수 있습니다. 또 다른 예로 널리 사용되는 .NET 모의 프레임워크인 Moq가 있습니다.

보다 풍부한 조작을 원하는 경우 식 트리를 사용해야 합니다. 식 트리는 검사, 수정 또는 실행할 수 있는 구조로 코드를 나타냅니다. 이러한 도구는 런타임에 코드를 조작할 수 있는 강력한 기능을 제공합니다. 실행 중인 알고리즘을 검사하고 새 기능을 삽입하는 코드를 작성합니다. 보다 고급 시나리오에서는 실행 중인 알고리즘을 수정하고 C# 식을 다른 형태로 변환하여 다른 환경에서 실행합니다.

식 트리로 표시되는 코드를 컴파일하고 실행합니다. 식 트리를 빌드하고 실행하면 실행 가능한 코드를 동적으로 수정하고, 다양한 데이터베이스에서 LINQ 쿼리를 실행하고, 동적 쿼리를 만들 수 있습니다. LINQ의 식 트리에 대한 자세한 내용은 식 트리를 사용하여 동적 쿼리 빌드 방법을 참조하세요.

식 트리는 동적 언어와 .NET 간에 상호 운용성을 제공하고 컴파일러 작성기가 MSIL(Microsoft Intermediate Language) 대신 식 트리를 내보낼 수 있도록 DLR(동적 언어 런타임)에서도 사용됩니다. DLR에 대한 자세한 내용은 동적 언어 런타임 개요를 참조하세요.

익명 람다 식을 기준으로 C# 또는 Visual Basic 컴파일러가 식 트리를 자동으로 만들도록 할 수도 있고 System.Linq.Expressions 네임스페이스를 사용하여 식 트리를 수동으로 만들 수도 있습니다.

람다 식을 Expression<TDelegate> 형식 변수에 할당하면 컴파일러가 해당 람다 식을 나타내는 식 트리를 작성하기 위해 코드를 내보냅니다.

C# 컴파일러는 람다 식(한 줄 람다)에서만 식 트리를 생성합니다. 문 람다(혹은 여러 줄 람다)는 구문 분석할 수 없습니다. C#의 람다 식에 대한 자세한 내용은 람다 식을 참조하세요.

다음 코드 예제에서는 C# 컴파일러에서 람다 식 num => num < 5를 나타내는 식 트리를 만드는 방법을 보여 줍니다.

Expression<Func<int, bool>> lambda = num => num < 5;

코드에서 식 트리를 만듭니다. 각 노드를 만들고 노드를 트리 구조에 연결하여 트리를 빌드합니다. 식 트리 작성에 대한 문서에서 식을 만드는 방법을 알아봅니다.

식 트리는 변경할 수 없습니다. 식 트리를 수정하려면 기존 식 트리를 복사한 다음 트리 내의 노드를 바꾸는 방법으로 새 식 트리를 생성해야 합니다. 식 트리 방문자를 사용하면 기존 식 트리를 트래버스 합니다. 자세한 내용은 식 트리 번역에 대한 문서를 참조하세요.

식 트리를 빌드한 후에는 식 트리가 나타내는 코드를 실행합니다.

제한 사항

식 트리로 잘 변환되지 않는 최신 C# 언어 요소가 몇 가지 있습니다. 식 트리에는 await 식이나 async 람다 식이 포함될 수 없습니다. C# 6 및 이후 릴리스에서 추가된 기능 중 상당수는 식 트리에 작성된 그대로 표시되지 않습니다. 대신, 가능한 경우 최신 기능이 식 트리에 해당하는 이전 구문으로 노출됩니다. 다른 구문을 사용할 수 없습니다. 식 트리를 해석하는 코드는 새 언어 기능이 도입될 때 동일하게 작동한다는 의미입니다. 이러한 제한 사항에도 불구하고 식 트리를 사용하면 데이터 구조로 표시되는 코드를 해석하고 수정하는 동적 알고리즘을 만들 수 있습니다. Entity Framework와 같은 풍부한 라이브러리가 수행하는 작업을 수행할 수 있습니다.

식 트리는 새 식 노드 형식을 지원하지 않습니다. 식 트리를 해석하는 모든 라이브러리에서 새 노드 형식을 도입하는 것은 호환성이 손상되는 변경입니다. 다음 목록에는 사용할 수 없는 대부분의 C# 언어 요소가 포함되어 있습니다.