ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity | 제네릭(Generics)
    다시한번 개발자도전! 2026. 3. 4. 10:05

     

    1. 제네릭(Generics)이란?

    제네릭은 클래스나 메서드에서 사용할 데이터 타입을 미리 정하지 않고, 실제 사용할 때 결정하는 기법임.

    • 핵심 개념: 타입을 매개변수화함.
    • 프로그래밍 원칙: 코드 중복을 피하고, 객체 지향의 OCP(개방-폐쇄 원칙)를 준수하기 위해 사용함.

     

    2. 사용 방법 및 예제

    기본 문법

    보통 대문자 T를 타입 파라미터로 사용함.

     

    ✅ 제네릭 메서드

    유니티에서 특정 컴포넌트가 있는지 확인하고 처리하는 범용 메서드임.

    public class Logger : MonoBehaviour
    {
        // T가 컴포넌트일 때만 동작하도록 제약 조건(where) 추가
        public void LogComponentInfo<T>(GameObject target) where T : Component
        {
            T component = target.GetComponent<T>();
    
            if (component != null)
            {
                Debug.Log($"{typeof(T).Name} 컴포넌트를 찾았습니다.");
            }
            else
            {
                Debug.LogWarning($"{typeof(T).Name}이 대상 객체에 없습니다.");
            }
        }
    }

     

    ✅ 제네릭 클래스 (Data 관리)

    데이터를 담아두는 상자를 만들 때 유용함.

    public class DataContainer<T>
    {
        public T data;
    
        public void PrintData()
        {
            Debug.Log($"현재 데이터: {data}");
        }
    }
    
    // 사용 예시
    DataContainer<int> scoreContainer = new DataContainer<int>();
    scoreContainer.data = 100;
    
    DataContainer<string> nameContainer = new DataContainer<string>();
    nameContainer.data = "Unity Developer";

    3. 제네릭 제약 조건 (Constraints)

    모든 타입을 다 허용하면 오히려 위험할 수 있음. where 키워드를 써서 범위를 제한함.

    제약 조건 의미
    where T : struct T는 반드시 값 타입이어야 함.
    where T : class T는 반드시 참조 타입이어야 함.
    where T : Component T는 유니티 Component 혹은 상속받은 클래스여야 함.
    where T : new() T는 매개변수가 없는 생성자를 가져야 함.

     


    4. 장단점

    장점

    • 타입 안정성: object를 쓸 때처럼 런타임에 InvalidCastException이 발생할 확률이 거의 없음.
    • 성능 향상: 값 타입(int, float 등) 사용 시 **박싱(Boxing)**이 발생하지 않아 메모리 효율이 좋음.
    • 코드 중복 감소: 동일한 로직을 타입별로 여러 번 쓸 필요가 없음.

    단점

    • 학습 곡선: 처음 접하면 문법이 다소 복잡해 보일 수 있음.
    • 코드 비대화(Code Bloat): 컴파일러가 각 타입에 맞는 코드를 생성하므로 실행 파일 크기가 미세하게 커질 수 있음 (일반적으로 무시할 수준).

    5. 주의사항

    ⚠️ Inspector 노출 안 됨

    유니티 인스펙터는 기본적으로 List<T>는 보여주지만, 커스텀 제네릭 클래스(DataContainer<T>)는 보여주지 않음.

    • 해결법: 제네릭 클래스를 상속받는 일반 클래스를 만들고 [Serializable]을 붙임.
    [System.Serializable]
    public class ItemContainer : DataContainer<Item> { } // 이제 인스펙터에 나타남

     

    ⚠️ IL2CPP와 AOT

    iOS 환경(AOT 방식)에서는 런타임에 제네릭 타입을 새로 만드는 것이 제한될 수 있음. 하지만 유니티의 IL2CPP가 대부분의 경우를 알아서 최적화해 주므로 너무 걱정하지 않아도 됨.

Designed by Tistory.