C++ 템플릿과 C# 제네릭의 차이

박창훈 (MERHENNE)·2020년 6월 28일
1

CPP_VS_CSharp

목록 보기
1/1

C++과 C#은 둘 다 매개 변수가 있는 형식을 지원하는 기능이 있다. C++에서는 템플릿이라는 이름으로 제공되고 있으며, C#에서는 제네릭이라는 이름으로 제공되고 있다. 하지만, 이 둘은 많은 차이가 있다.

구문 수준

C# 제네릭은 매개 변수가 있는 형식에 대한 더 간단한 접근 방식으로, C++ 템플릿의 복잡함이 없다. 또한, C#은 C++ 템플릿에서 제공하는 기능 중 일부를 제공하지 않는다.

구현 수준

런타임에 C#제너릭 형식 대체가 수행되어 인턴스화된 개체에 대해 제너릭 형식 정보가 유지된다는 점이다.

C# 제네릭

클래스 내부에서 사용할 타입을 클래스 정의 시에 설정하지 않고, 클래스 사용 시에 지정하고 사용하는 것이다. 자세한 설명은 새로운 글로 작성할 것이다.

C#의 제네릭과 Java의 제네릭의 차이점

C#
제네릭을 도입함으로서 컴파일 타임에 에러를 검출할 수 있도록 하고, 불필요한 캐스팅을 하지 않도록 하여 성능면에서도 제네릭을 사용하지 않을 때에 비해 개선되었다.

Java
제네릭을 사용하면 컴파일 타임에 에러를 검출할 수는 있지만, 실제 동작하는 코드는 제네릭을 사용하지 않을 때와 동일하기 떄문에 성능면에서는 개선이 없다.

C++ 템플릿

함수나 클래스를 개별적으로 작성하지 않아도 여러 자료형으로 사용할 수 있도록 만들어 놓은 틀이다. 다른 말로 썼지만, C# 제네릭과 같은 표현이다. 역시나 자세한 설명은 새로운 글로 작성할 것이다.


차이점

C++ 은 컴파일이 1번 일어나고, C# 제네릭은 컴파일이 2번 일어난다.

C++ 템플릿은 사용하지 않으면 컴파일하지 않는다. 하지만, C# 제네릭은 사용하지 않더라도 그에 관련된 정보를 저장하기 위한 메타데이터가 생성된다.

마이크로 소프트에서 보여준 차이점 중, C++ 템플릿에서는 가능하지만 C# 제네릭에서는 불가능한 기능들이 있다.

C#에서는 template C<int i> {} 같은 비형식 템플릿 매개 변수를 허용하지 않는다.

C#은 명시적 특수화 즉, 특정 형식에 대한 템플릿의 사용자 지정 구현을 지원하지 않는다.

C#은 부분 특수화 즉, 형식 인수의 하위 집합에 대한 사용자 지정 구현을 지원하지 않는다.

C#에서는 형식 매개 변수를 제네릭 형식에 대한 기본 클래스로 사용할 수 없다.

C#에서는 형식 매개 변수가 기본 형식을 사용할 수 없다.

C#에서 제네릭 형식 매개 변수 자체는 제네릭이 될 수 없지만 생성된 형식은 제네릭으로 사용할 수 있다. C++에서는 템플릿 매개 변수를 허용한다.

위와 같이 차이가 나는 이유는 첫 번째 이유와 연관이 있다.

C++ 템플릿의 경우, 한 번의 컴파일로 최종 결과물이 나오기 때문에 현재 컴파일하는 시점에 해당 코드가 유효한 지 모두 검증을 할 수 있다.

하지만 제너릭의 경우에는 IL 혹은 ByteCode로 컴파일 되더라도 최종이 아니며, 이를 이용하여 다른 결과물을 만들어 낼 수도 있다. 때문에 해당 제네릭이 어떻게 사용될 지 첫번째 컴파일에서 결정할 수 없다.


참고

  1. 아디봉의.Net
  2. 삼성 소프트웨어 멤버쉽

0개의 댓글