본문 바로가기
유니티/개념 정리

Generic

by fore4022 2024. 7. 22.

클래스에서 미리 타입을 지정해 놓는 것이 아닌, 사용자가 지정한 타입을 사용하도록 하게 해주는 타입을 일반화 시킨 것을 의미한다.

사용자가 타입을 지정해서 사용할 수 있기 때문에 확장성이 좋고, 여러 상황에 대하여 기능을 만들 수 있다.

where절

  • Generic으로 받는 타입에 주는 제약으로, 제약 조건을 만족하는 타입만 받도록 해준다.
  • Generic을 사용하다 보면, Generic으로 받은 Type에 대한 객체를 생성해 주어야 하는 경우가 생긴다. 하지만, 일반적으로는 제네릭에 대해서 생성자를 사용하지 못한다. 이 때 new() 제약으로, 타입에 생성자가 있는 타입을 받아오게 함으로, 받아온 모든 타입에 new()를 사용할 수 있다는 것을 알 수 있다.
    • 단, new()제약을 만족하려면, 매개변수가 없는 생성자가 있어야 한다.
    private void TestGeneric<T>() where T : UnityEngine.Component, new()
    {
    		
    }
    //제약 조건을 여러개를 입력하기 위해서는 조건마다 ','로 구분해 준다.
    //타입에 new()라는 제약을 두었기에, 타입에 매개변수 없는 생성자가 존재해야 한다.
    

private void Start()
{
		TestGeneric<int>();
    TestGeneric<string>();
    TestGeneric<Vector3>();
}
private void TestGeneric<T>()
{
    List<T> genericList = new List<T>();

    Debug.Log(genericList.GetType());
}
//실행 결과 : 
//						System.Collections.Generic.List`1[System.Int32]
//						System.Collections.Generic.List`1[System.String]
//						System.Collections.Generic.List`1[UnityEngine.Vector3]
private void Start()
{
		TestGeneric<int>();
    TestGeneric<string>();
    TestGeneric<Vector3>();		
}
private void TestGeneric<T>() where T : UnityEngine.Component
{
		
}
//Start에서 호출해 주려는 TestGeneric<T>()은 int, string, Vector3로 유니티엔진의 컴포넌트가 아니기에, 오류가 발생한다.

'유니티 > 개념 정리' 카테고리의 다른 글

직렬화(Serialize)  (0) 2024.07.24
리소스 폴더(Resource Folder)  (0) 2024.07.22
New Input System  (0) 2024.07.19
Indexer  (0) 2024.05.09
대리자  (0) 2024.04.23