42seoul/projects

[CPP Module] 07

moaoh 2024. 3. 13. 15:21

C++ templates

https://jun-13.tistory.com/148

 

[C++] templates

C++ templates ์ฝ”๋“œ์˜ ์ผ๋ฐ˜ํ™”์™€ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ // templates function template T add(T a, T b) { return a + b; } int main() { // intํ˜• ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ std::cout

moaoh.dev


Exercise 00: Start with a few functions

what is templates??

// templates function
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    // intํ˜• ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
    std::cout << add(5, 3) << std::endl;

    // doubleํ˜• ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
    std::cout << add(3.14, 2.71) << std::endl;
	
    return 0;
}

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์ฒ˜๋Ÿผ template <typename T> ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋– ํ•œ ํƒ€์ž…์ด๋“  ์œ ๋™์ ์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ template๋ผ๋Š” ๊ฐœ๋…์„ ์•Œ์•„๋ณด๊ณ  ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ณผ์ œ


Exercise 01: Iter

template <typename T>
void print(T a, T b) {
    std::cout << "a :" << a << std::endl;
    std::cout << "b :" << b << std::endl;
}

int main() {
    print(5, "hello"); // error
    return 0;
}

์œ„์™€ ๊ฐ™์ด print(5, “hello”) ํ˜•์‹์œผ๋กœ ํ•˜๋‚˜๋Š” int ํ•˜๋‚˜๋Š” str ๋กœ ์ถœ๋ ฅ์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ template์ด๋ผ๊ณ  ๋ฐ”๋กœ ๋Œ€์ž…์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ์„ ํ•ด๋ฒ„๋ฆฐ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ•˜๋‚˜์˜ typename์€ ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ์ด ๋˜๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ• ๋ ค๋ฉด

template <typename T, typename U>
void print(T a, U b) {
    std::cout << "a :" << a << std::endl;
    std::cout << "b :" << b << std::endl;
}

int main() {
    print(5, "hello"); // OK!
    return 0;
}

template์˜ typename์„ ์ถ”๊ฐ€ํ•ด์„œ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ์ถ”๊ฐ€ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ๋‹ค์–‘ํ•œ type์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ์˜ ์ ‘๊ทผํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.


Exercise 02: Mutated abomination

ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ์šฐ์„ ์ ์œผ๋กœ main๋ฌธ์ด ์ฃผ์–ด์ง€๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘์„ ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์ด ๋‚˜์™€์•ผํ•œ๋‹ค.

*.tpp ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ์ฒ˜์Œ๋ณด๋Š” tpp๋ผ๋Š” ํ™•์žฅ์ž์˜ ํŒŒ์ผ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”๋ฐ ์ด ํŒŒ์ผ์ด ๋ฌด์—‡์ธ์ง€ ์ฐพ์•„๋ณด๋‹ˆ ๋ณดํ†ต *.hpp์— ์„ ์–ธ์ด ๋˜์–ด์žˆ๋Š” class๋ฅผ *.cpp์— ์˜ฎ๊ฒจ์„œ ์„ ์–ธ๊ณผ ์ •์˜๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ.

template์˜ ๊ฒฝ์šฐ์—๋Š” *.cpp๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‹œ๋„ํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์‹œ์— ์ด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ *.tpp๋ผ๋Š” ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

int *a = new int();

int* a = new int[10];

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ *์ธ ๊ฐ’์— ๋ฐฐ์—ด์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

ex02์—์„œ T *array ํ˜•์‹์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผํ•˜๋ฏ€๋กœ T array = new T[size]; ํ˜•์‹์œผ๋กœ ํ• ๋‹น์„ ํ•˜์—ฌ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.