더북(TheBook)

3.   제약 조건으로 제공하는 new() 형태는 기본 생성자가 반드시 있는 클래스임을 의미합니다. 기본 생성자 없이 매개변수가 있는 생성자를 T에 전달하면 에러가 발생합니다.

> public class CarNew<T> where T : new() { }  //Default 생성자
> public class GoodCar { }
> public class BadCar { public BadCar(string message) { } }
> CarNew<GoodCar> cn = new CarNew<GoodCar>(); //new() 성공
> CarNew<BadCar> bad = new CarNew<BadCar>();
(1,16): error CS0310: 'BadCar' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'CarNew<T>'
(1,33): error CS0310: 'BadCar' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'CarNew<T>'

앞 코드에서 BadCar 클래스는 매개변수가 있는 생성자만 있고, 기본 생성자가 없을 때 CarNew<T>에 전달되면 에러가 발생합니다.

4.   제네릭 제약 조건에 명확하게 특정 클래스 또는 인터페이스를 지정할 때는 해당 형식만 사용할 수 있습니다.

다음 코드의 CarClass<T>는 반드시 GoodCar 클래스를 상속한 클래스만 올 수 있습니다. OfficeCamper 클래스는 GoodCar 클래스에서 파생된 클래스이기에 CarClass<T>에 전달할 수 있습니다. BadCar 클래스를 T에 전달하면 에러가 발생합니다.

> public class GoodCar { } 
> public class CarClass<T> where T : GoodCar { } //GoodCar에서 파생 
> public class OfficeCamper : GoodCar, IKs { } 
> CarClass<OfficeCamper> cc = new CarClass<OfficeCamper>(); 
> CarClass<BadCar> badCar; 
(1,18): error CS0311: The type 'BadCar' cannot be used as type parameter 'T' in the generic type or method 'CarClass<T>'. There is no implicit reference conversion from 'BadCar' to 'GoodCar'.
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.