Where
제너릭에 제약을 줄 수 있는 키워드.
LINQ를 사용하여 쿼리나 컬렉션을 필터링하는 데 사용된다.
where
절은 데이터 소스에서 특정 조건을 충족하는 요소만 선택하는 데 사용된다.
이는 LINQ를 사용하여 데이터를 쿼리하고 조작하는 데 매우 유용하다.
해당 제너릭 클래스의 조건
where T :
① new() : 디폴트 생성자가 있어야한다.
② AA 클래스를 받아야 한다.
즉, Where를 이용하여, 조건을 설정해준 것이다.
Generic<T>
클래스는 aa라는 T 타입의 변수를 선언하고, 디폴트 값을 설정한다.
Generic<T>
의 생성자에서 aa가 null인 경우, new T()를 사용하여 T의 디폴트 생성자를 호출하여 aa에 인스턴스를 할당하며, 마지막으로 "Generic"을 출력한다.
BB를 제너릭 타입으로 받을 경우에는 오류가 난다.
③ BB 클래스에는 AA와 별개의 클래스이기 때문에 제너릭 타입으로 받을 경우에, 조건에 일치하지 않아 에러가 난다. 디폴트 생성자 또한 존재하지 않는다.
④ AA클래스는 AA클래스 본인이며, 디폴트 생성자가 존재하기 때문에 에러 X
⑤ CC 클래스는 AA클래스를 상속받았기 때문에, 에러 X
①
struct라는 키워드가 있기에, AA를 제너릭으로 받을 수 없다.
벨류타입만을 받을 수 있음.
int형과 같은 structure 타입의 경우에는 사용 가능.
클래스를 넣으려고 하면 위와 같이 에러가 뜨는 것을 확인할 수 있다.
②
반대로 레퍼런스 타입만을 받을 수 있는 키워드 class가 있는 경우에는
벨류 타입 값인 자료형을 제너릭 타입으로 받을 수 없다.
이 경우, 클래스와 같은 레퍼런스 타입의 경우에는 사용 가능.
반대로, 인트형 자료형을 받지 않느 모습을 확인할 수 있다.
①
위와 같이, 요구 조건을 다수 지정하여 사용할 수도 있다.
②
파라미터로 받는 제너릭 타입이 여러 개여도 각 제너릭 마다 여러 개의 조건문 설정이 가능하다.
var instance가 싱글톤의 인스턴스가 됨.
제너릭을 사용할 때, 안정적이고 방어적으로 사용 가능.
new T()로, 제너릭 변수를 반환함 = 싱글턴 인스턴스 반환.
T는 클래스 타입이어야 하고, new() 제약 조건을 추가하여 T는 반드시 디폴트 생성자를 가져야한다.
SingleTon<T>
클래스는 프라이빗 생성자(private SingleTon())를 가지고 있으므로 외부에서 직접 인스턴스를 생성할 수 없다.
정적 변수 instance는 T 타입의 인스턴스를 저장하기 위한 변수이다.
GetInstance() 메서드는 싱글톤 인스턴스를 반환하며, 이 메서드는 정적 메서드이므로 클래스 이름을 통해 호출된다.
첫 호출 시 instance가 null인 경우에만 인스턴스를 생성하고, 그렇지 않은 경우에는 기존에 생성된 인스턴스를 반환한다.
① where 키워드
② 다양한 제약 조건을 동시에 적용 가능
③ where T : struct //널을 허용하지 않는 값 형식
④ where T : class //참조형식(모든 클래스, 인터페이스, 대리자 또는 배열 형식
⑤ where T : new() = 매개변수가 없는 public 생성자가 있어야 한다.
⑥ where T : <base class name>
= 지정된 기본 클래스, 지정된 기본 클래스에 파생클래스
⑦ where T : <interface name>
= 지정된 인터페이스