04
26
다음 본문은 도서 이펙티브 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() 제약조건

 - 제약 조건은 제네릭 클래스 선언의 형식 인수에 공용 매개 변수가 없는 생성자가 있어야 함을 지정한다.

 - 다른 제약조건과 함께 사용될 경우 마지막에 지정해야한다.

 

결론

 타입 매개변수를 지정하여 런타임에 발생할 오류를 줄이고 코드도 단축시킬수 있다.

 하지만 과도하게 제약조건을 사용하는 것은 오히려 독이 될 수 있으니 주의하자.

 

 

 

 

COMMENT