프로그래밍 언어/C++

12) 템플릿

busy맨 2023. 12. 9. 01:35

1. 클래스 템플릿

1) 템플릿

  • 함수나 클래스를 정의할 때, 특정 데이터 형을 사용하는 대신 범용형을 사용
  • 여러가지 데이터 형에 대해서 함수 정의나 클래스 정의가 가능
  • 장점
    • 함수 코드의 재사용
  • 단점
    • 포팅에 취약
      • 컴파일러에 따라 지원 X
    • 컴파일 오류 메세지 빈약 → 디버깅에 많은 어려움

 

2) 클래스 템플릿의 선언

  • 제너릭 클래스 만들기

 

3) 클래스 템플릿의 인스턴스화

  • 항상 명시적으로 지정
  • 객체를 생성할 때, 템플릿의 파라미터 지정

  • 객체를 생성하지는 않지만, 객체에 대한 포인터나 레퍼런스를 정의하면서 템플릿의 파라미터 지정

 

4) 템플릿의 특징

  • 실제로 사용되기 전까지는 코드가 생성되지 않음
    • 코드 크기를 최소화
    • 미리 코드를 만드는 것이 아니라 컴파일러가 해당 코드를 컴파일 시 클래스의 코드를 생성

 

Ex) 2개의 제너릭 타입을 가진 클래스 만들기

#include <iostream>
using namespace std;

template <class T1, class T2> // 2개의 제네릭 타입 선언
class GClass {
	T1 data1;
	T2 data2;
public:
	GClass();
	void set(T1 a, T2 b);
	void get(T1& a, T2& b);
};

template <class T1, class T2>
GClass<T1, T2>::GClass() {
	data1 = 0; data2 = 0;
}

template <class T1, class T2>
void GClass<T1, T2>::set(T1 a, T2 b) {
	data1 = a; data2 = b;
}

template <class T1, class T2>
void GClass<T1, T2>::get(T1& a, T2& b) {
	a = data1; b = data2;
}

int main() {
	int a;
	double b;
	GClass<int, double> x;
	x.set(2, 0.5);
	x.get(a, b);
	cout << "a=" << a << '\t' << "b=" << b << endl;
	char c;
	float d;
	GClass<char, float> y;
	y.set('m', 12.5);
	y.get(c, d);
	cout << "c=" << c << '\t' << "d=" << d << endl;
}

'프로그래밍 언어 > C++' 카테고리의 다른 글

11) 가상 함수와 추상 클래스  (0) 2023.12.09
10) 상속  (0) 2023.12.09
9) friend와 연산자 중복  (0) 2023.12.08
8) 함수와 참조, 복사생성자  (0) 2023.12.08
7) 여러가지 객체의 생성 방법  (1) 2023.11.03