본문 바로가기

C++

탬플릿

반응형

템플릿을 쓰는 이유 ?

- 타입마다 일일히 정의해주기에는 효율이나 귀찮은 작업이 많다, 템플릿을 사용하면 사용자가 타입을 정의하여 사용하므로 타입에 구애받지 않고 필요한 함수를 사용할 수 있다

 

 

템플릿이란 ?

사용자에게 입력받을 타입을 typename 을 선언하여 구현해두어 해당 타입으로 사용하는 방식

#pragma once

// Array.h

#ifndef _ARRAY_H
#define _ARRAY_H

typedef signed long int Long;
template <typename T>

class Array
{
public:
	Array(Long capacity = 100); // 디폴트 연산자이면서 인자값을 갖는 생성자
	Array(const Array& source);

	~Array();

	Long Store(Long index, T object);
	Long Insert(Long index, T object);
	Long AppendFromFront(T object);
	Long AppendFromRear(T object);
	Long Delete(Long index);
	Long DeleteFromFront();
	Long DeleteFromRear();
	void Clear();
	Long Modify(Long index, T object);
	Long LinearSearchUnique(void *key, int(*compare)(void *, void *));
	void LinearSearchDuplicate(void *key, Long* (*indexes), Long *count, int(*compare)(void *, void *));
	Long BinarySearchUnique(void *key, int(*compare)(void *, void *));
	void BinarySearchDuplicate(void *key, Long* (*indexes), Long *count, int(*compare)(void *, void *));
	void SelectionSort(int(*compare)(void *, void *));
	void BubbleSort(int(*compare)(void *, void *));
	void InsertionSort(int(*compare)(void *, void *));
	void MergeSort(const Array& one, const Array& other, int(*compare)(void *, void *));
	int Sum(Long a, Long b);

	T& GetAt(Long index);
	Array& operator=(const Array& source);
	T& operator[](Long index);
	T* operator+(Long index);

	Long GetCapacity() const;
	Long GetLength() const;

private:
	T(*front);
	Long capacity;
	Long length;
};

// GetCapacity()
template <typename T>
inline Long Array<T>::GetCapacity() const {
	return this->capacity;
}

 

 

	Array<double> arrTemp;
	arrTemp.AppendFromRear(3.01);
	arrTemp.AppendFromRear(2.71);
	arrTemp.AppendFromRear(3.81);
	arrTemp.AppendFromRear(4.81);
	arrTemp.AppendFromRear(1.21);
	cout << arrTemp[0] << endl;

 

클래스 템플릿 인스턴스화

- 템플릿은 호출되지 않으면 구체화 되지 않는다. 인스턴스화가 되어야 비로서 컴파일러가 실제 코드를 생성된다

 

 

왜 템플릿은 헤더에 있어야 되나

- 위의 경우가 템플릿이 아닌 다른 경우라고 생각해보자. 컴파일을 하게 되면 번역단위 1,2 마다 obj 파일이 만들어지며 링커가 해당 헤더에 맞는 정의를 연결시켜 줄것이다. 

그러나, 템플릿의 경우는 클래스 템플릿 인스턴스화로 인하여 인스턴스가 되자마자 컴파일러가 코드를 생성하니 해당 헤더에 정의가 없을 경우 헤더의 정보만으로 구현 내용이 없으니 컴파일러 찾지 못하고 에러를 뱉게 된다. 

템플릿에만 나타나는 특성이다

 

 

반응형

'C++' 카테고리의 다른 글

가상 함수  (0) 2019.12.11
C++ 언어의 특징  (0) 2019.11.13
인터페이스 vs 추상화  (0) 2019.10.30
참조형 변수  (0) 2019.10.28