
빌 와그너, ⌜More Effective C# 2판⌟, 김완섭 옮김, 한빛미디어, 2019
이 포스팅은 ⌜More Effective C# 2판⌟의 내용을 기반으로 작성되었습니다.
dynamic 객체는 모든것을 동적으로 만들어 버린다.
작업의 대상이 되는 매개변수 중 하나라도 dynamic이라면 그 결과도 dynamic이 되고, 메서드가 동적 객체를 반환하면 그 객체를 사용하는 모든 것이 동적 개체가 된다.
→ 타입 안전성을 보장할 수 없게 된다.
C#은 기본적으로 정적 타입 언어이면서 일부 동적 타이핑을 지원하기 때문에, 대부분은 정적 타이핑으로 개발하고 동적 기능을 활용하는 범위를 최소화 해야 한다.
프로그램에서 동적인 기능을 사용하더라도 public 인터페이스에서는 가능한 제외해야 한다.
동적 타이핑을 하나의 객체나 특정 타입 내부로 묶어, 동적 타이핑이 프로그램의 다른부분으로 까지 감염되는 것을 막을 수 있다.
동적 언어로 생성한 동적 객체를 사용할때는 C# 객체로 래핑하는 것이 좋다.
다른 객체들은 이 타입이 내부적으로 동적 객체를 사용하고 있는지 조차 모르게된다.
dynamic answer = Add(5, 5);
Console.WriteLine(answer);
이 코드를 보면 동적 객체가 오픈되어 있으므로 아래와 같이 C# 객체로 래핑하여 동적 객체를 사용하는 것을 감쌀수있다.
private static dynamic DynamicAdd(dynamic left, dynamic right) => left + right;
// 래핑 메서드
public static T1 Add<T1, T2>(T1 left, T2 right)
{
dynamic result = DynamicAdd(left, right);
return (T1)result;
}
// 결과 타입을 다루기 위한 오버로드 메서드
public static TResult Add<T1, T2, TResult>(T1 left, T2 right)
{
dynamic result = DynamicAdd(left, right);
return (TResult)result;
}
C#은 정적 언어이기 때문에 동적 프로그래밍을 사용할 때 유의해야 한다.
동적 프로그래밍은 유용하지만, 정말 필요한곳, 동적 객체를 다른 정적 타입의 객체로 즉각 변환할 수 있는 곳으로 제한해서 사용해야 한다.
다른 환경에서 만들어진 동적 타입을 다룬다면, 해당 동적 객체를 다른 정적 타입으로 래핑하여, 공개 인터페이스에서는 정적 타입을 사용하도록 만들어야 한다.