[C#] where 키워드 (Generic 제한)

Learning 

When: 1학년 8월 20일

 

How:

Notify Value를 공부하다 Generic 형식이 나왔는데, 그냥 Generic 타입을 쓰면 모든 타입을 전부 사용할 수 있는데, 모든 타입을 넣을 수 있다는 것은 기능 하나만 잘못 추가해도 에러가 나기 때문에 사용할 수 있는 타입을 제한하고 싶었습니다. 예전에 Generic 형식도 제한할 수 있다는 것을 '이것이 C#이다' 라는 책에 봤기 때문에 검색하여 where 키워드에 대해 공부하게 되었습니다.

 

Understanding:

  • 정의 : <T> 이런 제네릭 형식은 그 어떤 타입도 들어갈 수 있다는 뜻입니다. int, string, 클래스, 구조체, 인터페이스까지
    가능합니다. 하지만 전에 만든 Notify Value 같은 제네릭 타입 변수는 모든 타입을 지원하기는 하지만 편의를 위해
    더하고 빼는 기능을 추가한다고 하면 bool 같은 타입은 넣었을 때 컴파일 에러가 나진 않지만 코드가 실행될 때 런타임
    에러가 날 것입니다. 그럴 때 지원되는 타입을 제한시키면 애초에 넣지도 못하기 때문에 where 키워드를 사용하여 Generic 값에 넣을 수 있는 타입을 제한시킬 수 있습니다. 
  • 사용법 : 아래의 코드처럼 <T> 뒤에 where 키워드를 쓰고, 제한시킬 Generic(여기선 T), : 뒤에 무엇을 넣는지에 따라 참조 형식만 가능, 값 형식만 가능 같이 값에 걸 수 있는 제한이 달라집니다.
public class NotifyValue<T> where T : class
{
    private T value;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 제한 종류 : 제한은 꼭 where T : class, struct, notnull 이렇게 중첩해서 할 수 있습니다.
조건 이름 조건
: class 클래스만은 아니고, 참조 형식만 가능합니다. (인터페이스, 클래스, 델리게이트, 배열 다 가능)
: struct 값 형식만 가능합니다. (int, bool, float, struct 등. nullable(int? 같은 것)은 불가능)
: new() 매개 변수가 없는 생성자를 가진 타입만 가능합니다. 제한을 여러개 둘 수 있는데, 제한이 여러개일 경우 가장 마지막에 선언해야합니다.
: 클래스 이름 / 인터페이스 이름 특정 클래스/인터페이스를 상속/구현했거나, 자신일 때 가능합니다.
: notnull null이 허용되지 않는 타입만 가능합니다. 모든 값 형식은 가능하고 nullable이 아닌(직접 만든 클래스, 인터페이스 등)은 가능합니다. (int? 같은 것 불가능)

 

Result: 다양한 Generic 제한이 있는데, 제대로 쓴다면 제네릭 타입을 훨씬 더 안전하게 쓸 수도 있고 가독성도 높일 수 있으니 확실하게 용도가 정해진 Generic 형식은 제한을 쓰는 것이 좋을 것 같습니다.

'C#' 카테고리의 다른 글

[C#] 식 본문 멤버  (0) 2025.08.23
[C#] 인덱서(Indexer)  (0) 2025.08.22
[C#] Notify Value  (0) 2025.08.19
[C#] StringBuilder  (1) 2025.08.12
[C#] 가비지 컬렉터 (GC)  (4) 2025.08.11