삽질의 현장/- .NET

#051_닷넷(.NET)_.Net Framework 기본 - 제네릭(Generic) 특징

shovelman 2015. 11. 3. 16:35


안녕하세요 삽잡이입니다.


이번 시간에는 지난 시간에 이어서 제네릭에 대해 알아보려고합니다.

특징 위주로 한번 알아볼까요? 고고 (ㅋㅋ)


ICollection 인터페이스는 모든 컬렉션의 기본 인터페이스입니다.

Enum을 제외한 모든 타입은 모두 Generic이 가능하다고 했었지요...


이 제네릭은 크게 5개의 컬렉션을 제공해줍니다.



몇 몇 클래스의 특징을 살펴보겠습니다.

LinkedList 클래스의 경우에는 IList 인터페이스를 상속받지 않기 때문에,

댈괄로 연산자 즉, 인덱서(속성)이 없습니다.

따라서 foreach문을 사용하지 못합니다.


그리고 Dictionary의 경우 hash 기반을 구성된 이 클래스는

기본적으로 키와 값이 한 쌍으로 이루어집니다.

Key 값에는 모든 타입이 올 수 있지요... 

왜냐, 모든 타입의 부모인 object형에는 GetHashCode() 메서드가 있기 때문입니다.


따라서 어떤 타입의 key가 들어오더라도 

동적으로 타입을 보고 결정할 수 있도록 var 타입을 사용해도 됩니다.

Dictionary 클래스의 하나 하나 원소를 표현하는 Key와 Value 타입을 결정하는데

동적으로 가져려고 사용하는 형식이 var 입니다.

이놈들은 우리 눈에 보이지 않는 타입이기 때문에 '익명 타입'이라고도 부릅니다.


자....

이 컬렉션에 대해서 재미있는 예제를 하나 보여드리도록 하겠습니다.



일반적인 컬렉션 클래스에서는 배열이 워낙 많이 사용되기 때문에,

ToArray()라는 메서드를 제공해줍니다.

즉, 리스트를 정적인, 개수가 정해져있는 배열로 변환할 수 있습니다.



이 때, 내가 출력하고자 하는 구조, 로직은 동일하지만,

출력하고자 하는 타입이 그때 그때 다르다면, Client가 결정하도록 <T> 형식을 사용하고

이를 제네릭 메서드로 바꾼다고 할 수 있지요.


우리는 사용자 정의 제네릭 메서드 및 제네렉 멤버를 만들 수 있습니다.

제네릭 메서드를 사용하기 위해서는 <T> 즉, 타입을 명시함으로써 호출해야합니다.

하지만, 형식 매개변수의 유추라고 하여서 

클라이언트가 타입을 결정하지만, 이 형식 매개변수를 생략이 가능하긴 합니다.

C++의 Template Class의 경우 클라이언트가 꼭 타입을 지정해줘야 했었지요.


그리고 제네릭으로 형식이 오게 되었을 때 Type 객체를 얻어와 

해당 형식을 알아낼 수도 있습니다.

Type 객체란 해당 타입에 대해 아주 잘 알고 있는 객체를 말합니다.


우선, 모든 객체는 object를 상속받기 때문에 'GetType()' 메서드를 사용할 수 있습니다.

이를 통해 타입 객체를 반환받을 수 있습니다.

그리고 'typeof(타입 형식)'을 사용하게 되면 타입 객체를 반환 받을 수 있습니다.

마지막으로, Type 클래스에 직접 가서 GetType("타입")을 지정하여 Type 객체를 반환받을 수 있지요.



기본 형식으로 C++에서는 T()을 통해 T형 디폴트 값을 사용했지만,

C#에서는 default(T)를 사용합니다.

이와 같은 default(T) 형식은 값 타입의 경우 0, 참조 타입의 경우 null을 가지게 해줍니다.


재미있는 것은 

C#에서는 class List<T>와 같은 형태로 제네릭 형식에 제약이 가능합니다.

즉, T형에 형식제약을 걸 수 있다는 소리인데 이 때에는 'where' 키워드를 사용합니다.



차례대로, 'T 형식이 무조건 구조체 형식', 

'무조건 참조형식', 

'무조건 기본 생성자 포함', 

'무조건 해당 클래스로부터 상속',

'무조건 해당 인터페이스를 구현'


이처럼 제약 조건을 지정할 수 있다 이겁니다.


그런데, 이렇게 형식 제약에도 순서가 있습니다.

무슨 말이냐 하면, 콜론 뒤에 제약을 명시하는데, 

이 때 필요한 제약들을 나열 할 수 있다 이겁니다.

이 형식 제약에서 기본 생성자 형식 제약은 항상 마지막에 와야하는 규칙이 있습니다.


이와 같이 형식 제약을 통해서 무긍 무진한 응용을 할 수 있게 되지요.

예를 들어서 foreach 문은 

IEnumerable 인터페이스를 구현하지 않은 놈들은 사용할 수 없습니다.

따라서, 기본적으로 해당 인터페이스를 제공해주는지를 제약을 걸어 구현할 수 도 있습니다.




이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!