사용자(프로그래머)가 원하는 타입을 넣어주면 딱딱 알아서 코드를 찍어내는 틀.

**template <typename T>**
class Vector {
	T* data;
	int capacity;
	// ...

아래 정의되는 클래스에 대해 템플릿을 정의하고, 템플릿 인자로 T를 받게 되며, T는 반드시 어떠한 타입의 이름임을 명시하고 있다.

위 경우 템플릿 문장 아래 오는 것이 class Vector이므로 이 Vector 클래스에 대한 템플릿을 명시하는데, 만약에 밑에 오는 것이 함수일 경우 함수에 대한 템플릿이 된다.

**template <class T>**

라고 쓰는 경우도 있는데, 이는 정확히 typename T와 동일하다.

class T라고 해서 T 자리에 꼭 클래스가 와야하는 것이 아님

똑같이 int, char등이 올수 있다.

<aside> ⚠️ template <typename T>와 template <class T>는 정확히 같은 의미를 같지만 되도록이면 typename 키워드를 사용할 것

</aside>

왜 똑같은 템플릿에 두 개의 키워드를 정의하였냐

→ c++을 처음만들었던 Bjarne Stroustrup은 처음에 template의 인자로 class 키워드를 사용하였는데, 굳이 새로운 키워드를 만들고 싶지 않아서였기 때문

하지만, 시간이 흘러서 C++ 위원회는 이로 인한 혼동을 막기 위해 (왜냐하면 class T 라 하면 T 자리에 꼭 클래스만 와야하는 것처럼 느껴지니까) typename이라는 이름을 사용하기로 하였당. 물론, 이전 코드와의 호환을 위해 class는 그대로 남겨놓음

이렇게 정의한 템플릿의 인자에 값을 전달하기 위해서는

Vector<int>int_vec;

와 같이, <> 안에 전달하려는 것을 명시해주면 된다. 우리의 Vector 템플릿은 템플릿 인자로 타입을 받게 되는데 위 경우 T에 int가 전달되게 된다.

Untitled

template에 인자로 어떠한 타입을 전달하냐에 따라 int를 저장하는 Vector를 만들거나, string을 저장하는 Vector를 만들어낼 수 있는 것.