Introduction to Template
compile time : run time polymorphism
컴파일 타임과 런타임 폴리모피즘에 대하여
Generic Programming using template
템플릿을 이용하면 제네릭 프로그래밍을 사용할 수 있다.
Function overloading 도 컴파일 타임 폴리모피즘이다.
두 함수를 정의한 상태에서 컴파일 타임 폴리모피즘으로 구체화되면 컴파일러가 해당 함수가 어떤 함수인지 Linking을 해준다. Resolution rule에 의해서 결정된다. 컴파일러에 의해서 결정.
템플릿도 마찬가지로 compile time polymorphism이다. 함수를 템플릿으로 정의했을 때, 타입 네임을 T로 사용할 수 있다. 재료들을 가지고 함수를 만들게 된다. <typename T> 타입 파라미터이다.
T를 int로 하면 함수 내부에 모든 T를 int로 생성하게 되어 스페셜라이즈드가 된다. 진짜 함수로 호출할 수 있게 만드는 게 컴파일러가 해주는 일이다. 그대로 Linking이 실시된다.
클래스 템플릿과 펑션 템플릿을 C++은 지원하고 있다.
큐 스택 등등이 클래스 템플릿이다. 이름대로 각자 클래스를, 함수를 만들어내는 템플릿이다.
Meta Programming
프로그램을 만들어내는 프로그램이다. 모종의 절차를 지나서 프로그램이 생성되게 된다. 템플릿은 메타 프로그래밍을 지원한다. 실제 템플릿은 틀일 뿐이고, 실행되진 않는다. C++에서는 많이 사용하게 된다. 굉장히 많은 템플릿이 있다. 메타프로그래밍을 할 수 있는 요소인 템플릿!
Class Template
템플릿의 장점 소개.
Pair 자료구조를 토대로 설명.
Template parameter Deduction
template Arg를 쓰기 싫다! 그런 기능을 제공한다. C++ 17부터 제공하게 되었다. 템플릿 정의할 때 사용하지는 않고, 스페셜라이즈드 된 템플릿을 만들 때 생략하는 것이다. 그러면 어떤 걸로 치환하는 지 컴파일러는 알아야만 한다. 정보를 알아야 한다. 그래서 조건이 붙는다. 클래스의 객체는 무조건 생성자가 불려야 한다. 생성자로부터 모든 템플릿 파라미터를 알아낼 수 있을 때만 사용할 수 있다. 그 외에는 생략이 불가능하다.
Primitive 타입도 같이 쓸 수 있다.
Class template을 작성할 때 주의할 점.
헤더파일과 cc파일을 나눠서 만든다. 헤더파일에는 Declaration, CC파일에는 Definition이 있는데, 템플릿은 이와 같이 하면 안 된다!
컴파일러는 CC파일을 컴파일 하여 각각 binary 파일로 바꾼다. 이후 실행가능하도록 binary들을 Linking한다. Linking이 되어야 실행이 가능하다.
해결 방법 1 : 선언과 정의를 헤더파일에 몽땅 다 쓰도록 한다.(템플릿의 경우에)
해결 방법 2 : 어쨌든 클래스만 있으면 되잖아! 따로 만들되 생성되어야 하는 것을 템플릿 클래스를 써준다.(specialize 할 수 있도록) - 이러면 사용 의도를 항상 파악해야 한다. 제 3자가 가져갔을 때 미리 써준 템플릿 클래스만 사용할 수 있다. 원하는 타입으로 치환할 수 없다. 이런 스페셜라이즈 된 클래스만 써! 강제할 수 있다. 사용자의 자유를 줄임.
해결 방법 1을 보통 많이 사용하게 된다.
스칼라나 오캠엘은 제한하는 기능이 있다. (50분40초 녹음 다시 듣고 정리하기.)
Function Template
실제 함수를 만들고 타입 소팅을 실시함.
함수에 대해서 얘기하자면, Overloading이랑 잘 구분지어야 한다. 시점을 잘 봐야한다.
템플릿에 대해서 알게 되었으니 Resolution rule에 대해서 더 잘 알아보도록 하자.
함수 호출 시, Exact matching을 실시.
컴파일러는 Exact Matching이 있으면 그 함수를 호출한다. 없으면 Template으로 함수를 만든다. 템플릿으로도 완벽하게 일치하는 것을 만들 수 없다. 그렇다면.. 원래 알고 있던 대로 컴파일러는 계산한다. (Resolution rule에 따라서.)
T를 다른 타입으로 치환하는 것을 막을 수 있지는 못 함. runtime에서 하게 될 수밖에 없다.
상속하는 경우!
vector를 확장해서 stack을 만들었고 이걸 템플릿으로 만들것이다.
template<class T>
class vector {
};
template<class T>
class stack : private vector {
};
//
template<class T>
class stack : private vector<T> {
};
이 경우에는 벡터는 클래스가 아니라 템플릿이라서 private vector<T>라고 써 놔야 한다. 그래야 스페셜라이즈 된 벡터를 사용할 수 있다. 그리고, stack 내부에서
template<class T>
class stack : private vector {
bool IsEmpty() {
return vector<T>::IsEmpty();
//벡터는 템플릿이라서 <T>를 꼭 써야만 한다. 스페셜라이즈 된 클래스로 치환할 수 있다. 꼭 꼭 빠뜨리지 말고 써야 한다.
}
};
'[Computer Science] -보호글 > [객체지향설계]' 카테고리의 다른 글
[객체지향설계] 12/05 이론 (0) | 2023.12.05 |
---|---|
[객체지향설계] 11/21 이론 (0) | 2023.11.21 |
[객체지향설계] 11/7 이론 (0) | 2023.11.07 |
[객체지향설계] 10/31 이론 -Design Pattern (0) | 2023.10.31 |
[객체지향설계] 10/03 이론 (0) | 2023.10.23 |