승쨩개발공부
[C#] 제네릭(Generic) 본문
재네릭은 자료형을 변수처럼 사용이 가능해진다
사용법은 함수의식별자의 <사용하고싶은 자료형> 을 넣어주면 된다.
재네릭을 사용함으로써 오버로딩된 int와 string을 인자로 받는 함수들을 단축시킬수있음
가변형 자료형으로 바뀌기떄문.
C#에서는 함수를 사용할떄 함수명 뒤에 <>가 붙어있는 함수는 재네릭 함수라고 판단하면된다.
인자를 여러 개 받을수도 있다.
클래스로도 사용이 가능한데 나는 Inven클래스를 여러개(CahsInven,GameInven) 만들고싶지않고
제네릭으로 받은 Gameitem이나 CashItem클래스를 배열로 만들고싶고 객체를 따로 관리하고싶다.
이런식으로 객체를 만들어 재네릭을 유동적으로 사용이가능하다.
제네릭은 C++ 템플릿과 매우 흡사한대
차이가 좀 많다
C# 제네릭은 매개 변수가 있는 형식에 대한 더 간단한 접근 방식으로, C++ 템플릿의 복잡함이 없다. 또한, C#은 C++ 템플릿에서 제공하는 기능 중 일부를 제공하지 않는다.
C++ 은 컴파일이 1번 일어나고, C# 제네릭은 컴파일이 2번 일어난다.
C++ 템플릿은 사용하지 않으면 컴파일하지 않는다. 하지만, C# 제네릭은 사용하지 않더라도 그에 관련된 정보를 저장하기 위한 메타데이터가 생성된다.
마이크로 소프트에서 보여준 차이점 중, C++ 템플릿에서는 가능하지만 C# 제네릭에서는 불가능한 기능들이 있다.
C#에서는 template C<int i> {} 같은 비형식 템플릿 매개 변수를 허용하지 않는다.
C#은 명시적 특수화 즉, 특정 형식에 대한 템플릿의 사용자 지정 구현을 지원하지 않는다.
C#은 부분 특수화 즉, 형식 인수의 하위 집합에 대한 사용자 지정 구현을 지원하지 않는다.
C#에서는 형식 매개 변수를 제네릭 형식에 대한 기본 클래스로 사용할 수 없다.
C#에서는 형식 매개 변수가 기본 형식을 사용할 수 없다.
C#에서 제네릭 형식 매개 변수 자체는 제네릭이 될 수 없지만 생성된 형식은 제네릭으로 사용할 수 있다. C++에서는 템플릿 매개 변수를 허용한다.
위와 같이 차이가 나는 이유는 첫 번째 이유와 연관이 있다.
C++ 템플릿의 경우, 한 번의 컴파일로 최종 결과물이 나오기 때문에 현재 컴파일하는 시점에 해당 코드가 유효한 지 모두 검증을 할 수 있다.
하지만 제너릭의 경우에는 IL 혹은 ByteCode로 컴파일 되더라도 최종이 아니며, 이를 이용하여 다른 결과물을 만들어 낼 수도 있다. 때문에 해당 제네릭이 어떻게 사용될 지 첫번째 컴파일에서 결정할 수 없다.
'C#' 카테고리의 다른 글
[C#] Collection 자료구조 정리 (0) | 2024.05.10 |
---|---|
[c#] 리스트(List) (0) | 2024.04.03 |
[C#] 인터페이스(Interface) (0) | 2024.03.29 |
[C#] 파티알(Partial) (0) | 2024.03.27 |
[C#] C++ C# 헷갈리는 차이 (0) | 2024.03.27 |