해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다.
템플릿(template)이란 매개변수의 타입에 따라 함수나 클래스를 생성하는 메커니즘을 의미한다. 다시말해 함수나 클래스를 개별적으로 작성하지 않아도, 여러 타입으로 사용할 수 있도록 하게 만들어 놓은 틀인 셈이다.
다양한 자료형의 함수를 만드는 도구가 된다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 한다.
template <typename T>
T Add(T num1, T num2)
{
return num1 + num2;
}
위 예제에서 템플릿의 정의에 다음 문장이 포함된다.
template <typename T>
또는 다음의 선언을 사용해도 된다. 두 선언은 같은 의미이다.
template <class T>
T
는 자료형을 결정짓지 않겠다는 의미이다. 둘 이상의 자료형에 대해서도 템플릿을 선언할 수 있다. 그리고 이렇게 정의된 클래스 함수를 기반으로 컴파일러에 의해 생성된 함수를 템플릿 함수라고 부른다.
함수를 템플릿으로 정의했듯이 클래스도 템플릿으로 정의가 가능하다. 제공되는 기능과 내부의 행동이 모두 동일한데, 저장의 대상이 다르다는 이유만으로 유사한 클래스를 여러 개 정의해야는 불합리한 상황에서 클래스 템플릿을 정의하여 문제를 해결할 수 있다. 이렇게 정의된 클래스 템플릿을 기반으로 만들어 내는 클래스를 가리켜 템플릿 클래스라고 한다.
템플릿의 개념을 활용하여 다음의 3가지 함수 템플릿을 작성하면 된다.
swap
: 두 인자의 값을 스왑하되 반환 값은 없다.
min
: 두 인자를 비교해 더 작은 값을 반환하되 같으면 두 번째 인자를 반환한다.
max
: 두 인자를 비교해 더 큰 값을 반환하되 같으면 두 번째 인자를 반환한다.
iter
라는 함수 템플릿을 작성하되 다음의 3가지를 인자로 받고 반환 값은 없다.
배열의 주소 : T* arr
배열의 길이 : int len
배열의 각 요소마다 실행시킬 함수 포인터 : void (*f)(const T&)
ex02
의 목표는 type T
요소를 포함한 Array
라는 클래스 템플릿을 작성하는 것이다. 매개변수가 없는 기본 생성자는 빈 배열을 생성하고 매개변수로 정수가 주어지면 그 사이즈만큼 배열을 생성하고 디폴트로 초기화한다. 복사 생성자와 대입 연산자 오버로딩은 당연히 깊은 복사를 기반으로 한다. 배열 할당 시 반드시 new
키워드를 사용해서 할당해야하며 []
연산자를 오버로딩하되 []
로 접근 시 범위를 벗어나면 std::exception
을 던진다. 배열 요소의 개수를 반환하는 size
멤버 함수도 구현해야 한다.
참고
『윤성우의 열혈 C++ 프로그래밍』
https://bigpel66.oopy.io/library/42/inner-circle/18
https://velog.io/@hey-chocopie/C-Module-07-9dmf3a5a
https://velog.io/@chaewonkang/CPP-STL-Cast