C++ 템플릿

200원짜리개발자·2023년 6월 13일
2

C++

목록 보기
8/39
post-thumbnail

강의 보고 공부한 것을 정리하는 목적으로 작성된 글이므로 틀린 점이 있을 수 있음에 양해 부탁드립니다. (피드백 환영입니다)

원래는 우리가

using T = int;

이런식으로 별칭을 만들어서 사용할 수 있었지만
다양한 자료형으로 사용 할 수가 없었다.

하지만 템플릿을 사용한다면 그 점을 해결할 수 있다.
(C#의 generic과 비슷하다. 하지만 내용은 더 많은 걸로 알고있다.)

템플릿의 종류에는 함수 템플릿클래스 템플릿이 있다.

함수 템플릿

우리가 원래는 자료형을 만족시키기 위해서

Print(int a)
{

}

Print(float a)
{

}

Print(double a)
{

}

이런식으로 오버로딩을 하여 입력을 해주었다.

하지만 템플릿을 사용하면

template<typename T>
Print(T a)
{
	cout << a << endl
}

이런식으로 조커카드처럼 사용할 수 있다.

그러면

Print<int>(1);
Print<float>(3.14);
Print<const char*>("Hello");

이런식으로 사용할 수 있다.
<>를 적지않는다면 암시적으로 변환을 해준다.

이런식으로 템플릿을 사용하면 하나의 함수가 모든 일을 다 한다고 생각할 수 있는데
각기 자료형이 다른 함수들을 컴파일러가 빌드과정에서 만들어주는 것이다.

그리고 템플릿 인자를 여러개 사용할 수도 있다.

template<typename T1, typename T2>
Print(T1 a, T2 b)
{
	cout << a << b<< endl
}

그리고 특정 자료형일 때만 이 함수를 실행했으면 좋겠다고 생각하면
템플릿 특수화를 사용해 구현할 수 있다.

template<typename T>
Print(T a)
{
	cout << a << endl
}

template<>
Print(int a)
{
	cout << "int" << endl;
}

클래스 템플릿

클래스 템플릿도 함수 템플릿과 별반 다를바가 없다.

template<typename T>
class RandomBox
{
public:
	T GetRandomData()
    {
    	int index = rand() % 100;
        return data[index];
    }
public:
	T data[100];
}

이런식으로 사용해 줄 수 있다

애도 함수 템플릿과 마찬가지로 하나의 공용 클래스를 만들어주는 것이 아니라
타입에 따른 다른 클래스(설계도)를 컴파일러가 만들어 주는 것이다.

template<typename T, int SIZE>
class RandomBox
{
public:
	T GetRandomData()
    {
    	int index = rand() % SIZE;
        return data[index];
    }
public:
	T data[SIZE];
}

이런식으로 템플릿 인수로 int를 넣어서 값을 받아줄 수도 있다. (반드시 값을 넣어야 한다)

그리고 기본값도 넣어줄 수 있다.

template<typename T = int, int SIZE = 100>
class RandomBox
{
public:
	T GetRandomData()
    {
    	int index = rand() % SIZE;
        return data[index];
    }
public:
	T data[SIZE];
}

클래스도 함수 템플릿과 같이 템플릿 특수화를 할 수 있다.

template<typename T = int>
class RandomBox
{
public:
	T GetRandomData()
    {
    	int index = rand() % 100;
        return data[index];
    }
public:
	T data[100];
}

template<>
class RandomBox<int>
{
public:
	int GetRandomData()
    {
    	int index = rand() % 100;
        return data[index];
    }
public:
	int data[100];
}

정리

템플릿을 사용하면 함수클래스를 다양하게 사용할 수 있게 된다.
인수를 정할 때 typename말고 class도 사용가능하지만 요즘에는 typename을 사용한다고 한다. (조금 더 세련된 문법이다)

템플릿은 타입이 결정되는 과정이 실시간으로 진행되는 것이 아닌 컴파일과정에서 결정된다.

그리고 템플릿 코드를 만들 때
어지간하면 .h파일에 다 구현하면 된다.
왜냐하면
.h과 .cpp분리해서 만들면 문법적으로 오류가 엄청 많이 난다.
이유는 아직까지 배우기에는 어렵기 때문에 나중에 알아보도록 하겠다.

이 외에도 다양한 문법이 있다. (복잡하다)

profile
고3, 프론트엔드

0개의 댓글