내일배움캠프 61일차 TIL

김정환·2024년 12월 10일
0

키워드

  • 제네릭 활용하기

제네릭

  • 데이터 타입을 일반화 기능
    • 하나의 로직에 다양한 데이터 타입을 넣을 수 있게 해주는 기능

왜 쓰는지?

  • 코드의 재사용성을 높여준다.
    • 하나의 로직을 다양한 값에 대해 쓰고 싶다 -> 변수 사용
    • 하나의 로직에서 다양한 메서드를 추가로 쓰고 싶다 -> 델리게이트 사용
    • 하나의 로직을 다양한 클래스, 인터페이스, 구조체로 쓰고 싶다 -> 제네릭 사용
  • 코드를 짤 때, 추가를 해야하는 상황에서 계속 수정을 해줘야한다면
    코드가 유연하지 않은 것이며, 코드는 확장에 막혀있는 것.
    • 코드는 다양한 상황에서 쓸 수 있도록 할 필요가 있음.
T Create<T>() where T : IndicatorComponent
{
    Type type = typeof(T);
    T obj = Resources.Load<T>(Path.Indicators + type.ToString());
    T inst = Instantiate(obj);

    if(!indicatorPool.ContainsKey(type))
        indicatorPool.Add(type, new List<IndicatorComponent>());

    indicatorPool[type].Add(inst);

    return inst;
}

bool TryGet<T>(out T result) where T : IndicatorComponent
{
    result = null;

    Type type = typeof(T);
    if (!indicatorPool.ContainsKey(type))
        return false;

    foreach (var comp in indicatorPool[type])
    {
        if (comp.IsUnique || !comp.gameObject.activeInHierarchy)
        {
            result = comp as T;
            return true;
        }
    }

    return false;
}

public T Get<T>() where T : IndicatorComponent
{
    if (TryGet<T>(out T indicator))
    {
        return indicator;
    }
    else
    {
        T instance = Create<T>();
        return instance;
    }
}
public void Show<T>(Vector2 coord) where T : IndicatorComponent
{
    Get<T>().Show(coord);
}

이렇게 하면 본래 각각의 인디케이터마다 Show, Get, Create 하던 것을 단 3개로 줄일 수 있다.

형식 제한 조건 where

  • 제네릭 사용한 곳에 where을 붙여서 사용할 수 있는 제네릭을 제한할 수 있다.
public void Show<T>(Vector2 coord) where T : IndicatorComponent
{
    Get<T>().Show(coord);
}
  • show 메서드는 IndicatorComponent 클래스 또는 이를 상속한 클래스만 제네릭을 사용할 수 있다.

쓰는 이유

  • 모든 타입이 예시처럼 Show라는 메서드를 갖고 있지 않을 것이다.
  • 그리고 이 Show, Get, Create 메서드는 Indicator 계열의 클래스만 사용하도록 하고 싶으니
    where을 붙여서 타입의 안정성을 높여주는 것이다.

그 밖의 형식 제한 조건

  • where T : struct
    형식 인수는 null을 허용하지 않는 record struct(을)를 포함하는 값 형식이어야 함.
  • where T : class
    T는 참조 형식이어야 함.
    모든 클래스, 인터페이스, 대리자 또는 배열 형식에도 적용.
    T는 null을 허용하지 않는 참조 형식.
  • where T : class?
    T는 참조 형식이어야 함.
    모든 클래스, 인터페이스, 대리자 또는 배열 형식에도 적용.
    T는 null을 허용하거나 null을 허용하지 않는 참조 형식.
  • where T : notnull
    T는 null이 아닌 형식이어야 함.
  • where T : unmanaged
    T는 null이 아닌 비관리형 형식이어야 함.
    unmanaged 제약 조건은 struct 제약 조건을 나타내며 struct 또는 new() 제약 조건과 결합할 수 없음.
  • where T : new()
    매개변수가 없는 기본 생성자가 있는 타입만 허용.
    다른 제약 조건과 함께 사용되는 경우 new() 제약 조건을 마지막에 지정해야 함.
  • where T :
    T는 지정된 기본 클래스이거나 이 클래스에서 파생된 클래스여야 함.
  • where T :
    T는 지정된 기본 인터페이스이거나 이 인터페이스에서 파생된 유형이여야 함.
  • where T : U
    U는 인터페이스, 추상 클래스 또는 일반 클래스가 될 수 있으며, T는 U에서 상속되어야 함.

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글

관련 채용 정보