Generics 



일반적으로 클래스를 생성할 경우 각 데이터마다 타입을 지정해준다. 다른 데이터형을 사용하게 될 경우가 있는데, 강제 형변환은 좋지않다고 한다. 그래서~ 제네릭을 사용한다.


제네릭은 박싱/언박싱(형변환)이 일어나지 않도록 타입을 미리 지정하는 방식이다.

클래스,인터페이스, 메서드등에서도 구현 가능하다.


참조 타입 --> 힙 (Heap)

값 타입    --> 스택(Stack)

두 메모리 영역을 왔다갔다는 좋지않음


많이 사용했던 컬렉션들에서 이미 제네릭을 사용하고 있었다.


<출처 :  https://m.blog.naver.com/rocabilly/140133375098 >



Generics에서는 int, float, double같은 데이터 요소 타입을 확정하지 않고 이 데이터 타입 자체를 파라미터로 받아들이도록 클래스를 정의한다. 


형태

class 클래명 <T>

{

T 변수명;

}


public 메소드명 (T 변수명)

{

T 내부 변수명;

}

}


테스트 예제 코드

<결과>

이렇게 다른타입도 제네릭을 통해 원하는 결과를 도출 할 수 있다.




Generics 제약 Where


타입 파라미터가 값형식인지 참조 타입인지, 사용자가 정의한 베이스 클래스로부터 파생된 타입인지, 

어떤 인터페이스를 구현한 타입인지 등등을 지정 할 수 있다. 

제약을 걸어 사용자가 원하지 않는 형식의 매개변수를 넘기는 상황을 방지 할 수 있다.


형태

class 클래스명<T> where T : 제약형식

class 메소드명<T> where T : 제약형식

value(값) 타입

class MyClass<T> where T : struc


Reference(참조) 타입

class MyClass<T> where T  : class


T가 파생 클래스 일때

class MyClass <T> where T : MyBase


인터페이스

class MyClass <T> where T : Myinterface

등등..


2개 이상 제약이 가능함

class 클래스명<T,V> where T : 제약형식1, 제약형식2 where V : 제약형식


where <NAME> : <TYPE> 조건에 대한 제약사항

1) 구조체 및 정적 클래스는 사용할 수 없다.

2) 특수형식(object, Array, Delegate등)은 사용 불가

3) class와 struct조건은 같이 사용 불가




학습한 자료 사이트

http://www.csharpstudy.com/

https://m.blog.naver.com/rocabilly/140133303502

https://slaner.tistory.com/126

감사합니다.

반응형

'프로그래밍언어 > C#' 카테고리의 다른 글

C#) Lamda #2  (0) 2019.02.07
C#) Lamda 람다 식  (0) 2019.02.06
C#) 비트연산자  (0) 2019.01.30
C#) abstract, virtual, override  (0) 2019.01.26
C#) Delegate 콜백메서드,Delegate 체인 #3  (0) 2019.01.25

+ Recent posts