CppModule 07

07

ํƒฌํ”Œ๋ฆฟ : ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜๋“ฑ์„ ์ฐ์–ด๋‚ด๋Š” ํ‹€.

https://www.youtube.com/watch?v=aNehlbm3eN0&list=PLDV-cCQnUlIb2oezNpNTmxiiX_NibMrlO&index=1

1. ํ•จ์ˆ˜ ํƒฌํ”Œ๋ฆฟ

๊ณ ๊ธ‰ ํƒฌํ”Œ๋ฆฟ ๊ธฐ์ˆ ๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ๋Š”๊ฑด ์•„์ฃผ ๊ธฐ์ดˆ.

// T : ๋Ÿฐํƒ€์ž„์— ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋Œ€์ฒด๋  ์ž„์˜์˜ ์ž๋ฃŒํ˜•
// ์•„๋ž˜ ํ•จ์ˆ˜/ํด๋ž˜์Šค๋Š” ์ž„์˜์˜ ์ธ์ž(ํƒฌํ”Œ๋ฆฟ ์ธ์ž) T๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํƒฌํ”Œ๋ฆฟ์ด๋‹ค. ๋ผ๊ณ  ์„ ์–ธ.
template<typename T>
T func1(T t) {...}

...
func1(42);			// int func1(int t)
func1(4.2);			// double func1(double t)
func1("42");		// char* func1(char* t) ํฌ์ธํ„ฐ๋ฅผ ๋น„๊ต/์—ฐ์‚ฐํ•˜๊ฒŒ ๋ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, ์ฃผ์˜.
func1(string("42")) // string func1(string t)
func1<string>("42")	// T๋ฅผ string์œผ๋กœ ์ •ํ•ด์คŒ.

์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ ํƒฌํ”Œ๋ฆฟ์€ ํ‹€์ด๊ณ , ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ T์˜ ๋ฒ„์ „์— ๋งž๋Š” ํ•จ์ˆ˜/ํด๋ž˜์Šค๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ ๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผ ์ดํ›„ ๋™์ž‘๋งŒ ๋ณด๋ฉด ๊ฐ ์ž๋ฃŒํ˜•์— ๋งž๋Š” ํ•จ์ˆ˜/ํด๋ž˜์Šค๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™๋‹ค.

T๋กœ๋Š” ๊ธฐ๋ณธ์ž๋ฃŒํ˜•, string๊ฐ™์€ ํ‘œ์ค€ ํด๋ž˜์Šค, ๊ฐœ์ธ์ด ์ œ์ž‘ํ•œ ํด๋ž˜์Šค ๋“ฑ ์–ด๋– ํ•œ ๊ฒƒ๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•ด๋‹น ํƒฌํ”Œ๋ฆฟ์˜ ์—ฐ์‚ฐ/ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ์„œ ์‚ฌ์šฉ๋  ํด๋ž˜์Šค ๋“ฑ์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์—ˆ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํŠน์ • ํ•จ์ˆ˜/ํด๋ž˜์Šค์—์„œ ํƒฌํ”Œ๋ฆฟ ์ธ์ž 2๊ฐœ ์‚ฌ์šฉ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒฌํ”Œ๋ฆฟ ์ •์˜.

template<typename T1, typename T2>
T2 func1(T1 t1) {...}

1.1 ํ•จ์ˆ˜ ํƒฌํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™”

ํŠน์ • ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋งŒ ํŠน๋ณ„ํ•œ ๊ทœ์น™์„ ์ ์šฉ.

// ์ผ๋ฐ˜์ ์ธ ํƒฌํ”Œ๋ฆฟ ํ•จ์ˆ˜.
template<typename T1, typename T2>
T2 func1(T1 t1) {...}

// string์„ ๋ฐ›๊ณ , ๋ฐ˜ํ™˜๊ฐ’์ด int๋กœ ์‚ฌ์šฉ๋  func1์€ ์•„๋ž˜์˜ ํƒฌํ”Œ๋ฆฟ.
template<>	//ํƒฌํ”Œ๋ฆฟ ์ธ์ž๋ฅผ ์‚ฌ์šฉ ์•ˆํ•˜๋ฏ€๋กœ
int func1(string t1) {...}

2 ํƒฌํ”Œ๋ฆฟ ํด๋ž˜์Šค

// ํƒ€์ž…๋งŒ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํŠน์ • ๊ฐ’๋„ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์ปดํŒŒ์ผ์‹œ ํƒ€์ž… T๋ฟ๋งŒ ์•„๋‹ˆ๋ผ SIZE๊ฐ’์— ๋”ฐ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ด ์ƒ์„ฑ๋จ.
// template<>์•ˆ์— ๋‚ด์šฉ๋“ค์€ ํƒฌํ”Œ๋ฆฟ์— ์ ์šฉํ•ด์•ผํ•  ๋ชฉ๋ก(๋ฆฌ์ŠคํŠธ)๋ฅผ ๋ช…์‹œํ•œ๊ฑฐ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ์ข‹์Œ
template<typename T, int SIZE>
class ClassA//<T, SIZE> ์ƒ๋žต ๊ฐ€๋Šฅ
{
private:
	T t_[SIZE];
...
}

...
ClassA<double, 20> TestClass1();
ClassA<double, 21> TestClass2();	// ์ด ๋‘๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ฃผ์†Œ๋Š” ๋‹ค๋ฆ„

// ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ผ์„œ, ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ! 
//TestClass1 = TestClass2;

ํ•˜์ง€๋งŒ, SIZE์ฒ˜๋Ÿผ ํŠน์ • ๊ฐ’๊นŒ์ง€ ๋ฐ›์•„์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง„ ์•Š๋Š”๋‹ค.

2.1 ํƒฌํ”Œ๋ฆฟ ํด๋ž˜์Šค ํŠน์ˆ˜ํ™”.

template<typename T, int SIZE>
class ClassA//<T, SIZE> ์ƒ๋žต ๊ฐ€๋Šฅ
{
private:
	T t_[SIZE];
...
}

template<int SIZE>
class ClassA<double, SIZE> // ํŠน์ˆ˜ํ™”์‹œ ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ
{
private:
	double t_[SIZE];
...
}

...
ClassA<string, 20> TestClass1();	// ์ผ๋ฐ˜์ ์ธ ํƒฌํ”Œ๋ฆฟ ํด๋ž˜์Šค ClassAํ˜ธ์ถœ๋จ
ClassA<double, 20> TestClass2();	// ํŠน์ˆ˜ํ™”๋œ ํƒฌํ”Œ๋ฆฟ ํด๋ž˜์Šค ClassAํ˜ธ์ถœ๋จ

ex00

๋ชฉํ‘œ : ํ•จ์ˆ˜ ํƒฌํ”Œ๋ฆฟ ์ž‘์„ฑ.

ํƒฌํ”Œ๋ฆฟ์˜ ์„ ์–ธ๊ณผ ์ •์˜

์ผ๋ฐ˜์ ์œผ๋กœ, ํ—ค๋”์—๋Š” ์„ ์–ธํ•˜๊ณ  cppํŒŒ์ผ์—๋Š” ์ •์˜ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ templateํ•จ์ˆ˜/ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์„ ์–ธ๋”ฐ๋กœ ์ •์˜ ๋”ฐ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋งํ‚น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ธฐ๋ฐ˜ ์ง€์‹

๋งํ‚น ์—๋Ÿฌ ๋ฐœ์ƒ ์ด์œ .

ํ—ค๋”์— ํƒฌํ”Œ๋ฆฟ ํ•จ์ˆ˜/ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ , cppํŒŒ์ผ๋‚ด์— ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•œ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•œ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋”ฐ๋ผ์„œ ํƒฌํ”Œ๋ฆฟ ํ•จ์ˆ˜/ํด๋ž˜์Šค๋Š” ํ—ค๋”ํŒŒ์ผ์— ์„ ์–ธ๊ณผ ์ •์˜๋ฅผ ๊ฐ™์ดํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด template๋งŒ ํ•ด๋„ ์ปดํŒŒ์ผ์ด ๋˜์ง€ ์•Š์„๊นŒ?

์„œ๋ธŒ์ ํŠธ์—๋„ ํ—ค๋”์— ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋ฉด ์•ˆ๋˜๋‚˜, ํƒฌํ”Œ๋ฆฟ์€ ์ œ์™ธํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Œ.

Any function implementation put in a header file (except for function templates) means 0 to the exercise.

(์ฐธ๊ณ  1)[https://ansohxxn.github.io/cpp/chapter13-2/], (์ฐธ๊ณ 2)[https://hwan-shell.tistory.com/253]

new

https://boycoding.tistory.com/205