일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 알버트
- 직장인자기계발
- SKT
- 패캠챌린지
- 패스트캠퍼스후기
- 직장인인강
- 패스트캠퍼스
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- albert
- AI
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- R
- Today
- Total
제주 탈출 일지
템플릿 (함수, 클래스) 본문
함수 템플릿은 함수의 다형성을 위해서 존재하는 것이라고 한다. 한번 써보니 너무 편했다,,.,.
간단하게 예시를 한번 작성해보았다.
template <typename T>
void sum(T a, T b)
{
T x = a + b;
cout << "결과는 "<< x << " 입니다.";
}
int main()
{
int x = 5, y = 3;
sum(x, y);
return 0;
}
sum이라는 함수에 인자들이 어떤 것이 들어가도 모두 작동할 수 있도록 하기 위해서는 각 인자마다 다양한 오버로딩을 제공해야한다. 하지만 함수 템플릿을 사용하면 이 오버로딩이 훨씬 편해진다!!! 예시에서 나는 int형으로 타입을 지정하지 않았지만 잘 동작하는 것을 확인할 수 있었다.
template <typename 사용되는 인자명1, 인자명2> 이러한 형식으로 선언하고 함수를 작성해나가면 된다. 위에서 나는 T라는 인자를 typename에 작성했는데, 편의상 사용될 함수를 사용자가 보기 편한 식별자로 정하면 될 것 같다.
인자를 각각 다르게 해서 간단한 형변환 연산도 되는가 확인해 봤는데, 아마 우리가 된다고 생각하는 것은 다 될거같다.
또 일부 형의 경우만 특별하게 다르게 동작해야 하는 경우가 생긴다. 그럴때는 명시적 특수화를 통해서 해당 기능을 구현한다.
template <typename T>
void sum(T a, T b);
에서, float형의 경우는 연산하지 않아야 할 필요가 있다고 가정한다.
template <> void sum<double>(double&, double&) { ... }; 라고 구현할 경우, double 타입 인자는 따로 구현된 함수 템플릿에서 동작하게 된다.
template <> 함수 타입 함수이름 <특정 타입> (함수 인자...) { .... }로 위의 함수 템플릿 원형 아래에 선언하면 된다.
클래스 템플릿
클래스 템플릿도 함수라는 점을 제외하면 함수 템플릿과 동일한 기능을 수행한다.
template <typename 타입이름>
class 클래스템플릿이름
{
// 클래스 멤버의 선언
}
이런 형태로 선언한다.
멤버 함수 및 생성자도 타입과 관련된 함수라면 영향을 줄 수 있다.
template <typename ..>
반환형 클래스명:: 함수 이름(인자..) {}
와 같은 형태로 멤버함수를 생성한다. (생성자도 리턴 타입을 명시하지 않는 것을 제외하고는 동일하다.)
클래스 템플릿의 객체를 생성할 때는 반드시 해당 객체의 타입을 사용자가 명시해야 한다.
클래스 내부에 또 다른 클래스 템플릿도 정의할 수 있으나 잘 사용하지는 않을 것 같다..
또 클래스 템플릿도 명시적 특수화가 가능하다.
template <> class 클래스명<클래스 타입>
{
};
와 같은 형식으로 새로 재정의를 한다는 느낌으로 사용할 수 있겠다.
부분적으로 특수화 할 수도 있는데, 그를 위해서는 template <특수화 하지 않을 타입> ~~ <특수화할 타입>에서 첫번째 <>부분 안에 특수화 하지 않을 인수만 넣으면 된다.
'C++' 카테고리의 다른 글
양방향 연결리스트(DLinkedList) - C++ (0) | 2020.09.03 |
---|---|
스마트 포인터(smart pointer) (0) | 2020.08.18 |
추상 클래스(abstract class) (0) | 2020.08.17 |
오버라이딩(overriding) (0) | 2020.08.14 |
파생 클래스 (0) | 2020.08.13 |