C, C++

[C++] ν…œν”Œλ¦Ώ(Template)

벼리01 2024. 8. 29. 12:13

πŸ“Œν…œν”Œλ¦Ώ

ν•¨μˆ˜λ‚˜ 클래슀λ₯Ό κ°œλ³„μ μœΌλ‘œ λ‹€μ‹œ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„, μ—¬λŸ¬ μžλ£Œν˜•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄λ†“μ€ ν‹€. μ—¬λŸ¬ νƒ€μž…μ—μ„œ λ™μž‘ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό μ°μ–΄λ‚΄λŠ” ν‹€. λ‹€μ–‘ν•œ νƒ€μž…μ— λŒ€ν•΄μ„œ ν•˜λ‚˜μ˜ ν•¨μˆ˜λ§Œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. 

μ΄λŸ¬ν•œ ν˜•νƒœμ˜ ν•¨μˆ˜κ°€ μžˆλ‹€λŠ” κ²ƒλ§Œ 약속해두고, ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— 인자의 νƒ€μž…μ— 따라 μ‹€μ œ ν•¨μˆ˜μΈ ν…œν”Œλ¦Ώ μΈμŠ€ν„΄μŠ€ ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€.(μ»΄νŒŒμΌλŸ¬κ°€ μ „λ‹¬λœ νƒ€μž…μ„ κ²€μ‚¬ν•˜μ—¬ 그에 ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€.)

 

// ν•¨μˆ˜ ν…œν”Œλ¦Ώ
template <typename T> 
T FunctionTemplate(T a, T b) {
	...
}

// 클래슀 ν…œν”Œλ¦Ώ
template <class T>
class MyClass {

public: 
    MyClass(T a) {
        this->a = a;
    }

private :
	T a;
}

 

 

 

πŸ“Œν•¨μˆ˜ ν…œν”Œλ¦Ώ(Function Template)

λ²”μš©ν˜•μ„ λ‹€λ£° 수 μžˆλŠ” ν•¨μˆ˜μ˜ μ •μ˜. μ–΄λ–€ νƒ€μž…μ΄λ“  μ΄λŸ¬ν•œ ν˜•νƒœλ₯Ό κ°€μ§„λ‹€κ³  사전에 μ •μ˜ν•΄λ‘λŠ” ν‹€.

 

두 수λ₯Ό λΉ„κ΅ν•˜λŠ” ν•¨μˆ˜ `Max()`λ₯Ό μ •μ˜ν•œλ‹€. μ΄λ•Œ μ •μˆ˜κ°€ μ•„λ‹Œ μžλ£Œν˜•μ΄ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ μ˜€λ²„λ‘œλ”© ν•΄μ•Όν•œλ‹€.

 

int Max(int a, int b) {
	return a > b ? a :  b;
}

double Max(double a, double b) {
	return a > b ? a : b;
}

char Max(char a, char b) {
	return a > b ? a : b;
}

 

 

λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό 리턴 νƒ€μž…λ§Œ λ‹€λ₯Ό 뿐 ν•¨μˆ˜μ˜ λ‚΄λΆ€κ°€ λͺ¨λ‘ μ€‘λ³΅λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

이와 같이 νƒ€μž…λ§Œ λΉΌκ³  μ½”λ“œκ°€ λͺ¨λ‘ 동일할 λ•Œ, μ˜€λ²„λ‘œλ”© λŒ€μ‹  ν…œν”Œλ¦Ώμ„ μ •μ˜ν•  수 μžˆλ‹€. 

 

template <typename T> 
T Max(T a, T b) {
	return a > b ? a : b;
}

 

 

 

πŸ“Œν΄λž˜μŠ€ ν…œν”Œλ¦Ώ(Class Template)

κ°„λ‹¨ν•œ μŠ€νƒμ„ κ΅¬ν˜„ν•΄λ³΄μž. μ΄λ•Œ μ–΄λ–€ μžλ£Œν˜•μ΄ λ“€μ–΄μ˜¬μ§€ μ•Œ 수 μ—†μœΌλ―€λ‘œ ν…œν”Œλ¦ΏμœΌλ‘œ 클래슀λ₯Ό μ •μ˜ν•œλ‹€.

 

template <class T>
class MyStack {

public:
	MyStack(int size) {
		this->ptr = new T[size];
		this->size = size;
	}

	~MyStack() {
		delete[] ptr;
	}

	void Push(T a) {
		*ptr++ = a;
	}

	T Pop() {
		T temp = *--ptr;
		*ptr = NULL;

		return temp;
	}

	int Size() const {
		return this->size;
	}

private:
	T* ptr;
	int size;
};

 

int main() {

	MyStack<int> testStack(5);
	testStack.Push(1);
	testStack.Push(15);
	testStack.Push(29);

	cout << testStack.Pop() << endl;
	cout << testStack.Pop() << endl;
	cout << testStack.Pop() << endl;

	return 0;
}


// 좜λ ₯κ°’
// 29
// 15
// 1

 

 

πŸ“Œμ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ„ 2개 이상 κ°–λŠ” ν…œν”Œλ¦Ώ

λ²”μš© νƒ€μž…μ„ μœ„ν•΄ νƒ€μž… 이름을 `T` 둜 μ •μ˜ν–ˆμ—ˆλ‹€. μ΄λ•Œ `T` λŠ” μΉ˜ν™˜λ˜λŠ” 단어와 κ°™μœΌλ―€λ‘œ λ‹€μŒκ³Ό 같이 두 개 이상 μ •μ˜ν•  수 μžˆλ‹€.

 

template <class Key, class Value>
class Map {
public:
    Map() {}

    void insert(const Key& key, const Value& value) {

    }

    bool find(const Key& key, Value& value) const {
		...
    }


    bool delete(const Key& key) {
		...
    }
    
private:
	...
};

 

 

 

'C, C++' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[C++] 슀마트 포인터  (0) 2024.09.19
[C++] STL  (0) 2024.09.05
[C++] 상속(Inheritance)  (0) 2024.08.29
[C++] 객체 μ§€ν–₯  (6) 2024.08.19
[C] 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή  (0) 2024.08.13