간단한 Generic 관련 질문 드립니다.

안녕하세요. c# 개발중 Generic 관련 질문 드립니다.
현재 dotnet7 버전에서 개발중인 상황인데,

class A<T>{}

// 원래 사용방법
var testA  = A<int>();

// 요구 방법
var testB = A();

위처럼 A 라는 클래스가 있을때, 위 클래스를 선언할때 제내릭 타입을 확정하지않고
컴파일단에서 유츄하게 하려고 하는 중입니다.

찾아본 결과는 6 버전에서는 지연 제내릭(?) 이란 기능으로 가능하다는데,
7 버전은 어떻게 해야할지 잘 감이 안오네요.

검색 키워드 혹 힌트 주시면 감사하겠습니다.

게시글이 모두의 Q&A 게시판과 어울리지 않는듯하여 카테고리를 변경하겠습니다.

1 Like

그런데 말씀하신 기능이 있는지 모르겠으나, 제가 아는 한 제네릭은 런타임에서 이미 확정이되어 돌아가는 정적인 타입으로 알고 있습니다.

하시려는 의도가 어떤 것인지 잘 모르겠습니다.

지연 제네릭이라고 하시는 개념도 보신게 있다면 소개 부탁드립니다.

2 Likes

@Vincent 님 답글 감사합니다. 제네릭은 런타임에서 무조건 정적타입으로 돌아가는군요.
위에 말한 지연 제네릭은 제가 기능에대해 오해하고 언급 한것같습니다.

감사합니다!

1 Like

해당클래스는 Lazy라는 클래스에 제네릭을 적용한 것입니다.
제네릭 타입으로 선언된 클래스를 호출 시점에 인스턴스화 하여 메모리에 로딩하는 방식입니다.
따라서 다른 객체들처럼 프로세스가 시작하자마자 인스턴스화 되고 메모리에 로드되는 것이 아니라,
static 으로 선언된 타입처럼 호출 시에 그제서야 인스턴스화 되고 메모리에 로딩되는 형식입니다.

제네릭의 타입 자체가 지연되어 호출되는 것은 아닙니다.

3 Likes

제네릭을 사용하실 땐 선언과 동시에 T 타입의 파라미터를 선언해야 합니다.

질문 주신 것 처럼 T 타입의 파라미터를 넣지 않고는 사용할 수가 없습니다. :man_facepalming:

컴파일단에서 유추하려고 하시면 T 타입을 in이나 out 등의 키워드로

공변, 반공변 등의 기능을 이용해 다형하게 사용해야 할 겁니다.

저도 이 부분은 누구에게 설명 드릴만큼 알고있지 않아서… 한번 찾아보시면 좋을 것 같네요

IEnumerable이 public interface IEnumerable<out T> 로 선언되어있으므로 이 부분부터

검색을 시작해보시면 도움이 되실 것 같습니다!

1 Like