๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ํ…œํ”Œ๋ฆฟ

by eazuooz 2022. 8. 18.

ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ

 

C++์—์„œ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// overloading functions
#include <iostream>
using namespace std;

int operate (int a, int b)
{
  return (a*b);
}

double operate (double a, double b)
{
  return (a/b);
}

int main ()
{
  int x=5,y=2;
  double n=5.0,m=2.0;
  cout << operate (x,y) << '\n';
  cout << operate (n,m) << '\n';
  return 0;
}
10
2.5

๋‘๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ 2๊ฐœ์˜ ํ•จ์ˆ˜๋Š” ์ด๋ฆ„๋งŒ ๊ฐ™๊ณ  ์ „๋‹ฌ๋˜๋Š” ๊ฐ’๋“ค์ด ๋‹ค๋ฅธ ํ˜•ํƒœ์ด๊ธฐ ๋–„๋ฌธ์— ๊ฐ๊ฐ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ•จ์ˆ˜๋กœ ์ž‘๋™ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ „๋‹ฌ ์ธ์ž์˜ ํƒ€์ž…์— ๋งž์ถ”์–ด ๊ฐ๊ฐ ์•Œ๋งž์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ

์˜ค๋ฒ„๋กœ๋“œ๋œ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ์ •์˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// overloaded functions
#include <iostream>
using namespace std;

int sum (int a, int b)
{
  return a+b;
}

double sum (double a, double b)
{
  return a+b;
}

int main ()
{
  cout << sum (10,20) << '\n';
  cout << sum (1.0,1.5) << '\n';
  return 0;
}

์—ฌ๊ธฐ, sum๋Š” ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์œผ๋กœ ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€๋งŒ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ณธ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ sum๋Š” ๋งŽ์€ ์œ ํ˜•์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์œ ํ˜•์ด ๋™์ผํ•œ ๋ณธ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ C++์—๋Š” ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ์ด๋ผ๊ณ  ํ•˜๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜•์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ templateํ‚ค์›Œ๋“œ์™€ ๊บพ์‡  ๊ด„ํ˜ธ <>๋กœ ๋ฌถ์ธ ์ผ๋ จ์˜ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ€ ์•ž์— ์˜ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค

template <template-parameters> function-declaration
ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ผ๋ จ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” class๋˜๋Š”typenameํ‚ค์›Œ๋“œ ๋‹ค์Œ์— ์‹๋ณ„์ž๊ฐ€ ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์‹๋ณ„์ž๋Š” ์ผ๋ฐ˜ ์œ ํ˜•์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ์„ ์–ธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ sumํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

template <class SomeType>
SomeType sum (SomeType a, SomeType b)
{
  return a+b;
}

SomeType ํƒ€์ž…์€ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ํƒ€์ž…์œผ๋กœ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’, ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜ ๋“ฑ๋“ฑ ์–ด๋””์—์„œ๋“ ์ง€ ํ•ด๋‹น ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด sum์œ„์— ์ •์˜๋œ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

x = sum<int>(10,20);

sum<int>๋Š” ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ€๋Šฅํ•œ ์ธ์Šคํ„ด์Šคํ™” ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค์ด ๊ฒฝ์šฐ intํ˜ธ์ถœ์—์„œ ํ…œํ”Œ๋ฆฟ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ sumํ•จ์ˆ˜์˜ SomeType์ด intํ˜•์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

int sum (int a, int b)
{
  return a+b;
}

์‹ค์ œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// function template
#include <iostream>
using namespace std;

template <class T>
T sum (T a, T b)
{
  T result;
  result = a + b;
  return result;
}

int main () {
  int i=5, j=6, k;
  double f=2.0, g=0.5, h;
  k=sum<int>(i,j);
  h=sum<double>(f,g);
  cout << k << '\n';
  cout << h << '\n';
  return 0;
}

์œ„์˜ ์˜ˆ์—์„œ๋Š” ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ sum๋‘ ๋ฒˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค์ฒ˜์Œ์—๋Š” type ์˜ ์ธ์ˆ˜๋ฅผ int์‚ฌ์šฉํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” double ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค 

์ปดํŒŒ์ผ๋Ÿฌ๋Š” int ์™€ double ํƒ€์ž…์˜ ํ•จ์ˆ˜ 2๊ฐœ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๋‹ค์Œ ์ ์ ˆํ•œ ๋ฒ„์ „์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.  

T result;

๋ฐ˜ํ™˜๊ฐ’๋„ Tํ˜•์œผ๋กœ ์ปดํŒŒ์ผ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.


์ผ๋ฐ˜์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ๋–„๋Š” <>๊บฝ์‡ ๋กœ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.

k = sum<int> (i,j);

h = sum<double> (f,g);

 

ํ•˜์ง€๋งŒ ํŠน์ •ํ•œ ๊ฒฝ์šฐ sum์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊บพ์‡  ๊ด„ํ˜ธ ์•ˆ์— ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

k = sum (i,j);
h = sum (f,g);

 

// function templates
#include <iostream>
using namespace std;

template <class T, class U>
bool are_equal (T a, U b)
{
  return (a==b);
}

int main ()
{
  if (are_equal(10,10.0))
    cout << "x and y are equal\n";
  else
    cout << "x and y are not equal\n";
  return 0;
}

์ด ์˜ˆ์—์„œ๋Š” ๋‹ค์Œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—์„œ ์ž๋™ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๋ก ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค are_equal.

are_equal(10,10.0)

๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

are_equal<int,double>(10,10.0)

 

 

์œ ํ˜•์ด ์•„๋‹Œ ํ…œํ”Œ๋ฆฟ ์ธ์ˆ˜

ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” class๋˜๋Š” typename์— ์˜ํ•ด ๋„์ž…๋œ ์œ ํ˜•์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠน์ • ์œ ํ˜•์˜ ํ‘œํ˜„์‹๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// template arguments
#include <iostream>
using namespace std;

template <class T, int N>
T fixed_multiply (T val)
{
  return val * N;
}

int main() {
  std::cout << fixed_multiply<int,2>(10) << '\n';
  std::cout << fixed_multiply<int,3>(10) << '\n';
}

fixed_multiplyํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์œ ํ˜•์€ int์ž…๋‹ˆ๋‹ค์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ • ๋˜๋ฏ€๋กœ fixed_multiplyํ•ด๋‹น ์ธ์ˆ˜์˜ ๊ฐ’์€ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์ ˆ๋Œ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.  (๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Œ)

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

DC์˜ ์ •๋ณด์ˆ˜์ •  (0) 2022.09.06
WinMain  (2) 2022.09.05
ํ•จ์ˆ˜  (0) 2022.08.18
๋ช…๋ น๋ฌธ ๋ฐ ํ๋ฆ„ ์ œ์–ด  (0) 2022.08.18
๊ธฐ๋ณธ ์ž…์ถœ๋ ฅ  (0) 2022.08.17

๋Œ“๊ธ€