제네릭 클래스 (Generic class)

2022. 1. 25. 00:00CSharp/Advance

반응형

Generic Class

제네릭 클래스는 특정 데이터 형식과 관련이 없는 작업을 캡슐화한다.

 

일반적으로 기존의 구체적인 클래스로 시작하여 일반성과 편의성의 균형이 맞을 때까지

형식을 하나씩 형식 매개 변수로 변경하여 제네릭 클래스를 만든다.

 

제네릭 클래스의 종류 

class BaseNode { }
class BaseNodeGeneric<T> { }

// concrete type
class NodeConcrete<T> : BaseNode { }

// 폐쇄형 (Base 의 Generic type 에 형식을 지정해서 상속한다.)
class NodeClosed<T> : BaseNodeGeneric<int> { }

// 개방형 (Base 의 Generic type 에 형식을 지정하지 않고 상속한다.)
class NodeOpen<T> : BaseNodeGeneric<T> { }

제네릭이 아닌 구체적인 클래스

  • 폐쇄형 생성 기본 클래스에서는 상속할 수 있다.
  • 개방형 생성 클래스 에서는 상속할 수 없다.
  • 형식 매개 변수에서는 상속할 수 없다.
//No error
//폐쇄형 생성 기본 클래스에서는 상속할 수 있다.
class Node1 : BaseNodeGeneric<int> { }

//Generates an error
//개방형 생성 클래스 에서는 상속할 수 없다.
//class Node2 : BaseNodeGeneric<T> {}

//Generates an error
//형식 매개 변수에서는 상속할 수 없다.
//class Node3 : T {}

이는 런타임에 클라이언트 코드에서 기본 클래스를 인스턴스화할 때 필요한 형식 인수를 제공할 수 없기 때문

 

개방형 생성 형식에서 상속하는 제네릭 클래스에서는 다음 코드와 같이 상속하는 클래스에서 공유하지 않는 모든 기본 클래스 형식 매개 변수에 대해 형식 인수를 제공해야 한다.

class BaseNodeMultiple<T, U> { }

//No error
class Node4<T> : BaseNodeMultiple<T, int> { }

//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }

//Generates an error
// U 형태를 유추할 수 있는 방법이 없다.
//class Node6<T> : BaseNodeMultiple<T, U> {}

개방형 생성 형식에서 상속하는 제네릭 클래스에서는

기본 형식에 대한 제약 조건을 포함하거나

암시하는 제약 조건을 지정해야 한다. 

class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

형식 매개 변수에 대한 제약 조건

제약 조건은 형식 인수에서 갖추고 있어야 하는 기능을 컴파일러에 알린다.

제약 조건이 없으면 형식 인수가 어떤 형식이든 될 수 있다.

 

제약 조건은 where 상황별 키워드를 사용하여 지정된다. 

class GenericClass<타입> where 타입 : 조건정의

제약 조건을 사용하는 이유

 

제약 조건을 선언하면 제약 형식의 작업 및 메서드 호출을 사용할 수 있다. 

또한 타입 에 대한 new instance 를 생성하게 할 수도 있다.

public class Employee
{
    public string Name { get; set; } = string.Empty;
    public int ID { get; set; }
}

public class GenericList<T> where T : Employee, new()
{
    public T GetInstance()
    {
        // new 제약조건으로 인해 T class 의 instance 생성 가능
        T t = new(); 
        // Employee 제약조건으로 인해 Employee 의 Name 으로 접근 가능
        Console.WriteLine(t.Name);
        return t;
    }
}

 

관련영상

https://youtu.be/Bu45PttbyXg

 

 

 

 

 

반응형

'CSharp > Advance' 카테고리의 다른 글

제네릭 대리자 (Generic Delegate)  (0) 2022.01.27
제네릭 메서드 (Generic Method)  (0) 2022.01.26
제네릭 컬렉션 (Generic Collection)  (0) 2022.01.24
Record  (0) 2022.01.21
Lambda advanced  (0) 2022.01.20