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...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티39_C#_24_Exception handling 예외 처리 (0) | 2021.03.25 |
---|---|
유니티38_C#_23_FileStream 파일스트림 (2) | 2021.03.24 |
유니티36_C#_21_Collection 컬렉션 (0) | 2021.03.22 |
유니티35_C#_20_static 스태틱 (0) | 2021.03.22 |
유니티34_C#_19_String 문자열 (0) | 2021.03.20 |