본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티37_C#_22_Generic 제네릭

Generic(제네릭)

 

앞 글 마지막 부분에 컬렉션의 단점(boxing, unboxing)에 대해 설명하고 그것을 극복하기 위해 Generic을 만들었다고 했다.

*generic : 포괄적인, 총칭의

 

Generic은 '타입(Type)을 미리 정하지 않고(포괄적인 상태로 해두고), 그것을 사용할 시점에 타입을 정의'하는 것을 말한다.

 

 

12번줄에 클래스를 만들고 int타입의 필드를 만들었다.

7,8번줄에 이 클래스로 객체를 만들고 data필드에 int값을 저장했다.

 

그런데 data에 다시 float타입의 값을 넣어야 한다면 다음과 같이 필드를 추가하거나, 새 클래스를 만들어야 한다.

 

 

위와 같은 상황을 해결할 수 있는 것이 Generic(제네릭)이다.

 

제네릭은 타입을 미리 정하지 않은 상태에서 나중에 타입을 결정한다.

이때 사용하는 것이 Type parameter(타입 매개변수)이며 T 로 표시한다.

 

위 상황을 Generic을 사용하여 작성하면 다음과 같다.

 

 

15번줄에서 클래스명 옆에 <T>를 붙여서 Generic으로 선언한다.

17번줄에서 필드 data의 타입을 정하지 않고 T라는 Generic타입으로 정의한다.

 

7번줄에서 객체를 생성할 때 원하는 타입을 적는다.

 

Generic은 메서드에도 사용할 수 있다.

 

21번 줄에서 GetData메서드를 Generic으로 선언했다.

이 메서드는 필드data값을 반환한다.

9번, 13번 줄에서 GetData메서드를 이용하여 test1, test2에 저장된 값을 출력한다.

 

 

제네릭은 아래 코드와 같이 클래스, 필드, 메서드, 생성자, 프라퍼티에도 사용할 수 있다.

 

23번 줄에서 제네릭 클래스를 선언했다.

25번 줄에서 제네릭 필드를 선언했다.

27번 줄에서 제네릭 생성자를 정의했다.

객체를 생성할 때 제네릭 타입 값(value)을 받아서 필드 data에 저장한다.

 

32번 줄에서 제네릭 메서드를 정의했다.

이 메서드가 호출되면 제네릭 타입의 매개변수(parameter)를 전달받는다.

34,35번 줄에서 필드값과 타입을 출력한다.

타입을 확인하기 위해 typeof 연산자를 사용한다.

typeof 연산자의 대상은 매개변수의 타입이나 타입 이름이며 System.Type 에 있는 타입 이름 자체를 불러온다.

변수, 객체의 타입을 불러올 때는 GetType( ).Name 메서드의 프라퍼티를 사용한다.

36번 줄에서 data필드에 매개변수값을 저장한다.

38번 줄에서 data를 반환한다.

41번 줄에서 private으로 선언한 data에 접근하기 위한 프라퍼티(속성)을 정의했다.

 

위 제네릭 타입이 제대로 작동하는 지 테스트 해보자.

 

7번 줄에서 int 타입의 객체가 만들어진다.

8번 줄에서 메서드가 호출될 때 data타입과 값, 매개변수, 타입과 값을 확인할 수 있다.

9번 줄에서 프라퍼티(속성)을 이용해서 인스턴스에 1을 저장한다.

11,12번 줄에서 변수와 필드 값을 출력한다.

 

14~19번 줄에는 string 타입으로 객체를 만들어서 확인한다.

 

 

유니티로 게임 연습할 때 사용한 GetComponent<Type>( )메서드 역시 이 Generic을 이용한 것이다.

Type 부분에 가져올 컴퍼넌트 타입을 적으면 되는데, 제네릭을 사용하지 않는다면 가져올 컴퍼넌트 마다 각기 다른 메서드를 만들어야 하므로 불편하고 복잡하게 되었을 것이다.

 

Generic Collection(제네릭 컬렉션)

 

앞 글에서 ArrayList와 같은 컬렉션에 데이터를 추가할 때 object타입으로 type cast (타입 변환)하여 저장한다고 했다.

그 결과 boxing, unboxing이라는 캐스팅(casting)으로 인해 데이터 처리 시간이 많이 소비된다고 했다.

 

이 문제를 해결하기 위해 제네릭 컬렉션이 생겼다.

 

컬렉션에서 사용했던 클래스들은 다음과 같은 제네릭 컬렉션으로 대체할 수 있다.

 

ArrayList --- List<T>

Hashtable --- Dictionary<Tkey, TValue>

Queue --- Queue<T>

Stack --- Stack<T>

 

C#을 만든 마이크로소프트의 공식 문서인 MSDN(Microsoft Developer Network)에서도 성능 향상을 위해 앞에서 배운 일반 컬렉션 사용을 권장하지 않고 제네릭 컬렉션 사용을 권장한다.

 

제네릭 컬렉션은 네임스페이스 System.Collections.Generic 에 있기 때문에 사용하기 위해서는 using키워드를 사용해서 호출해야 한다.

 

제네릭 컬렉션을 사용한 예는 다음과 같다.

 

 

끝.

Wraven...