-
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가 대부분의 경우를 알아서 최적화해 주므로 너무 걱정하지 않아도 됨.
'다시한번 개발자도전!' 카테고리의 다른 글
Unity | Is-A 관계 와 Has-A 관계 (0) 2026.03.05 Unity | 람다식(Lambda Expression) (0) 2026.03.03 Unity | 델리게이트를(delegate) 활용한 이벤트(Event System) (0) 2026.02.25 Unity | 델리게이트(Delegate) (0) 2026.02.24 Unity | 유한상태머신(FSM, Finite State Machine)과 상태패턴(State Pattern) (0) 2026.02.23