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 |