IT Language 연습실
template (3) 클래스 ver 본문
지난 글에서는 template 함수를 알아봤다. 템플릿은 클래스로도 작성이 가능하다.
템플릿 함수를 알고 있다면 클래스를 이해하는 과정에서는 크게 어려움이 없을 것이라 믿는다.
다시한번 말하지만 함수 템플릿, 클래스 템플릿은 모두 사용자가 정의한 것이다.
자료형이 없는 함수 그리고 자료형이 없는 클래스를 정의하고 그에 맞는 자료형을 나중 명시하게 될때
컴파일러가 그에 맞는 자료형으로 생성하는 함수와 클래스 그것이 템플릿 함수, 템플릿 클래스이다.
자 그러면 본격적으로 템플릿 클래스에 대해서 알아보도록 하자.
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m) : x(n), y(m) { }
void show() { std::cout<<x<<' '<<y<<std::endl;
};
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
aa.show(); ab.show();
}
위 코드는 이해하는데 있어서 어렵지 않다고 했던 부분이 함수 템플릿과 유사한점이 많기 때문이다.
단순히 차이가 있다면 함수가 아닌 클래스를 만들때 템플릿을 사용했다는 점이다.
그렇다면 클래스 템플릿과 함수 템플릿의 차이를 말해주고 싶은게 있다
예를 들어 함수 템플릿 같은 경우
#include <iostream>
using namespace std;
template <typename T>
T function( T n, T m ) {
return n + m;
}
int main() {
cout<<function<int>(10, 11)<<endl;
cout<<function(20,30)<<endl;
}
위 코드에 메인 부분처럼 <int> 자료형 부분을 명시하지 않아도 넘어가는 인자의 타입에 따라 컴파일러가 알아서
그에 맞는 템플릿 함수를 생성한다고 했었다.
하지만 클래스 템플릿 기반으로 만들어진 템플릿 클래스는 그러하지 않다.
즉, 템플릿 클래스를 생성하기 위해서는 <int> 또는 <A> 같은 자료형을 꼭! 명시해줘야 한다는 얘기이다.
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
이번에는 클래스 템플릿을 정의했고 그 클래스 안에 있는 멤버함수 역시 템플릿으로 작성이 가능하다.
클래스 내에서 멤버함수를 템플릿으로 쓸때 클래스 템플릿을 정의할때 사용한 <typename T> 를 사용하면 된다.
클래스 외에서 멤버함수를 템플릿으로 사용한다면?
즉, 멤버함수를 선언하고 정의한다. 즉, 선언과 정의를 분리한다면? 이라는 말이다.
일단 다음의 코드는 클래스 내에서 사용하는 멤버함수 역시 템플릿으로 사용했던 예시이다.
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m) : x(n), y(m) { }
T show() { return x+y ; }
};
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
std::cout<<aa.show();
}
그럼 클래스 외에서 사용할때는?
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m) : x(n), y(m) { }
T show();
};
template <typename T>
T A<T>::show() { return x+y ; }
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
std::cout<<aa.show();
}
위 코드와 같다. 즉, 저기서 가장 핵심이 되는 부분은
template <typename T>
T A<T>::show() { return x+y ; }
다음과 같다. 보통 클래스 내에서는 멤버함수를 원형으로 선언하고 클래스 외에서 멤버함수를 정의한것을 사용할떄
A :: show() 이렇게 어떤 클래스의 함수인지 범위 명시를 해주었다.
그런데 이것이 만약에 템플릿인 경우에는 어느 클래스의 멤버함수를 템플릿 생성했는가?
즉, A 클래스의 함수인데 int 타입의 멤버함수.
즉, A 클래스의 함수인데 double 타입의 멤버함수.
따라서 자료형에 맞는 해당 클래스의 멤버함수라는 사실을 컴파일러에게 명시해줘야한다.
'C++' 카테고리의 다른 글
스마트 포인터 (Smart Pointer) (0) | 2024.02.22 |
---|---|
template 파일 분할. (0) | 2024.02.22 |
template (2) 함수 ver (0) | 2024.02.21 |
template (1) 함수 ver (0) | 2024.02.21 |
cout, endl, cin의 정체 (0) | 2024.02.17 |