본문 바로가기
C#

C#] 제네릭 제약조건 : where, default 연산자

by Fastlane 2021. 12. 16.
728x90
반응형

1. where

제네릭을 사용하여, 두 값의 크기를 비교하는 함수를 구현한다. 

        public static T Max<T>(T item1, T item2)
        {
            if (item1.CompareTo(item2) > 0) {
                return item1;
            }

            return item2;
        
        }

모든 타입이 CompareTo 메서드를 지원하는 것은 아니다. 

Int32, double 같은 숫자는 IComparable을 구현하여 CompareTo 메서드를 사용할 수 있지만, 

Object는 CompareTo 메서드를 지원하지 않는다. 

 

CompareTo 부분에 에러가 발생!

 

        public static T Max<T>(T item1, T item2) where T : IComparable
        {
            if (item1.CompareTo(item2) > 0) {
                return item1;
            }

            return item2;
        
        }

 

T에 입력된 수 있는 타입의 조건을 where를 사용해 제한할 수 있다. 

T타입은 IComparable을 상속받은 타입이라는 조건을 준다. 

 

            int a = Max<int>(1, 3);

            object a = Max<object>(1, 3);  //에러발생!!

object는 IComparable을 상속받지 않으므로 Max함수를 호출할 수 없다. 

 

제약조건으로 인터페이스나 클래스가 올 수 있고, 아래와 같이 특별한 제약조건을 줄 수 있다. 

 

where T : struct // T는 값 형식만 가능하다. 

where T : class // T는 참조 형식만 가능하다. 

 

2. default

기본값을 반환한다. 

 

default operator

Console.WriteLine(default(int)); // output: 0

Console.WriteLine(default(object) is null); // output: True

 

default literal 

T[] InitializeArray<T>(int length, T initialValue = default)
{
    if (length < 0)
    {
        throw new ArgumentOutOfRangeException(nameof(length), "Array length must be nonnegative.");
    }

    var array = new T[length];
    for (var i = 0; i < length; i++)
    {
        array[i] = initialValue;
    }
    return array;
}


Display(InitializeArray<int>(3));  // output: [ 0, 0, 0 ]
Display(InitializeArray<bool>(4, default));  // output: [ False, False, False, False ]

 

728x90
반응형

댓글