템플릿 인자

Programming/C++ 2012. 10. 16. 23:42 |

템플릿을 정의할 때 결정되지 않은 자료형을 의미하는 용도로 사용되는 T 또는 T1, T2와 같은 문자를 가리켜 '템플릿 매개변수' 라 한다.

그리고 템플릿 매개변수에 전달되는 자료형 정보를 가리켜 '템플릿 인자' 라 한다.


템플릿 매개변수에는 변수의 선언이 올 수 있다.


아래의 예제를 보면, 템플릿 매개변수의 선언에 마치 함수처럼 변수의 선언이 등장했다.

 

SimpleArray<int, 5> i5arr;

SimpleArray<double, 7> d7arr;


위의 두 문장에서 템플릿 매개변수 len에 전달된 인자 5와 7은 해당 템플릿 클래스에서 상수처럼 사용된다. 

즉, len은 각각 5, 7로 치환되어, 컴파일러에 의해 SimpleArray<int, 5>, SimpleArray(double, 7> 형 템플릿 클래스가 각각 생성된다.


※ 물론 생성자를 이용해도 충분히 구현 가능하다. 그리고 이것이 더 현실적이고, 좋은 방법임에도 틀림이 없다. 



이 예제에서 주목할 사실

-> SimpleArray<int, 5>와 SimpleArray<int, 7> 은 서로 다른 형(type)이다.

ex) i5arr1 = i7arr1;        //컴파일 error!


이렇듯, 템플릿 매개변수에 값을 전달받을 수 있는 변수를 선언하면, 변수에 전달되는 상수를 통해서 서로 다른 형의 클래스가 생성되게 할 수 있다. 


따라서 위 예제의 경우, 길이가 다른 두 배열 객체간의 대입 및 복사에 대한 부분을 신경 쓰지 않아도 된다. 자료형도 같고 길이도 같은 배열 객체에 대해서만 대입 및 복사가 허용되니 말이다. 



※ 만약에 생성자를 이용해서 배열의 길이를 결정하게 했다면, 길이가 같은 배열에 대해서는 대입을 허용하기 위해서 추가적인 코드의 삽입이 불가피하며, 이러한 추가적인 코드는 대입 및 복사의 과정에서 CPU가 수행해야 할 일을 늘리는 결과로 이어진다.






템플릿 매개변수는 디폴트 값 지정도 가능하다.


-> 함수의 매개변수에 디폴트 값의 지정이 가능하듯이, 템플릿 매개변수에도 디폴트 값의 지정이 가능하다.



T에 int가, len에 7이 디폴트 값으로 지정되었다.


※ 위 예제에서 보이듯이 템플릿 매개변수에 디폴트 값이 지정되어도, 템플릿 클래스의 객체생성을 의마하는 <> 기호는 반드시 추가되어야 한다. 비록 그안을 비워둘지라도!!

Posted by scii
: