2020. 11. 19. 16:49ㆍ컴퓨터 수업/C++
참고:
m.blog.naver.com/vjhh0712v/221553593414
m.blog.naver.com/vjhh0712v/221561418596
할말:
C++에서는 템플릿, 자바에서는 generic이라고도 불리우는 이 "형식"은 arbitrary를 지원하기 위한 방식이다.
수학에서 흔히 보는 "임의의 x에 대해 condition1을 만족하는~" 이라는 문장은
다시말해, "모든 x에 대해" 라고 해석되기도 하므로.
이 "템플릿"이라는 형식은 "모든 형식에 대한 고려"와 "임의의 형식에 대한 고려"라는 의미를 함축한다.
"모든 형식에 대한 고려"의 관점에서 보면,
template<class T> 라는 statement는 컴파일타임에 모든것을 준비한다고도 여겨진다.
예를들어, 컴파일타임에 int, double, char 등등 모든 자료형에 대한 준비를 마쳐놓고, 런타임에 특정 호출이
발생하면 그 특정 함수를 호출하는 방법이다.
또한, "임의의 형식에 대한 고려"라는 관점에서 보면,
template<class T>라는 statement는 런타임에 특정 호출이 발생하면, 그제서야 부랴부랴 함수를 만들어내
는 작업이라고도 여겨진다.
잘은 모르지만, hpp라는 독립된 파일확장자를 보면, 앞의 "모든 형식에 대한 고려"라는 관점이 맞는것처럼
보이지만, 동적 타입 바인딩이 추세인 현 상황에서는 SDK가 업그레이드 될 수록, 아래의 방식을 채용하지
않을까 싶다.
템플릿 함수
목적 : 오버로딩 하는 귀찮음을 덜기 위해.
<기본>
형식1 : 선언과 정의를 동시에.
형식2: 선언과 정의를 따로.
<질문. 어떤 template함수를 불러올지 어떻게 결정?>
Max를 1과 2.5로 호출하였는데, 이때 컴파일에러가 나게된다.
따라서, 템플릿 함수는 아규먼트의 형식으로 템플릿형식이 지정(fix)된다.
<템플릿 함수를 아규먼트의 형식 즉, "묵시적"으로 호출하지 않고 "명시적"으로 호출하는 방법>
Max<int> 즉, 함수를 호출 할 때, template class처럼 <형식>을 지정해주니, 위의 묵시적 호출과 달리 오류도 나지 않는다.
<선언부와 실행부의 typename을 다르게>
실행 잘 되며, 어차피 선언부로는 제어권이 넘어가지도 않는다. 그저 병풍.
<여러 typename을 이용>
우선 이 케이스는 실행되는 케이스임.
주의깊게 봐야할 점은
1. 선언부와 정의부의 typename이 완전히 다름. 그럼에도 불구하고 실행이 되는데, 이는 위에서 설명한 병풍으로 설명 됌.
2. 실행부의 Max 함수를 explicit하게 호출 해 주었는데. 이를 묵시적으로 호출하게되면 에러가 발생함.
에러는 다음과 같음.
원래 목적은 다음과 같았음.
= int가 들어갈지 double이 인수로 들어갈 지 모르고, 그에따라 max값이 int or double로 반환되니, 이런 or라는 점이 템플릿의 arbitrary한 점과 결부되므로, 세가지의 typename을 사용한 것임.
그러나, 위에서 설명했듯이, 템플릿 함수는 아규먼트로 어떤 함수를 호출할 지 결정되므로, 아규먼트에서 모든 typename이 결정되지 않으면 어떤 템플릿 함수를 호출할지 컴파일러가 알 수 없음.
<typename은 1개 + 일반 함수>
<typename은 1개 + 일반 함수 / 오버로딩>
참고를 보면 알겠지만, 템플릿 함수는 일반적으로 부분특수화를 지원하지 않는다고 알려져있다.
그러나 이렇듯, 일반함수의 오버로딩을 사용하면 템플릿클래스의 부분특수화를 실현 할 수 있다.
다음 그림과 같은 생각이 든다.
<typename 2개 그림만>
<명시적 특수화>
(전문)
(결과)
explicit specailization 즉, 명시적 특수화는 typename이 1개일때만 가능.
<typename 1개 + 특수화 + 오버로딩의 불명확 문제는 저 블로그 가서>
아 다음에 포스팅하자
'컴퓨터 수업 > C++' 카테고리의 다른 글
Lambda Function (0) | 2020.11.30 |
---|---|
템플릿★ (0) | 2020.11.19 |
virtual , 업/다운 캐스팅, 정적타입바인딩, 추상클래스 ★ (0) | 2020.11.10 |
C++ 상속 (0) | 2020.11.05 |
재귀에 대한 생각. (0) | 2020.11.04 |