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ํ์ผ๋ด์ ๋ณ๋๋ก ๊ตฌํํ ์ํฉ์ ๊ฐ์ ํ๋ค.
- ์ปดํ์ผ ์ ๊ฐ ํ์ผ๋ณ๋ก ์ค๋ธ์ ํธ ํ์ผ์ด ๊ฒ์ฌํ๊ณ ์ค๋ธ์ ํธ ํ์ผ์ ์์ฑํ๋ค.
- ์ด๋ ๊ตฌํํ cppํ์ผ ๋ด์์ ๊ตฌ์ฒด์ ์ธ ์๋ฃํ์ ์จ์ ํฌํ๋ฆฟ ํจ์/ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ์ปดํ์ผ์ ํ์ง ์๊ณ ๋์ด๊ฐ๋ค(์ปดํ์ผ๋๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์๋ฌ ๋ฐ์ ์ํจ).
- ๊ทธ ๊ฒฐ๊ณผ ํฌํ๋ฆฟ ํจ์๊ฐ ์ปดํ์ผ ๋์ง ์์ ์ค๋ธ์ ํธ ํ์ผ์ด ์์ฑ๋๊ณ , ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ ํ์ผ๊ณผ ๋งํนํ๋ฉด ๋งํน ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- cppํ์ผ์ ์ธํฌ๋ฃจ๋ ํ๋ฉด ๋งํน ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋, ์ด๋ ์ข์ ํด๊ฒฐ์ฑ ์ด ์๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐ๋ผ์ ํฌํ๋ฆฟ ํจ์/ํด๋์ค๋ ํค๋ํ์ผ์ ์ ์ธ๊ณผ ์ ์๋ฅผ ๊ฐ์ดํ๋ค.
- ํค๋ํ์ผ์ cppํ์ผ์ includeํ๋ฉด ์ปดํ์ผ ๋์ง ์๊ณ include๋ ๋ถ๋ถ์ ํค๋์ ๋ด์ฉ ์ ๋ถ๊ฐ ๋ณต์ฌ๋๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ํด๋น 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