- 함수 템플릿
c++에서 추가된 기능, 오버로딩작업을 자동화 해준다
Template은 한국어로 형판이라 한다
틀에 재료를 넣고 빼면 틀모양의 물건이 완성된다
틀에 다른 재료를 넣으면 각 재료로 만든 형체가 나온다
이 완성된 것은 모양은 같지만 재료는 다르다
여기서 재료는 자료형을 뜻하는것과 비슷하다고 생각한다
함수의 틀(모양)은 유지하되 다른 자료형(재료)으로 실행할수있다는 뜻으로 생각한다
템플릿은 함수템플릿, 클래스템플릿이 있으며 지금은 함수 템플릿만 정리한다
템플릿 설정은 template , class(혹은 typename) , < > 를 사용하여 설정한다
typename은 C++98에서 추가되었고 데이터형을 나타낸다는 사실을 더 분명하게 알려준다
이 템플릿 설정에 있어서 typename과 class는 일단 같은 기능을 한다
위의 템플릿함수를 사용시 사용할 자료형을 기술해야줘야하는데 (기술하는것을 명시적 구체화라 한다)
매개변수로 인해 자료형이 추론이 가능하다면 생략해도 좋다 (추론하는것으로 암시적 구체화라 한다)
- 템플릿 오버로딩
일반적인 오버로딩을 하듯 사용하면 된다
다만 주의할것은
이렇게 템플릿함수와 일반함수가 같은 함수처럼 보여도
오버로딩과는 별개로 다른 독립적인 함수임을 알아야한다
- 구체화
구체 具體
사물이 직접 경험하거나 지각할 수 있도록 일정한 형태와 성질을 갖춤.
밑의 코드처럼 함수 템플릿을 작성하기만 한다고 실제 함수의 정의가 생성되는건 아니다
어떤 자료형을 사용할것이라고 구체적으로 기술한 템플릿을 사용하면(구체화)
그때! 기술한 자료형을 토대로 함수의 정의가 생성된다 (생성되는 시기는 호출되는 런타임이 아니라 컴파일 타임이다)
이를 '구체화' 라 한다
구체화에는 명시적 구체화, 암시적 구체화가 있는데
명시적 구체화는 직접 자료형을 써 넣어 구체화 하라고 지시하는 의미를 가진다
두가지 방법이 있는데
호출하지 않는 방법과 호출하는 방법이 있는데
1이 호출하지 않는 방법이고,
2가 호출하는 방법이다
호출할시에 <> 이 꺽쇠모양은 템플릿함수를 사용한다는 의미도 있다
암시적 구체화
Test(1); 꺽쇠(<>)에 명시적인 자료형을 기술하지 않고 매개변수로 자료형을 추론하여
해당 자료형을 토대로 구체화하는 방법이다
명시적 구체화와 함께 정리했다
정리하면서 뭔가 구체화가 인스턴스화와 같다고 느꼈다
무언가 실체화 되는 느낌이라고 생각하면 될듯하다
템플릿 함수
컴파일 타임에 구체화 되어 만들어진 함수를 '템플릿 함수' 라 한다
- 명시적 특수화
[템플릿 특수화는 두가지가 있다 명시적 특수화, 부분적 특수화 함수 템플릿에서는 명시적 특수화만 가능하다]
특수 特殊
어떤 종류 전체에 걸치지 아니하고 부분에 한정됨. 또는 그런 것.
템플릿에서 특수화는 저 사전적의미를 빌리면 템플릿을 여러 자료형에 속하게하지 않고 지정 해주는 뜻 이라 생각한다
(자료형을)지정하여 그 지정된 자료형이 매개변수로 들어오면 그에 맞게 실행하는 것이다
한마디로 int형으로 특수화를 해놨을 때
int형으로 매개변수가 들어온 함수 호출이 있으면
따로 구체화하지말고 특수화 해놓은걸 사용해라 이런 느낌이다
이 명시적 특수화는 어느 부분에서 필요성을 느끼게 되냐면
특정 자료형이 매개변수로 들어올때 다른 코드로 실행이 되게 하고싶을때 나타난다
이 특수화 방법은
함수 매개변수 개수가 같아야하고 반환형도 동일해야 한다
매개변수가 45인 int형은 명시적 특수화된 함수로 실행이 되었고
매개변수가 2.5f 인 float은 원형으로 실행이 되었다
덧붙여서 일반함수, 함수템플릿, 명시적 특수화된 함수 템플릿 이 세가지가 같은 호출조건을 가지고 있을때
우선순위가 있다
1. 일반함수 ── 2. 명시적 특수화된 함수 템플릿 ── 3. 함수 템플릿
순이다
명시적 특수화와 명시적 구체화의 차이는 졸라 헷갈렸는데
명시적 특수화는 특정 자료형에 따라 다른 코드의 예외를 작성할 수 있는 것이고
명시적 구체화는 원본 코드 그대로의 특정 자료형에 대한 함수 정의를 만들라는 것이다
그리고 문법적으로 특수화는 template<> ,구체화는 template 의 차이가 있다
- 특수화
암시적 구체화, 명시적 구체화, 명시적 특수화 이 모두를 특수화라 칭한다
'C++ > [책] C++ 기초 플러스' 카테고리의 다른 글
[ 559p ~ 589p ] 분할컴파일, #ifndef & #endif, Linkage, extern, static, 정적&전역&정적지역 변수 (0) | 2021.08.16 |
---|---|
※[ 535p ~ 558p ] 오버로딩분석, decltype, 후위반환타입 (0) | 2021.08.12 |
[ 486p ~ 517p ] 배열참조형, 디폴트 매개변수, 오버로딩, Name mangling (0) | 2021.07.29 |
[ 467p ~ 485p ] inline, 참조변수 (0) | 2021.07.18 |
[ 443p ~ 466p ] 함수포인터 (0) | 2021.07.16 |