본문 바로가기
프로그래밍언어 & 프레임워크/C#

C# 제네릭(Generic) 클래스 만들기

by 공부하는개미 2021. 6. 12.
반응형

 

 

 

아래 글은 C# 제네릭 클래스 만들기 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 48단원 제네릭 클래스 만들기 642 ~ 661페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 48. 제네릭 클래스 만들기]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

 

https://www.youtube.com/watch?v=iArf2vVafM4 

 

 

 

 

 

✳ 제네릭(Generic)

 

  • 매개변수에 따른 형식
    -> <T>
  • 무언가를 담아 놓을 컨테이너 역할
    - Cup of T
    - Cup<T>

  • 장점
    - 타입 안정
    - 성능
      -> 박싱과 언박싱이 필요 없음



 

✳ 내장된 제네릭(Generic) 리스트 클래스

 

 

내장된 제네릭 클래스만으로도 충분

 

  • System.Collections.Generic 네임스페이스
  • ArrayList<T>
  • List<T>
  • Stack<T>
  • Queue<T>
  • Hashset<T>
  • Dictionary<Tkey, Tvalue>

 

 

 

✳ 제네릭 형식(Generic Types)

 

 

  • 제네릭 형식은 하나 이상의 형식 매개 변수를 설정할 수 있는 형식
  • 형식 매개 변수(Type Parameter)는 넘어오는 형식에 따른 멤버의 형식으 결정됨
  • 형식 매개 변수 T는 클래스 이름 뒤에 꺽쇠 괄호(angle brackets: <>)로 표시 함
  • 아래 코드는 List 클래스를 나타내는데, T는 어떠한 형식에 대한 리스트를 나타내는지를 의미하는 표시

 

 

public class List<T>

 

 

 

 

 

 

 

✳ Action<T>와 Func<T, TResult>

 

 

  • Action<T>
    - 반환값이 없는 경우에 사용자 정의 대리자(custom Delegate)를 정의 하는 대신에 Action 대리자를 사용할 수 있음
  • Func<T, TResult>
    - 반환값이 필요한 경우에는 Func 대리자를 사용할 수 있음
    - 마지막 파라미터는 항상 리턴값을 나타냄

 

 

 

 

✳ Generic Type 제약 조건

 

 

제약조건(constraint) 설명
where T : struct 반드시 값 타입(Value Type)이어야 함
where T : class 반드시 참조 타입(Reference Type)이어야 함
where T : new() 반드시 public 기본 생성자를 가져야 함
where T : <기본 클래스 이름> 지정된 클래스로부터 상속되어야 함
where T : <인터페이스 이름> 지정된 인터페이스를 구현해야만 함
where T : U T 매개변수는 또 다른 U 형식 매개변수를 상속 받아야 함

 

 

 

 

 

✳ 예제코드

// GenericNote.cs 
// 제네릭(Generics): 넘어온 타입(T)에 따라서 타입(T)이 결정됨(매개변수화된 타입)
using System;

namespace 제네릭
{
    class Juice { }
    class Coffee { }

    // Cup of T, Cup<T>
    class Cup<T>
    {
        public T Type { get; set; }
    }

    class 제네릭
    {
        static void Main(string[] args)
        {
            Cup<Juice> juice = new Cup<Juice>();
            juice.Type = new Juice();
            Console.WriteLine(juice.Type); // 제네릭.Juice

            var coffee = new Cup<Coffee> { Type = new Coffee() };
            Console.WriteLine(coffee.Type); // 제네릭.Coffee
        }
    }
}
반응형