이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

제네릭은 매개변수의 타입을 유연하게 정해줄 수 있는 기능이다.

매개변수의 타입을 실행시점에 결정할 수 있어 좀 더 일반적이고(generic) 유연한 프로그래밍을 가능하게 한다.


우리는 이미 GetComponent<>();라는 제네릭 메소드를 사용해본 경험이 있다

<>안에는 다양한 종류의 자료형이 올 수 있다. 바로 이것이 제네릭의 강점이다. 정확한 자료형을 모르더라도

특정 조건을 만족하는, 또는 모든 종류의 자료형을 매개변수로 사용할 수 있다.


그렇다면 제네릭 메소드를 선언하는 방법에 대해 알아보자

---------------------------------------------------------------------------------------------------------------------------------------------------------------

24b0d121e09c28a8699fe8b115ef046541a3fd

기본적으로 자료형이 올 수 있는 곳에는 T라는 문자를 집어넣어줄수있다.

T는 제네릭 매개변수를 의미하는 문자이며 굳이 T가 아니더라도 A,B,C,D,E같은 문자를 사용해도 된다.

하지만 T를 사용하는게 불문율처럼 여겨지곤한다. 다양한 제네릭 매개변수를 사용하고 싶다면 T, U, V등을 사용한다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

큰 차이점으로는 메소드이름뒤에 <T>라는 부분이다. 이점이 바로 제네릭인지 아닌지를 가르는 중요한 포인트이다.

제네릭 메소드, 제네릭 클래스, 제네릭 인터페이스 등 모두 뒤에 <T>가 붙는다. 즉 <T>를 붙여주면 해당 메소드, 클래스, 인터페이스 등은 

제네릭으로 선언되었다는 뜻이다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

제네릭의 강점은 어떤 타입의 매개변수든 받을 수 있다는 점이다.

하지만 이 강점이 오히려 메소드, 클래스, 인터페이스 등의 기능을 제약하는 족쇄가 되기도 한다.

제네릭 메소드를 예로 들어보자

24b0d121e09c28a8699fe8b115ef0464d18ee3

우리는 int, float, string등의 자료형의 덧셈연산을 위한 기능을 만들고싶다.

다양한 자료형을 받기위해 제네릭 메소드를 선언했지만 어쩐일인지 오류가 발생했다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

제네릭은 말 그대로 모든 자료형을 받을 수 있는 형태이다

그렇기 때문에 저 a,b매개변수에는 int도 float도 string도 struct도 class도 올 수 있다는 뜻이다.

그리고 struct와 class는 +연산을 할 수 없기 때문에 오류가 발생했다.

말그대로 모든 자료형을 받을 수 있는 유연함 때문에, 모든 자료형을 커버할 수 있는 연산이나 동작이 아니면 실행할 수 없게된 것이다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

이런 치명적인 문제를 해결하기 위해 우리는 T에게 제약조건을 걸 수 있다.

T에 어떤 자료형이 올지 제약을 걸어, T의 범주를 예상가능하다면

우리는 그 T로 어떤 연산을 할지도 예상가능하다.


제약 조건은 매개변수 이후 where T : ~~를 통해 설정할 수 있다.

24b0d121e09c28a8699fe8b115ef0464d58de7


대표적인 제약조건은 다음과 같다


1. where T : struct

T를 값타입으로 제한한다.


2. where T : class

T를 참조 타입으로 제한한다.


3. where T : new();

T는 매개변수가 없는 생성자를 가져야 한다.


4. where T : SomeClassName

T는 특정 클래스거나 특정 클래스를 상속받아야한다.


5. where T : Interface

T는 특정 인터페이스를 구현한 타입이어야 한다.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
제네릭의 가장 일반적인 용도는 List와 Dictionary같은 컬렉션이다.
List를 생성할때 <>사이에 int를 넣으면 int형 변수로 이루어진 List를 생성할 수 있다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------

틀린 내용이나 부적절한 예시가 있다면 댓글로 알려주세요.