유니티에서 쓸 Tween을 만들고 있는 중이다.
Tween에서 여러가지 클래스를 처리하고 싶어서 Generic class를 활용하기로 하였다.
Generic class가 뭐야? 🧐#
일반적으로 클래스를 정의할 때, 클래스 내의 모든 데이타 타입을 지정해 주게 된다. 하지만 어떤 경우는 클래스의 거의 모든 부분이 동일한데 일부 데이타 타입만이 다른 경우가 있을 수 있다.
이런 경우 C#의 제네릭 타입(Generic Type)을 사용할 수 있는데, 제네릭 타입에서는 int, float, double 같은 데이타 요소 타입을 확정하지 않고 이 데이타 타입 자체를 타입파라미터(Type Parameter)로 받아들이도록 클래스를 정의한다.
(c++ 의 템플릿과 비슷!)
왜 사용하는거야? 🧐#
- 기능이 같은 클래스를 타입만 바꾸어 새롭게 구현할 필요없이 Generic class로 구현하면 여러 타입으로 하나의 클래스를 활용할 수 있다.
- 대표적 예시로
List<T>
가 있다.
어떻게 사용해야해? 🧐#
public class [ClassName]<T>
로 선언.- 여러개의 타입을 사용하고 싶을 때는
<T1, T2 ...>
이런 식으로 나열하면 된다. - 제네릭 타입에 제약을 두고 싶을 경우
where T : [제약조건]
과 같이 마지막에 조건을 붙인다.
⚠️주의⚠️ 만약 제네릭 클래스가 MonoBehaviour
를 상속하고 있을 때, GameObject에 AddComponent
를 바로 할 경우 null
이 된다. 각 제네릭 타입마다 class를 새로 생성 후 가능하다.
⛔ 옳지않은 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
using System;
using UnityEngine;
namespace MyTween
{
public class Tween<T1, T2>: MonoBehaviour
{
private T1 target;
private T2 v_end;
}
public static class TweenManager
{
public static Tween<Transform, Vector3> Move(this Transform tr, Vector3 to, float duration)
{
Tween<Transform, Vector3> tween = tr.gameObject.AddComponent<Tween<Transform, Vector3>>();//null 반환!!
return tween;
}
}
}
|
💚 옳은 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
using UnityEngine;
namespace MyTween
{
public class TweenVector3 : Tween<Transform, Vector3>
{ }
public static class TweenManager
{
public static Tween<Transform, Vector3> Move(this Transform tr, Vector3 to, float duration)
{
TweenVector3 tween = tr.gameObject.AddComponent<TweenVector3>();//성공적인 반환!!
return tween;
}
}
}
|