방프리

24.05.04 Chapter5. 동적 프로그래밍 (Item 43) 본문

C#/More Effective C#

24.05.04 Chapter5. 동적 프로그래밍 (Item 43)

방프리 2024. 5. 4. 13:54

Item 43 : 동적 타이핑의 장단점을 이해하라

dynamic 타입은 '런타임에 바인딩되는 System.Object'.라고 볼 수 있다. 따라서 컴파일타임에 dynamic 타입의 변수는 System.Object에 정의된 메서드만 가지고 있다. 런타임 시 객체의 타입을 확인하고, 수행할 메서드가 지원되는지 확인한다. 이 방식을 덕 타이핑이라고 부른다. 이 방식은 특별히 인터페이스를 선언하거나, 커파일타임 타입 연산을 제공할 필요가 없다. 

동적 타이핑은 타입에 대한 대처를 유연하게 할 수 있지만 타입 안정성을 고려하지 않으며 컴파일러가 도와줄 수 있는 범위가 한정적이기에 오류를 런타임에 찾을 수 있다는 단점이 있다.

표현식 트리는 런타임에 코드를 구성하는 방법 중 하나인데 System.Linq.Expression 클래스와 그 파생 클래스를 통해 사용할 수 있다.

public static T AddExpression<T>(T left, T right)
{
    ParameterExpression leftOperand = Expression.Parameter(typeof(T), "left");
    ParameterExpression rightOperand = Expression.Parameter(typeof(T), "right");
    BinaryExpression body = Expression.Add(leftOperand, rightOperand);
    Expression<Func<T, T, T>> adder = 
        Expression.Lambda<Func<T, T, T>>(body, leftOperand, rightOperand);
    Func<T, T, T> theDelegate = addr.Complie();
    return theDelegate(left, right);
}

상황에 따라 표현식과 동적 타이핑 중 선택해야한다. 일반적으로 표현식을 사용하면 런타임 계산이 더 간단하므로 대부분의 환경에서 더 빠르게 수행되지만 동적 호출보다 역동성이 떨어진다.

동적 타이핑과 표현식 구축은 성능에 어느 정도 영향을 준다. 컴파일러가 수행해야 하는 타입 확인 과정을 수행하지 않기에 런타임에 더 많은 작업을 할 수밖에 없다. 대부분의 경우 동적 타이핑을 사용하는 편이 리플렉션이나 늦은 바인딩을 사용하는 것보다 빠르다.

효율적인 프로그래밍을 위해서

첫 번째로 람다 표현식을 사용하는 제네릭 API를 만들어두고, 호출 측에서 동적으로 수행할 코드를 정의할 수 있도록 하고
두 번째로는 표현식을 사용하는 것이다.

Comments