요즘 고민거리. C++템플릿과 C#제너릭

프로그래밍 뉴비가 간단한 데이터베이스 만들던중에 생긴 고민거리입니다만,

C++에는 템플릿이란 놈이 있죠. 개체의 polymorphism을 위해서 하는 짓입니다.
최근에 C#을 독학하다보니 C#에도 템플릿이랑 비슷한 놈이 있다는 군요. 이름은 제너릭.

그런데 실제로 C++과 C#에서 각각 템플릿 제너릭을 써보니 의외로 차이가 있더라고요.
문제의 핵심은 템플릿으로 받은 매개변수타입 T가 클래스일때 T의 멤버함수를 접근할 수 있느냐입니다.

예를들면 아래와 같은 C++코드를 보면..
#include<stdio.h>


template<class T> class a
{
public:
 a(){}
 ~a(){}

 void data_print()
 {
  data.print();
 }
private:
 T data;
};

class a_1
{
public:
 a_1(){}
 void print(){printf("Testing...\n");}
};

 

int main(void)
{
 a<a_1> a1;
 a1.data_print();
 return 0;
}
예, 간단해서 좋은 코드입니다.
a_1의 멤버함수 print()을 a클래스에서 data.print()로 잘만 쓰고 있습니다.

그다음 아래 C#코드를 보면..
//using 생략.
namespace GenericTest
{
    class a<T>
    {
        public a() { }
        public void data_print(){data.print();}

        private T data;      
    }

    class a_1
    {
        public a_1(){ }
        public void print() { System.Console.Out.Write("Test printing..."); }
    }
    class Program
    {
        static void Main(string[] args)
        {
            a<a_1> abc=new a<a_1>();
            abc.data_print();
        }
    }
}
마찬가지로 간단해서 좋군요. 위에 C++코드를 그대로 구현하려고 노력한 것입니다.

컴파일을 해보면 결과는"아닐세, 자네 질문은 틀린것일세."입니다.
단호하게 컴파일러는 오류메시지를 보내는군요. CS1061: 'T'에  'print'에 대한 정의가 없...(이하생략)
(아직 뉴비라 컴파일러는 MS비쥬얼스튜디오 2008주는대로 쓰고 있습니다.)

제가 잘못알고있는 건지. 아니면 C#에선 원래 안되는건지 잘 모르겠네요.
구글질을 한참 해보았는데 누군가 포럼에 저랑 같은 질문을 하긴 했던데 대답이 없더군요..

혹시나 이글 보시는 분 아시면 좀 도움좀주세요 ;ㅅ;
(이런거 IT밸리에 보내도 될랑가..)

by 학문적클린턴 | 2010/01/13 22:46 | 평소 | 트랙백 | 덧글(4)

트랙백 주소 : http://linton.egloos.com/tb/3536902
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by conaman at 2011/05/28 17:08
where 키워드가 있습니다.
Commented by 양영모 at 2013/03/07 21:21
C++에서의 템플릿은 코딩단계에서 문법을 확인하는 것이 적습니다

가령 제가 T 에 void* 을 넣을 예정이라 합시다.

이 템플릿 클래스는 return -1; 이라는 코드가 있어도 컴파일됩니다.

그러나 T에 void* 을 넣어보면 void* 을 int 로 변환할 수 없다고 오류를 뿜겠지요


그러나 C#은 다릅니다

코딩단계에서 완벽하게 내보내려는 듯

T 끼리 사칙연산조차도 불가능합니다...


즉.
C++에서는 개발자가 알아서 잘 설정해주겠지 하고 해주지만
C# 에서는 코딩단계에서 T에 무엇이 들어와도 되도록 합니다
Commented by 양영모 at 2013/03/07 21:26
전 www.winapi.co.kr 에서
현재 www.soenlab.com 으로 바꾼 winAPI연구 사이트의 관리자이신
김상형님이 쓰신 닷넷 프로그래밍 정복 이라는 책을 참고하시면 좋을것 같습니다

where에 경우 특정 클래스를 상속받았다고 지정할 수 있어서 될 것 같군요
Commented by at 2017/05/25 21:53
본문적인 이야기가 아니긴 한데 조금 잘못 알고 계신거 같아서 말씀드리자면
다형성을 위해 템플릿이 존재하는게 아니죠 다형성은 상속과 버추얼 추상화 이런쪽 야기고
템플릿은 제네릭 프로그래밍을 위한 타입을 벗어나기 위한거죠

c#에서는 아예 제네릭이라고 말하고 있는거고요

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶