템플릿(template)
- C++에서는 함수의 다형성의 원리에 따라 같은 이름을 가졌어도 인수가
다르면 다른 함수를 호출하게 되어있다.
Ex)
ACCESS(int x, int y) { return(x+y); }
ACCESS(long x, long y) { return(x+y); }
ACCESS(float x, float y) { return(x+y); }
사용자가 실매개변수를 어떤 형으로 전달해주는가에 따라서 바인딩되는
함수가 결정되는 것이다. 이런 방법은 상당히 여러가지 낭비를 초래한
다. 이런 경우 템플릿을 이용한다.
ACCESS(T x,T y) { return(x+y); }
T는 상황에 따라서 데이터형까지 결정해주는 틀, 즉 템플릿(template)
이다.. 템플릿에는 함수 템플릿과 클래스 템플릿이 있다.
- 함수 템플릿
- 다음과 같이 선언하면 정의되어진 함수는 템플릿 함수가 된다.
[ 형식 ]
template<템플릿인수1, 템플릿인수2..> 함수의 정의
Ex)
template <class T> void ACCESS(T arg) {...}
- 템플릿 인수 리스트는 인자형을 대신할 변수들을 의미하며 위의 예에
서 class는 단지 템플릿인자임을 나타내는 기호이고 클래스를 나타내
는 것과는 성격이 다르다.
- inline, static, extern등의 키워드들은 함수명 바로앞에 기술한다.
- 템플릿 인수리스트에 선언된 인자들은 최소한 1번 이상 쓰여야 한다.
- 인수 리스트에는 수식, 함수등이 올 수도 있다.
- 템플릿 함수와 일반함수가 중복되었을 경우에는 일반함수가 우선적으
로 호출되어진다.
- 템플릿함수나 일반함수로도 생성될 수 없는 함수가 호출되면 에러가
발생한다. 이러한 경우는 이 때의 함수 프로토타입다음을 선언하여
주면 된다.
template<class T, class T> T ACCESS(T a, T b) { ... }
ACCESS(1, 2.3); // 에러
template<class T, class T> T ACCESS(T x, T y) { ... }
double ACCESS(double, double); // 템플릿 확장
ACCESS(3, 3.14);
// 자동 형변환에 의해 ACCESS(double(3), 3.14)로 인식되어진다.
- 템플릿함수도 다형성이 적용된다.
template<class T> T ACCESS(T,T);
template<class T> T ACCESS(T,T,int);
Ex)
#include <stdio.h>
template<class T> T ACCESS(T x, T y)
{
return(x>y ? x:y);
}
template<class F, class E> F PRM(F x, E y) { return (x + y); }
void main()
{
printf("%d\n", sub(3, 4));
printf("%g\n", sub(5.5, 6.8));
printf("%d\n", func(4, 5.4));
printf("%g\n", func(3.3, 7));
}
- 클래스 템플릿
- 템플릿 함수와 비슷한 내용이다. 클래스 멤버들을 템플릿으로 지정할
수있는 방법이다.
[ 형식 ]
template<템플릿인수1, 템플릿인수2..> 클래스의 정의
Ex)
template<class T>
class ACCESS {
protected:
int x, y;
T z;
public:
ACCESS(int a, int b, T c) {
x = a; y = b; z = c;
}
void OUT(void) {
gotoxy(x,y); cout << z; }
} ;
:
ACCESS<int> var1(5, 5, 10);
ACCESS<char> var2(10, 10, 'A');
ACCESS<float> var3(15, 20, 3.14);
:
- 인수리스트의 인수중에는 사용되지 않은 것이 존재해도 상관없다.
- 위의 보기와 같이 < >사이에 사용자가 사용하고자 하는 자료형을 지
정 해주어야 한다.
- 클래스 템플릿에서도static멤버나 함수의 외부정의를 사용할 수 있다
이러한 경우에는 다음과 같다.
template<class T>
class ACCESS {
static int s;
int x, y;
T z;
};
template<class T> int ACCESS<T>::s=0; // static멤버의 정의
template<class T> ACCESS<T>::ACCESS(int a, int b, T c)
{ x = a; y = b; z = c; }
// 위의 예에서 생성자를 외부정의로 한 것
- C++에서는 함수의 다형성의 원리에 따라 같은 이름을 가졌어도 인수가
다르면 다른 함수를 호출하게 되어있다.
Ex)
ACCESS(int x, int y) { return(x+y); }
ACCESS(long x, long y) { return(x+y); }
ACCESS(float x, float y) { return(x+y); }
사용자가 실매개변수를 어떤 형으로 전달해주는가에 따라서 바인딩되는
함수가 결정되는 것이다. 이런 방법은 상당히 여러가지 낭비를 초래한
다. 이런 경우 템플릿을 이용한다.
ACCESS(T x,T y) { return(x+y); }
T는 상황에 따라서 데이터형까지 결정해주는 틀, 즉 템플릿(template)
이다.. 템플릿에는 함수 템플릿과 클래스 템플릿이 있다.
- 함수 템플릿
- 다음과 같이 선언하면 정의되어진 함수는 템플릿 함수가 된다.
[ 형식 ]
template<템플릿인수1, 템플릿인수2..> 함수의 정의
Ex)
template <class T> void ACCESS(T arg) {...}
- 템플릿 인수 리스트는 인자형을 대신할 변수들을 의미하며 위의 예에
서 class는 단지 템플릿인자임을 나타내는 기호이고 클래스를 나타내
는 것과는 성격이 다르다.
- inline, static, extern등의 키워드들은 함수명 바로앞에 기술한다.
- 템플릿 인수리스트에 선언된 인자들은 최소한 1번 이상 쓰여야 한다.
- 인수 리스트에는 수식, 함수등이 올 수도 있다.
- 템플릿 함수와 일반함수가 중복되었을 경우에는 일반함수가 우선적으
로 호출되어진다.
- 템플릿함수나 일반함수로도 생성될 수 없는 함수가 호출되면 에러가
발생한다. 이러한 경우는 이 때의 함수 프로토타입다음을 선언하여
주면 된다.
template<class T, class T> T ACCESS(T a, T b) { ... }
ACCESS(1, 2.3); // 에러
template<class T, class T> T ACCESS(T x, T y) { ... }
double ACCESS(double, double); // 템플릿 확장
ACCESS(3, 3.14);
// 자동 형변환에 의해 ACCESS(double(3), 3.14)로 인식되어진다.
- 템플릿함수도 다형성이 적용된다.
template<class T> T ACCESS(T,T);
template<class T> T ACCESS(T,T,int);
Ex)
#include <stdio.h>
template<class T> T ACCESS(T x, T y)
{
return(x>y ? x:y);
}
template<class F, class E> F PRM(F x, E y) { return (x + y); }
void main()
{
printf("%d\n", sub(3, 4));
printf("%g\n", sub(5.5, 6.8));
printf("%d\n", func(4, 5.4));
printf("%g\n", func(3.3, 7));
}
- 클래스 템플릿
- 템플릿 함수와 비슷한 내용이다. 클래스 멤버들을 템플릿으로 지정할
수있는 방법이다.
[ 형식 ]
template<템플릿인수1, 템플릿인수2..> 클래스의 정의
Ex)
template<class T>
class ACCESS {
protected:
int x, y;
T z;
public:
ACCESS(int a, int b, T c) {
x = a; y = b; z = c;
}
void OUT(void) {
gotoxy(x,y); cout << z; }
} ;
:
ACCESS<int> var1(5, 5, 10);
ACCESS<char> var2(10, 10, 'A');
ACCESS<float> var3(15, 20, 3.14);
:
- 인수리스트의 인수중에는 사용되지 않은 것이 존재해도 상관없다.
- 위의 보기와 같이 < >사이에 사용자가 사용하고자 하는 자료형을 지
정 해주어야 한다.
- 클래스 템플릿에서도static멤버나 함수의 외부정의를 사용할 수 있다
이러한 경우에는 다음과 같다.
template<class T>
class ACCESS {
static int s;
int x, y;
T z;
};
template<class T> int ACCESS<T>::s=0; // static멤버의 정의
template<class T> ACCESS<T>::ACCESS(int a, int b, T c)
{ x = a; y = b; z = c; }
// 위의 예에서 생성자를 외부정의로 한 것