이번에는 c++의 템플릿에 대해 알아보자~
void printAdd(int a, int b){
cout<<a+b<<"\n";
}
void printAdd(double a, double b){ //함수 오버로딩
cout<<a+b<<"\n";
}
int main(){
printAdd(1,2);
printAdd(1.1, 2.2);
return 0;
}
위와 같은 오버로딩 함수를 다음과 같이 쓸 수 있다.
template<class T> //템플릿 선언
void printAdd(T a, T b){
cout<<a+b<<endl;
}
int main(){
printAdd(1,2);
printAdd(1.1, 2.2);
}
템플릿 선언은 template<class T>
(템플릿 선언 키워드<제네릭 타입 선언 키워드 제네릭 타입 이름>)으로 할 수 있다. 제네릭 타입이란 무엇이든 될 수 있는 자료형을 의미하고, 제네릭 타립 이름은 사용자 마음대로 할 수 있다. 예를 들어 template<class Te>
로 하면 Te로 template 변수를 선언할 수 있는 것이다.
template <class T> //템플릿 함수 선언
T findMax(T a, T b, T c){
if(a>=b && a>=c) return a;
else if(b>a && b>=c) return b;
else return c;
}
int main(){
cout<<findMax<int>(1,5,3)<<endl; //int 자료형 지정
cout<<findMax<double>(3.3, 6.6, 9.9)<<endl; //double 자료형 지정
}
선언된 템플릿 함수를 호출할 때 자료형을 지정해줄 수 있다.
#include <iostream>
using namespace std;
template<class T1, class T2> //제네릭 타입 2개 선언
bool isBigger(T1 a[], T2 b[], int size){
T1 sum1 = 0; T2 sum2 = 0;
for(int i=0;i<size;i++){
sum1+=a[i];
sum2+=b[i];
}
if(sum1>sum2) return true;
else return false;
}
int main(){
int arr[10] ={1,2,3,4,5,6,7,8,9,10};
double darr[10] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0};
if(isBigger<int, double>(arr, darr, 10)) //제네릭 타입 2개 지정
cout<<"arr의 원소의 합이 더 큽니다.";
else
cout<<"darr의 원소의 합이 더 큽니다.";
}
template <class T>
void printAdd(T a, T b){ //템플릿 printAdd 함수
cout<<a+b<<endl;
}
class Point{
public:
int x,y;
Point(int x=0, int y=0):x(x), y(y){}
};
void printAdd(Point a, Point b){ //클래스 Point를 인자로 받는 printAdd 오버로딩
cout<<"x의 합: "<<a.x+b.x<<endl;
cout<<"y의 합: "<<a.y+b.y<<endl;
}
int main(){
Point p1(1,2); Point p2(3,4);
printAdd(p1, p2); //템플릿 함수와오버로딩 함수가 모두 정의되어있을 땐 오버로딩 함수가 호출됨
}
예제 1)
#include <iostream>
using namespace std;
template<class T>
void Swap(T &a, T &b){
T tmp = a;
a=b;
b=tmp;
}
int main(){
char ch1='A', ch2='B';
int i1 = 3, i2 = 4;
cout<<"=====swap 이전=====\n";
cout<<ch1<<' '<<ch2<<endl;
cout<<i1<<' '<<i2<<endl;
cout<<"=====swap 이후=====\n";
Swap<char>(ch1, ch2);
Swap<int>(i1, i2);
cout<<ch1<<' '<<ch2<<endl;
cout<<i1<<' '<<i2<<endl;
}
#include <iostream>
using namespace std;
template<class T>
class myArray{
T arr[100];
int num;
public:
myArray(){num=0;}
void push_back(T n){arr[num++]=n;}
T front(){return arr[0];}
T back(){return arr[num-1];}
bool empty(){
if(num==0) return true;
else return false;
}
int size(){return num;}
};
int main(){
myArray<int> arr;
for(int i=1;i<=5;i++)
arr.push_back(i*10);
cout<<"배열 사이즈: "<<arr.size()<<'\n';
if(!arr.empty()){
cout<<"맨 앞 원소: "<<arr.front()<<'\n';
cout<<"맨 뒤 원소: "<<arr.back()<<'\n';
}
cout<<endl;
}
#include <iostream>
using namespace std;
template<class T1, class T2>
class myData{
private:
T1 e1;
T2 e2;
public:
void setData(T1 a, T2 b) {e1=a; e2=b;}
void getData(T1 &a, T2 &b){a=e1; b=e2;}
};
int main(){
myData<char, int> first;
first.setData('a', 30);
char c;
int i;
first.getData(c, i);
cout<<c<<'\n'<<i;
}