๐Ÿš€ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ œ๋„ค๋ฆญ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ œ๋„ค๋ฆญ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋”ฉ ๊ณ ์ˆ˜๋‹˜๋“ค! ์˜ค๋Š˜์€ C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ œ๋„ค๋ฆญ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์„ธ๊ณ„๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ "์•„, ์ด๊ฑฐ ๋˜ ๋น„์Šทํ•œ ๊ฑฐ ์“ฐ๋„ค..."๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณธ ์  ์žˆ๋‚˜์š”? ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜๊ณ  ํƒ€์ž…๋งŒ ๋ฐ”๊พธ๋Š” ๊ฒŒ ๊ท€์ฐฎ์•˜๋‹ค๋ฉด, ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ตฌ์›์ž๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ใ…‹ใ…‹ใ…‹

์ด ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ์ˆ˜์˜ ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๋“ฏ, ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ณ ์ˆ˜๊ฐ€ ๋˜๋Š” ์žฌ๋Šฅ์„ ์–ป๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐Ÿ’ก Pro Tip: ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ต์ˆ™ํ•ด์ง€๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”. ๋๊นŒ์ง€ ํฌ๊ธฐํ•˜์ง€ ๋ง๊ณ  ๋„์ „ํ•ด๋ณด์„ธ์š”!

๐Ÿค” ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ๊ธธ๋ž˜?

์ž, ์—ฌ๋Ÿฌ๋ถ„! ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ๋ชจ๋ฅด์…”๋„ ๊ดœ์ฐฎ์•„์š”. ์ง€๊ธˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๐Ÿ˜Š

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ C++์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์— ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‰ฝ๊ฒŒ ๋งํ•ด, ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์ฃ !

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ๐Ÿค“


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

์ด ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ์ •์ˆ˜, ์‹ค์ˆ˜, ์‹ฌ์ง€์–ด ๋ฌธ์ž์—ด๊นŒ์ง€ ๋”ํ•  ์ˆ˜ ์žˆ์–ด์š”! ์‹ ๊ธฐํ•˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์€ ๋ฐ”๋กœ ์ด๊ฑฐ์˜ˆ์š”:

  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€ ๐Ÿ“ˆ
  • ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ณด์žฅ ๐Ÿ”’
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์ตœ์ ํ™” โšก

์ด์ œ ์ข€ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ์•„์ง ๋ชจํ˜ธํ•˜๋‹ค๊ตฌ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด๊ฐˆ ๊ฑฐ์˜ˆ์š”! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

๐ŸŽญ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋งˆ์น˜ ๋งŒ๋Šฅ ์š”๋ฆฌ ๋ ˆ์‹œํ”ผ ๊ฐ™์•„์š”. ์žฌ๋ฃŒ(ํƒ€์ž…)๋งŒ ๋ฐ”๊พธ๋ฉด ๋‹ค์–‘ํ•œ ์š”๋ฆฌ(๊ธฐ๋Šฅ)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ . ์žฌ๋Šฅ๋„ท์—์„œ ์š”๋ฆฌ ๊ณ ์ˆ˜์˜ ๋ ˆ์‹œํ”ผ๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ํ•œ ๋ฒˆ ์ตํžˆ๋ฉด ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋„ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ int float string custom ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋‹ค์–‘ํ•œ ํƒ€์ž… ์ฒ˜๋ฆฌ

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด์„ธ์š”. ํ•˜๋‚˜์˜ ํฐ ์ƒ์ž(ํ…œํ”Œ๋ฆฟ) ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›(๋‹ค์–‘ํ•œ ํƒ€์ž…)์ด ๋“ค์–ด์žˆ์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์ด์—์š”. ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์ฃ ! ๐Ÿ‘€

์ž, ์ด์ œ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ๊ฒŒ ๋˜์…จ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ…œํ”Œ๋ฆฟ์˜ ๋‹ค์–‘ํ•œ ํ™œ์šฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿ› ๏ธ ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ๋ณธ: ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ์ฒซ ๋ฒˆ์งธ๋กœ ์•Œ์•„๋ณผ ๊ฒƒ์€ ๋ฐ”๋กœ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์ด์—์š”. ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ ์ค‘์˜ ๊ธฐ์ดˆ๋ž๋‹ˆ๋‹ค! ๐Ÿ‹๏ธโ€โ™‚๏ธ

ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•ด์š”. ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”?


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

์šฐ์™€! ์ด๊ฒŒ ๋ญ๋ƒ๊ตฌ์š”? ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๐Ÿ˜Ž

  • template <typename T>: ์ด ๋ถ€๋ถ„์ด ํ…œํ”Œ๋ฆฟ ์„ ์–ธ์ด์—์š”. T๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์˜ˆ์š”.
  • T max(T a, T b): ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ๋ชจ๋‘ T๋ฅผ ์‚ฌ์šฉํ•ด์š”.
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€: ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋˜‘๊ฐ™์ด ๋กœ์ง์„ ์ž‘์„ฑํ•ด์š”.

์ด ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ์š”? ์•„์ฃผ ๊ฐ„๋‹จํ•ด์š”!


int main() {
    cout << max(10, 20) << endl;  // ์ •์ˆ˜
    cout << max(3.14, 2.72) << endl;  // ์‹ค์ˆ˜
    cout << max("apple", "banana") << endl;  // ๋ฌธ์ž์—ด
    return 0;
}

์‹ ๊ธฐํ•˜์ฃ ? ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ์˜ ๋งˆ๋ฒ•์ด์—์š”! โœจ

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์–ด์ ธ์š”. ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”. ํ…œํ”Œ๋ฆฟ์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์‹ค์ œ ํƒ€์ž…์œผ๋กœ ์น˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์— ๋”ฐ๋ผ ์—ฐ์‚ฐ์ž๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ max ํ•จ์ˆ˜์—์„œ > ์—ฐ์‚ฐ์ž๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜ฑ

๊ทธ๋Ÿผ ์ด์ œ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์กฐ๊ธˆ ๋” ์‘์šฉํ•ด๋ณผ๊นŒ์š”? ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ ์ˆ˜์˜ ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๋“ฏ, ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋„ ํ•จ๊ป˜ ์•Œ์•„๋ด์š”! ๐Ÿค“

๐ŸŒŸ ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™”

๋•Œ๋กœ๋Š” ํŠน์ • ํƒ€์ž…์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™”์˜ˆ์š”.


template <>
const char* max<const char*>(const char* a, const char* b) {
    return (strcmp(a, b) > 0) ? a : b;
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” strcmp ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๊ตํ•˜๊ฒŒ ๋ผ์š”. ๋˜‘๋˜‘ํ•˜์ฃ ? ๐Ÿ˜

๐ŸŒˆ ๋‹ค์ค‘ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜

ํ•˜๋‚˜์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋• ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!


template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {
    return a + b;
}

์ด ํ•จ์ˆ˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋‘ ๊ฐ’์„ ๋”ํ•  ์ˆ˜ ์žˆ์–ด์š”. auto์™€ decltype์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•˜๊ฒŒ ํ–ˆ์ฃ . C++11 ์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฟ€ํŒ์ด์—์š”! ๐Ÿฏ

ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ๊ฐœ๋…๋„ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™” ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ auto & decltype ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค...

์œ„ ๊ทธ๋ฆผ์„ ๋ณด์„ธ์š”. ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋‹ค์–‘ํ•˜๊ณ  ํ’๋ถ€ํ•ด์š”. ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํŠน์ˆ˜ํ™”, ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ตœ์‹  C++ ๊ธฐ๋Šฅ๊นŒ์ง€! ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๋งŒ๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ๋‹ค์–‘ํ•œ ๋ชจ์Šต์„ ๋งŒ๋‚˜๋ณผ ์ˆ˜ ์žˆ์ฃ . ๐Ÿ˜Š

์ž, ์ด์ œ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ•˜์…จ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive deeper! ๐ŸŠโ€โ™‚๏ธ

๐Ÿ—๏ธ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ: ์ œ๋„ค๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”, ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์–ด๊ฐ€๋Š” ์—ฌ๋Ÿฌ๋ถ„! ๐ŸŽ‰ ์ด์ œ ์šฐ๋ฆฌ๋Š” ํ…œํ”Œ๋ฆฟ์˜ ๋” ๊นŠ์€ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”. ๋ฐ”๋กœ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์ด์—์š”! ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋„ค๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ˜Ž

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์ด ๋ญ๋ƒ๊ตฌ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด, ํƒ€์ž…์— ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, int, double, string ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด? ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์ด ๋”ฑ์ด์ฃ !

์ž, ๊ทธ๋Ÿผ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ


template <typename T>
class Stack {
private:
    vector<T> elements;

public:
    void push(T const& elem) {
        elements.push_back(elem);
    }

    void pop() {
        if (elements.empty()) {
            throw out_of_range("Stack<>::pop(): empty stack");
        }
        elements.pop_back();
    }

    T top() const {
        if (elements.empty()) {
            throw out_of_range("Stack<>::top(): empty stack");
        }
        return elements.back();
    }

    bool empty() const {
        return elements.empty();
    }

    size_t size() const {
        return elements.size();
    }
};

์šฐ์™€! ์ด๊ฒŒ ๋ฐ”๋กœ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์ด์—์š”. ์–ด๋–ค ์ ์ด ํŠน๋ณ„ํ•œ์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿง

  • template <typename T>: ํด๋ž˜์Šค ์„ ์–ธ ์•ž์— ์ด๋ ‡๊ฒŒ ํ…œํ”Œ๋ฆฟ ์„ ์–ธ์„ ํ•ด์š”.
  • vector<T> elements;: T ํƒ€์ž…์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์š”.
  • ๋ชจ๋“  ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ T ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ํƒ€์ž…์˜ ์Šคํƒ์ด๋“  ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜ฎ


int main() {
    Stack<int> intStack;
    Stack<string> stringStack;

    intStack.push(42);
    stringStack.push("Hello, Template!");

    cout << intStack.top() << endl;  // ์ถœ๋ ฅ: 42
    cout << stringStack.top() << endl;  // ์ถœ๋ ฅ: Hello, Template!

    return 0;
}

์‹ ๊ธฐํ•˜์ฃ ? ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ •์ˆ˜ ์Šคํƒ๋„, ๋ฌธ์ž์—ด ์Šคํƒ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ•๋ ฅํ•จ์ด์—์š”! ๐Ÿ’ช

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์— ๋…๋ฆฝ์ ์ธ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”. ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, Stack s;๊ฐ€ ์•„๋‹ˆ๋ผ Stack<int> s;์ฒ˜๋Ÿผ์š”. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๐Ÿ˜…

์ž, ์ด์ œ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”? ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๋„ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ๋งˆ์Šคํ„ฐํ•ด๋ด์š”! ๐Ÿš€

๐ŸŒŸ ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™”

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ๋„ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ํŠน์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŠน์ • ํƒ€์ž…์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜์ฃ .


template <>
class Stack<bool> {
private:
    vector<bool> elements;
    // bool ํƒ€์ž…์— ์ตœ์ ํ™”๋œ ๊ตฌํ˜„
public:
    // ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค...
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด bool ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, bool ํŠนํ™” ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๐Ÿ‘จโ€๐Ÿ”ฌ

๐ŸŒˆ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์—์„œ๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ .


template <typename T = int>
class NumberBox {
private:
    T value;
public:
    NumberBox(T v) : value(v) {}
    T getValue() const { return value; }
};

// ์‚ฌ์šฉ ์˜ˆ
NumberBox box1(42);  // int ํƒ€์ž… ์‚ฌ์šฉ
NumberBox<double> box2(3.14);  // double ํƒ€์ž… ๋ช…์‹œ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ int ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ผ์š”. ํŽธ๋ฆฌํ•˜์ฃ ? ๐Ÿ˜Š

๐Ÿ”ง ๋น„ํƒ€์ž… ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜

ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ผญ ํƒ€์ž…์ผ ํ•„์š”๋Š” ์—†์–ด์š”. ์ƒ์ˆ˜ ๊ฐ’์„ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ต๋‹ˆ๋‹ค!


template <typename T, size_t SIZE>
class FixedArray {
private:
    T arr[SIZE];
public:
    T& operator[](size_t index) {
        return arr[index];
    }
    size_t size() const { return SIZE; }
};

// ์‚ฌ์šฉ ์˜ˆ
FixedArray<int, 5> myArray;

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์š”. ์ปดํŒŒ์ผ ์‹œ์ ์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ . ์ตœ์ ํ™”์— ์œ ์šฉํ•ด์š”! ๐Ÿš€

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ๊ฐœ๋…๋„ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„ ๊ธฐ๋ณธ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™” ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋น„ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ ๋” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ...

์œ„ ๊ทธ๋ฆผ์„ ๋ณด์„ธ์š”. ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋‹ค์–‘ํ•˜๊ณ  ํ’๋ถ€ํ•ด์š”. ๊ธฐ๋ณธ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํŠน์ˆ˜ํ™”, ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋น„ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊นŒ์ง€! ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์žฌ๋Šฅ์„ ๋งŒ๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ๋‹ค์–‘ํ•œ ๋ชจ์Šต์„ ๋งŒ๋‚˜๋ณผ ์ˆ˜ ์žˆ์ฃ . ๐Ÿ˜Š

์ž, ์ด์ œ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ•ด๋ดค์–ด์š”! ์–ด๋– ์‹ ๊ฐ€์š”? ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ•๋ ฅํ•จ์„ ๋Š๋ผ์…จ๋‚˜์š”? ๐Ÿ‘€

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. STL(Standard Template Library)์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค๋„ ๋ชจ๋‘ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ต๋‹ˆ๋‹ค. vector, list, map ๋“ฑ๋“ฑ... ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด์ œ ์ด๋Ÿฐ ๊ฑธ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ˆ์š”! ๐ŸŽ‰

๐Ÿ’ก Pro Tip: ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ํ…œํ”Œ๋ฆฟ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์—„์ฒญ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜ฑ ์ฐจ๊ทผ์ฐจ๊ทผ ์—ฐ์Šตํ•˜๋ฉด์„œ ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑด ์ •๋ง ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด์—์š”! ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go deeper into the template world! ๐Ÿš€

๐Ÿง  ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ปดํŒŒ์ผ ํƒ€์ž„์˜ ๋งˆ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”, ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ๋“ค! ๐ŸŽฉโœจ ์ด์ œ ์šฐ๋ฆฌ๋Š” C++ ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ€์žฅ ๊นŠ๊ณ  ์‹ ๋น„ํ•œ ์˜์—ญ์— ๋„๋‹ฌํ–ˆ์–ด์š”. ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์ฃ ! ์ด๊ฑด ๋งˆ์น˜ ํ•ด๋ฆฌ ํฌํ„ฐ์˜ ๋งˆ๋ฒ• ์„ธ๊ณ„์ฒ˜๋Ÿผ ์‹ ๋น„๋กญ๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ์ˆ ์ด์—์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐Ÿง™โ€โ™‚๏ธ

ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ญ˜๊นŒ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด, ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์—์š”. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ๋„ ์ „์— ๊ณ„์‚ฐ๊ณผ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฑฐ์ฃ ! ๐Ÿ˜ฎ

์™œ ์ด๋Ÿฐ ๊ฑธ ํ•˜๋ƒ๊ตฌ์š”? ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์–ด์š”:

  • ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๐Ÿš€
  • ํƒ€์ž… ์•ˆ์ „์„ฑ ๊ฐ•ํ™” ๐Ÿ›ก๏ธ
  • ์ฝ”๋“œ ์ƒ์„ฑ ์ž๋™ํ™” ๐Ÿค–
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ ๋ฐ ์ตœ์ ํ™” โšก

์ž, ๊ทธ๋Ÿผ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

๐Ÿ”ข ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ

๋จผ์ €, ์ปดํŒŒ์ผ ํƒ€์ž„์— ํŒฉํ† ๋ฆฌ์–ผ์„ ๊ณ„์‚ฐํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณผ๊ฒŒ์š”.


template <unsigned int N>
struct Factorial {
    enum { value = N * Factorial<N-1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

// ์‚ฌ์šฉ ์˜ˆ
constexpr int result = Factorial<5>::value;  // 120

์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— 5!์„ ๊ณ„์‚ฐํ•ด์š”. ์‹คํ–‰ ์‹œ๊ฐ„์—๋Š” ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์ฃ . ์‹ ๊ธฐํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž

๐Ÿงฌ ํƒ€์ž… ํŠน์„ฑ(Type Traits)

C++์˜ type_traits ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ข‹์€ ์˜ˆ์—์š”. ํƒ€์ž…์˜ ํŠน์„ฑ์„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ .


#include <type_traits>

template <typename T>
void process(T value) {
    if constexpr (std::is_integral<T>::value) {
        // ์ •์ˆ˜ ํƒ€์ž…์ผ ๋•Œ์˜ ์ฒ˜๋ฆฌ
        std::cout << "Processing integer: " << value << std::endl;
    } else if constexpr (std::is_floating_point<T>::value) {
        // ๋ถ€๋™์†Œ์ˆ˜์  ํƒ€์ž…์ผ ๋•Œ์˜ ์ฒ˜๋ฆฌ
        std::cout << "Processing float: " << value << std::endl;
    } else {
        // ๊ทธ ์™ธ์˜ ํƒ€์ž…
        std::cout << "Processing unknown type" << std::endl;
    }
}

์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž…์„ ํ™•์ธํ•˜๊ณ , ๊ทธ์— ๋งž๋Š” ์ฝ”๋“œ๋งŒ ์ƒ์„ฑํ•ด์š”. ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์ฃ ! ๐Ÿ‘Œ

๐Ÿ—๏ธ SFINAE (Substitution Failure Is Not An Error)

SFINAE๋Š” ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์—์š”. ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ…œํ”Œ๋ฆฟ๋งŒ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ฃ .


#include <type_traits>

template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void print_number(T value) {
    std::cout << "Integer: " << value << std::endl;
}

template <typename T, typename = std::enable_if_t<std::is_floating_point<T>::value>>
void print_number(T value) {
    std::cout << "Float: " << value << std::endl;
}

// ์‚ฌ์šฉ ์˜ˆ
print_number(42);    // Integer: 42
print_number(3.14);  // Float: 3.14

์ด ์˜ˆ์ œ์—์„œ๋Š” SFINAE๋ฅผ ์‚ฌ์šฉํ•ด ์ •์ˆ˜์™€ ๋ถ€๋™์†Œ์ˆ˜์  ํƒ€์ž…์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•ด์š”. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ์ ์ ˆํ•œ ํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์ฃ . ๋˜‘๋˜‘ํ•ด! ๐Ÿง 

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ฒ˜์Œ์—๋Š” ์–ด๋ ต๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฐ์Šต์„ ํ†ตํ•ด ์ ์  ์ต์ˆ™ํ•ด์งˆ ๊ฑฐ์˜ˆ์š”. ๋ˆ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋„์ „ํ•ด๋ณด์„ธ์š”!

ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋„ ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ ํƒ€์ž… ํŠน์„ฑ SFINAE ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค ๋” ๊นŠ์€ ๋งˆ๋ฒ•์˜ ์„ธ๊ณ„...

์œ„ ๊ทธ๋ฆผ์„ ๋ณด์„ธ์š”. ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๊นŠ๊ณ  ๋„“์–ด์š”. ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ, ํƒ€์ž… ํŠน์„ฑ, SFINAE, ๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค... ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ๊ธ‰ ๋งˆ๋ฒ•์‚ฌ์˜ ๋น„๋ฐ€ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜‰

ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ C++์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๊ณ  ๋ณต์žกํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์—์š”. ์ด๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ์ •๋ง ๋†€๋ผ์šด ๊ฒƒ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ . STL์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด์ œ ์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์˜ˆ์š”! ๐ŸŽ‰

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”. ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ•๋ ฅํ•œ ๋งŒํผ ๋ณต์žกํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”. ๋˜ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์ฃ . ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”! ๐Ÿ’ก

๐Ÿ’ก Pro Tip: ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์ฝ”๋“œ๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”. ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๊ณ , ์ฃผ์„์„ ์ž˜ ๋‹ฌ์•„๋‘๋Š” ๊ฒƒ์ด ์ข‹์•„์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” C++ ํ…œํ”Œ๋ฆฟ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์˜์—ญ์„ ํƒํ—˜ํ–ˆ์–ด์š”. ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ, ๊ทธ๋ฆฌ๊ณ  ๊ณ ๊ธ‰ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•๊นŒ์ง€! ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ์ง„์ •ํ•œ ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ์—์š”! ๐Ÿ†

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์—์š”. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๋” ์œ ์—ฐํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ตœ๊ณ ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์žฌ๋Šฅ์„ ์Šต๋“ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์—ฌ์ •์— ํ…œํ”Œ๋ฆฟ์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ๊ฐ€ ๋”ํ•ด์กŒ์–ด์š”. ์ด๋ฅผ ํ™œ์šฉํ•ด ๋” ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ์„ธ์ƒ์„ ๋†€๋ผ๊ฒŒ ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? Let's code and create magic! โœจ๐Ÿš€

๐ŸŽญ ๋งˆ๋ฌด๋ฆฌ: ํ…œํ”Œ๋ฆฟ์˜ ๋ฏธ๋ž˜์™€ ๋‹น์‹ ์˜ ์—ฌ์ •

์šฐ์™€! ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? ๐Ÿšถโ€โ™‚๏ธ๐Ÿšถโ€โ™€๏ธ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ C++ ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๊นŒ์ง€ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ตœ๊ณ ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ ์ˆ˜์—๊ฒŒ ๊ฐœ์ธ ๋ ˆ์Šจ์„ ๋ฐ›์€ ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜‰

ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์—์š”. ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋Š” ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”. C++20์—์„œ๋Š” ์ฝ˜์…‰ํŠธ(Concepts)๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์ฃ . ์ด๋ฅผ ํ†ตํ•ด ํ…œํ”Œ๋ฆฟ์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”.


template<typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::same_as<T>;
};

template<Addable T>
T add(T a, T b) {
    return a + b;
}

์ด๋Ÿฐ ์‹์œผ๋กœ ํ…œํ”Œ๋ฆฟ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์ฃ . coolํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž

์•ž์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋ฌด๊ถ๋ฌด์ง„ํ•ด์š”:

  • STL์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉฐ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ํ•™์Šตํ•˜๊ธฐ ๐Ÿ“š
  • ์ž์‹ ๋งŒ์˜ ์ œ๋„ค๋ฆญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค์–ด๋ณด๊ธฐ ๐Ÿ› ๏ธ
  • ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•œ ๋””์ž์ธ ํŒจํ„ด ์ตํžˆ๊ธฐ ๐ŸŽจ
  • ์ตœ์‹  C++ ํ‘œ์ค€์˜ ํ…œํ”Œ๋ฆฟ ๊ด€๋ จ ๊ธฐ๋Šฅ ํƒ๊ตฌํ•˜๊ธฐ ๐Ÿ”

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋•Œ๋กœ๋Š” ์–ด๋ ต๊ณ  ๋ณต์žกํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ์—์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๊ฒŒ ๋˜๋ฉด, C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒˆ๋กœ์šด ์ฐจ์›์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๐ŸŒŸ Final Thoughts: ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ์ด์ƒ์ด์—์š”. ์ด๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ์ƒˆ๋กœ์šด ์‹œ๊ฐ์„ ์ œ๊ณตํ•˜์ฃ . ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ฑฐ์˜ˆ์š”. ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ํƒ๊ตฌํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ C++ ์—ฌ์ •์— ์ƒˆ๋กœ์šด ์žฅ์ด ์—ด๋ฆด ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์ง„์ •ํ•œ ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ์—์š”! ๐Ÿ† ์ด ์ง€์‹์„ ํ™œ์šฉํ•ด ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ์„ธ์ƒ์„ ๋†€๋ผ๊ฒŒ ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์—ฌ์ •์— ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธฐ๋ฅผ! Happy coding! ๐ŸŽ‰๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ์˜ ์—ฌ์ • ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ์˜ ์—ฌ์ • ์‹œ์ž‘ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฏธ๋ž˜๋กœ...

์ด ๊ทธ๋ฆผ์€ ์—ฌ๋Ÿฌ๋ถ„์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฑธ์–ด์˜จ ํ…œํ”Œ๋ฆฟ ๋งˆ์Šคํ„ฐ์˜ ์—ฌ์ •์„ ๋ณด์—ฌ์ค˜์š”. ์‹œ์ž‘๋ถ€ํ„ฐ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ, ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ, ๊ทธ๋ฆฌ๊ณ  ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊นŒ์ง€... ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„ ์•ž์—๋Š” ๋” ๋„“์€ ๋ฏธ๋ž˜๊ฐ€ ํŽผ์ณ์ ธ ์žˆ์–ด์š”! ๐ŸŒˆ

ํ…œํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์ด ๊ธ€์„ ํ†ตํ•ด ๊ทธ ์„ธ๊ณ„์˜ ๋งค๋ ฅ์„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋Š๊ผˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ์š”. ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ํ•™์Šตํ•˜๊ณ  ์„ฑ์žฅํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์‹ค๋ ฅ์€ ํ‹€๋ฆผ์—†์ด ํ•˜๋Š˜์„ ์ฐŒ๋ฅผ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ๊ธด ์—ฌ์ •์„ ํ•จ๊ป˜ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ C++ ์ฝ”๋”ฉ ๋ผ์ดํ”„์— ํ…œํ”Œ๋ฆฟ์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ํฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ์š”. ํ™”์ดํŒ…! ๐Ÿ‘Š๐Ÿ˜„