다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
제네릭을 사용할 때 타입 매개 변수에 대한 제약조건을 사용하여 타입을 제한할 수 있다.
제약조건의 이점
제약 조건을 통해 함수 내에서 특정 인터페이스로 형 변환이 가능한지 확인한 후,
해당 인터페이스의 메서드를 사용하는 경우가 있다.
public static bool AreEqual<T>(T left, T right)
{
if (left == null)
return right == null;
if(left is IComparable<T>)
{
IComparable<T> lval = left as IComparable<T>;
if (right is IComparable<T>)
return lval.CompareTo(right) == 0;
......
}
}
제약 조건을 사용한다면 런타임에 발생할 오류를 컴파일 타임에서 확인할 수 있으며, 코드 또한 짧아진다.
public static bool AreEqual2<T>(T left, T right) where T : IComparable<T>
{
return left.CompareTo(right) == 0;
}
제약조건의 주의점
new(), struct, class를 제약조건으로 설정하는 경우 주의해야한다.
default()의 경우 값 타입에서는 0을 반환하고, 참조타입에서는 null을 반환한다.
new() 제약조건
- 제약 조건은 제네릭 클래스 선언의 형식 인수에 공용 매개 변수가 없는 생성자가 있어야 함을 지정한다.
- 다른 제약조건과 함께 사용될 경우 마지막에 지정해야한다.
결론
타입 매개변수를 지정하여 런타임에 발생할 오류를 줄이고 코드도 단축시킬수 있다.
하지만 과도하게 제약조건을 사용하는 것은 오히려 독이 될 수 있으니 주의하자.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[20] IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.04.26 |
---|---|
[19] 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.04.26 |
[17] 표준 Dispose 패턴을 구현하라 (0) | 2021.04.26 |
[16] 생성자 내에서는 절대로 가상 함수를 호출하지 말라 (0) | 2021.04.26 |
[15] 불필요한 객체를 만들지 말라 (0) | 2021.04.25 |