๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ‘จ๐Ÿพ‍๐Ÿ’ป C++

ํด๋ž˜์Šค(2)

by eazuooz 2022. 8. 19.

์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

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

int a, b, c;
a = b + c;

์—ฌ๊ธฐ์—์„œ ๊ธฐ๋ณธํ˜•( )์˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋Š” int๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•œ ๋‹ค์Œ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์‚ฐ์ˆ  ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์˜ ์˜๋ฏธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์ง€๋งŒ ํŠน์ • ํด๋ž˜์Šค ์œ ํ˜•์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

struct myclass {
  string product;
  float price;
} a, b, c;
a = b + c;

b์—ฌ๊ธฐ์„œ ๋ง์…ˆ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๊ณ  ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋Š” ๋ถ„๋ช… cํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด ์ฝ”๋“œ๋งŒ์œผ๋กœ๋Š” ์œ ํ˜• myclass์— ์ถ”๊ฐ€ ๋™์ž‘์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ C++์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฑฐ์˜ ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ์ž ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

+    -    *    /    =    <    >    +=   -=   *=   /=   <<   >>
<<=  >>=  ==   !=   <=   >=   ++   --   %    &    ^    !    |
~    &=   ^=   |=   &&   ||   %=   []   ()   ,    ->*  ->   new 
delete    new[]     delete[]

์—ฐ์‚ฐ์ž๋Š” operatorํŠน์ˆ˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์˜ค๋ฒ„๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฆ„์€ operatorํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ๋’ค์— ์˜ค๋ฒ„๋กœ๋“œ๋œ ์—ฐ์‚ฐ์ž ๊ธฐํ˜ธ ๊ฐ€ ์˜ต๋‹ˆ๋‹ค . ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

type operator sign (parameters) { /*... body ...*/ }
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์นด๋ฅดํŠธ ๋ฒกํ„ฐ ๋Š” ๋‘ ์ขŒํ‘œ ์„ธํŠธ x๋ฐ y์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฐ์นด๋ฅดํŠธ ๋ฒกํ„ฐx ์˜ ๋ง์…ˆ ์—ฐ์‚ฐ์€ ๋‘ ์ขŒํ‘œ๋ฅผ ํ•จ๊ป˜ ๋”ํ•˜๊ณ  ๋‘ ์ขŒํ‘œ๋ฅผ ํ•จ๊ป˜ ๋”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค y. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์นด๋ฅดํŠธ ๋ฒกํ„ฐ (3,1) ์™€ (1,2)ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•˜๋ฉด (3+1,1+2) = (4,3). ์ด๊ฒƒ์€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C++๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// overloading operators example
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int a,int b) : x(a), y(b) {}
    CVector operator + (const CVector&);
};

CVector CVector::operator+ (const CVector& param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return temp;
}

int main () {
  CVector foo (3,1);
  CVector bar (1,2);
  CVector result;
  result = foo + bar;
  cout << result.x << ',' << result.y << '\n';
  return 0;
}

์˜ ๋„ˆ๋ฌด ๋งŽ์€ ๋ชจ์–‘์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋ฉด CVector๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ํด๋ž˜์Šค ์ด๋ฆ„(์ฆ‰, ์œ ํ˜•) ์„ ์ฐธ์กฐ CVectorํ•˜๊ณ  ์ผ๋ถ€๋Š” ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜(์ฆ‰, ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์ƒ์„ฑ์ž)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

CVector (int, int) : x(a), y(b) {}  // function name CVector (constructor)
CVector operator+ (const CVector&); // function that returns a CVector

operator+ํด๋ž˜์Šค ์˜ ๊ธฐ๋Šฅ ์€ ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•œ CVector๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž( )๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค . +์ผ๋‹จ ์„ ์–ธ๋˜๋ฉด ์ด ํ•จ์ˆ˜๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

c = a + b;
c = a.operator+ (b);

๋‘ ํ‘œํ˜„ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋“œ๋Š” ๋ชจ๋“  ๋™์ž‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ ์˜ค๋ฒ„๋กœ๋“œ์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์—ฐ์‚ฐ์ด ์—ฐ์‚ฐ์ž์˜ ์ˆ˜ํ•™์  ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ์™€ ๊ด€๋ จ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ์—†์ง€๋งŒ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด operator+์‹ค์ œ๋กœ ๋นผ๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œํ•˜๊ฑฐ๋‚˜ operator==๊ฐœ์ฒด๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ํด๋ž˜์Šค๋Š” ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋“œ์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜operator+๋‹น์—ฐํžˆ ์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ”ผ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ์ดํ•ญ ์—ฐ์‚ฐ์ž(์™ผ์ชฝ์— ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์— ํ•˜๋‚˜์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” ์—ฐ์‚ฐ์ž)์— ๊ณตํ†ต์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šด์˜์ž๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ๊ฐ๊ฐ์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์š”์•ฝ์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค( @๊ฐ ๊ฒฝ์šฐ์— ์—ฐ์‚ฐ์ž๋กœ ๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค).

ํ‘œํ˜„์šด์˜์ž๋ฉค๋ฒ„ ํ•จ์ˆ˜๋น„ํšŒ์› ํ•จ์ˆ˜

expression operator member function non member function
@a + - * & ! ~ ++ -- A::operator@() operator@(A)
a@ ++ -- A::operator@(int) operator@(A,int)
a@b + - * / % ^ & | < > == != <= >= << >> && || , A::operator@(B) operator@(A,B)
a@b = += -= *= /= %= ^= &= |= <<= >>= [] A::operator@(B) -
a(b,c...) () A::operator()(B,C...) -
a->b -> A::operator->() -
(TYPE) a TYPE A::operator TYPE() -

์—ฌ๊ธฐ์„œ a๋Š” class ์˜ ๊ฐ์ฒด A์ด๊ณ  ๋Š” class ์˜ ๊ฐ์ฒด ์ด๊ณ  ๋Š” bclass ์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค . ๋ชจ๋“  ์œ ํ˜•์ž…๋‹ˆ๋‹ค(์—ฐ์‚ฐ์ž๋Š” type ์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ์˜ค๋ฒ„๋กœ๋“œํ•จ ). ์ผ๋ถ€ ์—ฐ์‚ฐ์ž๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋˜๋Š” ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜์˜ ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” ์— ๋Œ€ํ•œ ์œ„์˜ ์˜ˆ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์—ฐ์‚ฐ์ž๋Š” ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๋Š” ์ ์ ˆํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:BcCTYPETYPE

// non-member operator overloads
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {}
    CVector (int a, int b) : x(a), y(b) {}
};


CVector operator+ (const CVector& lhs, const CVector& rhs) {
  CVector temp;
  temp.x = lhs.x + rhs.x;
  temp.y = lhs.y + rhs.y;
  return temp;
}

int main () {
  CVector foo (3,1);
  CVector bar (1,2);
  CVector result;
  result = foo + bar;
  cout << result.x << ',' << result.y << '\n';
  return 0;
}

The keyword this

ํ‚ค์›Œ๋“œ this๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐœ์ฒด ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์šฉ๋„ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๊ฐœ์ฒด ์ž์ฒด์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// example on this
#include <iostream>
using namespace std;

class Dummy {
  public:
    bool isitme (Dummy& param);
};

bool Dummy::isitme (Dummy& param)
{
  if (&param == this) return true;
  else return false;
}

int main () {
  Dummy a;
  Dummy* b = &a;
  if ( b->isitme(a) )
    cout << "yes, &a is b\n";
  return 0;
}

operator=์ฐธ์กฐ๋กœ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์—์„œ๋„ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค . ์ด์ „์— ๋ณธ ๋ฐ์นด๋ฅดํŠธ ๋ฒกํ„ฐ ์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ฅด๋ฉด ํ•ด๋‹น operator=๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CVector& CVector::operator= (const CVector& param)
{
  x=param.x;
  y=param.y;
  return *this;
}

์‚ฌ์‹ค, ์ด ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค operator=.

 

์ •์  ๋ฉค๋ฒ„

ํด๋ž˜์Šค์—๋Š” ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ •์  ๋ฉค๋ฒ„๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ์ •์  ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋Š” ๋™์ผํ•œ ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ณตํ†ต ๋ณ€์ˆ˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "ํด๋ž˜์Šค ๋ณ€์ˆ˜"๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ˆ˜์—….

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ํ˜„์žฌ ํ• ๋‹น๋œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์นด์šดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค ๋‚ด์˜ ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// static members in classes
#include <iostream>
using namespace std;

class Dummy {
  public:
    static int n;
    Dummy () { n++; };
};

int Dummy::n=0;

int main () {
  Dummy a;
  Dummy b[5];
  cout << a.n << '\n';
  Dummy * c = new Dummy;
  cout << Dummy::n << '\n';
  delete c;
  return 0;
}

์‹ค์ œ๋กœ ์ •์  ๋ฉค๋ฒ„๋Š” ๋น„๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ–์ง€๋งŒ ํด๋ž˜์Šค ๋ฒ”์œ„๋ฅผ ์ฆ๊น๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์™ธ๋ถ€์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด:

int Dummy::n=0;

๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ณตํ†ต ๋ณ€์ˆ˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋กœ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ด๋Š” ์ •์  ๋ฉค๋ฒ„์—๋งŒ ์œ ํšจํ•จ).

cout << a.n;
cout << Dummy::n;

์œ„์˜ ๋‘ ํ˜ธ์ถœ์€ ๋™์ผํ•œ ๋ณ€์ˆ˜, ์ฆ‰ ์ด ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” nํด๋ž˜์Šค ๋‚ด์˜ ์ •์  ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค . ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๋Š” ๋น„๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๊ฐ™์ง€๋งŒ ํด๋ž˜์Šค(๋˜๋Š” ๊ฐœ์ฒด)์˜ ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์ •์  ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋™์ผํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ๊ณตํ†ต์ธ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋กœ, ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์ฒ˜๋Ÿผ ์•ก์„ธ์Šค๋ฉ๋‹ˆ๋‹ค. ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค์˜ ๋น„์ •์  ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ์•„๋‹˜). ๋‘˜ ๋‹ค ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .Dummy

Const ๋ฉค๋ฒ„ ํ•จ์ˆ˜

ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ์ฒด๋กœ ๊ทœ์ •๋˜๋Š” ๊ฒฝ์šฐ const:

const MyClass myobject;

ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๊ฐ€ constํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ์ž๋Š” ์—ฌ์ „ํžˆ ํ˜ธ์ถœ๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// constructor on const object
#include <iostream>
using namespace std;

class MyClass {
  public:
    int x;
    MyClass(int val) : x(val) {}
    int get() {return x;}
};

int main() {
  const MyClass foo(10);
// foo.x = 20;            // not valid: x cannot be modified
  cout << foo.x << '\n';  // ok: data member x can be read
  return 0;
}

๊ฐ์ฒด ์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋Š” ์ž์‹ ์ด ๋ฉค๋ฒ„ const๋กœ ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . const์œ„์˜ ์˜ˆ์—์„œ get๋กœ ์ง€์ •๋˜์ง€ ์•Š์€ ๋ฉค๋ฒ„ const๋Š” ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค foo. ๋ฉค๋ฒ„๊ฐ€ ๋ฉค๋ฒ„์ž„์„ ์ง€์ •ํ•˜๊ธฐ const์œ„ํ•ด constํ‚ค์›Œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋‹ซ๋Š” ๊ด„ํ˜ธ ๋’ค์— ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

int get() const {return x;}

const๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ํ˜•์‹์„ ํ•œ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ const๋ฉค๋ฒ„๋ฅผ ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค const. ๋‘˜ ๋‹ค ๋…๋ฆฝ์ ์ด๋ฉฐ ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

int get() const {return x;}        // const member function
const int& get() {return x;}       // member function returning a const&
const int& get() const {return x;} // const member function returning a const&

๋กœ ์ง€์ •๋œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ const๋Š” ๋น„์ •์  ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋น„ const๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ const๊ตฌ์„ฑ์›์€ ๊ฐœ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

const๊ฐ์ฒด๋Š” ๋กœ ํ‘œ์‹œ๋œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—๋งŒ ์•ก์„ธ์Šคํ•˜๋„๋ก ์ œํ•œ const๋˜์ง€๋งŒ ๋น„ const๊ฐ์ฒด๋Š” ์ œํ•œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ const๋น„ const๋ฉค๋ฒ„ ํ•จ์ˆ˜์™€ ๋ชจ๋‘์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ฐœ์ฒด๋ฅผ ๊ฑฐ์˜ ์„ ์–ธํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ const๋”ฐ๋ผ์„œ ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ const๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ const ๊ฐœ์ฒด๋Š” ์‹ค์ œ๋กœ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์ฐธ์กฐ๋กœ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ๋ฉค๋ฒ„ const์—๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .const

// const objects
#include <iostream>
using namespace std;

class MyClass {
    int x;
  public:
    MyClass(int val) : x(val) {}
    const int& get() const {return x;}
};

void print (const MyClass& arg) {
  cout << arg.get() << '\n';
}

int main() {
  MyClass foo (10);
  print(foo);

  return 0;
}

์ด ์˜ˆ์—์„œ ๊ฐ€ ๋ฉค๋ฒ„ get๋กœ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ์ฒด๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์—๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜ ์—์„œ ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” constness์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜๋Š” is ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ์„œ๋ช…์„ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฒ„์ „์€ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ const์ด๊ณ  non - version์€ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ non-์ผ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค .constarg.get()printconstconst

// overloading members on constness
#include <iostream>
using namespace std;

class MyClass {
    int x;
  public:
    MyClass(int val) : x(val) {}
    const int& get() const {return x;}
    int& get() {return x;}
};

int main() {
  MyClass foo (10);
  const MyClass bar (20);
  foo.get() = 15;         // ok: get() returns int&
// bar.get() = 25;        // not valid: get() returns const int&
  cout << foo.get() << '\n';
  cout << bar.get() << '\n';

  return 0;
}

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ

ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•˜์—ฌ ํด๋ž˜์Šค๊ฐ€ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

template <class T>
class mypair {
    T values [2];
  public:
    mypair (T first, T second)
    {
      values[0]=first; values[1]=second;
    }
};

๋ฐฉ๊ธˆ ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” ์œ ํšจํ•œ ์œ ํ˜•์˜ ๋‘ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜์—ฌ int๊ฐ’์ด 115์™€ 36์ธ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ ๊ฐ’ ์œ ํ˜•์„ ์ €์žฅํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

mypair<int> myobject (115, 36);

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

mypair<double> myfloats (3.0, 2.18);

์ƒ์„ฑ์ž๋Š” ์ด์ „ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์œ ์ผํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ด๋ฉฐ ํด๋ž˜์Šค ์ •์˜ ์ž์ฒด ๋‚ด์—์„œ ์ธ๋ผ์ธ์œผ๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์ •์˜ ์™ธ๋ถ€์— ์ •์˜๋œ ๊ฒฝ์šฐ template <...>์ ‘๋‘์‚ฌ๊ฐ€ ์•ž์— ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

template <class T>
class mypair {
    T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    T getmax ();
};

template <class T>
T mypair<T>::getmax ()
{
  T retval;
  retval = a>b? a : b;
  return retval;
}

int main () {
  mypair <int> myobject (100, 75);
  cout << myobject.getmax();
  return 0;
}

๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ •์˜ ๊ตฌ๋ฌธ์„ ํ™•์ธํ•˜์„ธ์š” getmax.

template <class T>
T mypair<T>::getmax ()

๋„ˆ๋ฌด ๋งŽ์€ T's์— ์˜ํ•ด ํ˜ผ๋ž€? ์ด ์„ ์–ธ ์—๋Š” ์„ธ ๊ฐœ์˜ T's๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ T๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ ๋ฒˆ์งธ T(๊บพ์‡  ๊ด„ํ˜ธ ์‚ฌ์ด)๋„ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ ๋ณ€์ˆ˜๋„ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ ๋ณ€์ˆ˜์ž„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ์ „๋ฌธํ™”

ํŠน์ • ์œ ํ˜•์ด ํ…œํ”Œ๋ฆฟ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋  ๋•Œ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ…œํ”Œ๋ฆฟ ์ „๋ฌธํ™” ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  ์œ ํ˜•์˜ ์š”์†Œ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ผ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋งŒ

์žˆ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜•์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•จ์ˆ˜ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌ ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•œ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ์ „๋ฌธํ™”๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.mycontainerincreasecharuppercase

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

// class template:
template <class T>
class mycontainer {
    T element;
  public:
    mycontainer (T arg) {element=arg;}
    T increase () {return ++element;}
};

// class template specialization:
template <>
class mycontainer <char> {
    char element;
  public:
    mycontainer (char arg) {element=arg;}
    char uppercase ()
    {
      if ((element>='a')&&(element<='z'))
      element+='A'-'a';
      return element;
    }
};

int main () {
  mycontainer<int> myint (7);
  mycontainer<char> mychar ('j');
  cout << myint.increase() << endl;
  cout << mychar.uppercase() << endl;
  return 0;
}

๋‹ค์Œ์€ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ์ „๋ฌธํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค

template <> class mycontainer <char> { ... };

์šฐ์„ , template<>๋นˆ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์„ ํฌํ•จํ•˜์—ฌ ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์œ ํ˜•์ด ์•Œ๋ ค์ ธ ์žˆ๊ณ  ์ด ์ „๋ฌธํ™”์— ํ…œํ”Œ๋ฆฟ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ์ „๋ฌธํ™”์ด๋ฏ€๋กœ ๊ทธ ์ž์ฒด๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์ ‘๋‘์‚ฌ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ <char>ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ ์ด๋ฆ„ ๋’ค์˜ ์ „๋ฌธํ™” ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ˆ˜ํ™” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž์ฒด๋Š” ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค๊ฐ€ ํŠน์ˆ˜ํ™”๋˜๋Š” ์œ ํ˜•์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค( char). ์ผ๋ฐ˜ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ๊ณผ ์ „๋ฌธํ™” ๊ฐ„์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•˜์„ธ์š”.

template <class T> class mycontainer { ... };
template <> class mycontainer <char> { ... };

์ฒซ ๋ฒˆ์งธ ์ค„์€ ์ผ๋ฐ˜ ํ…œํ”Œ๋ฆฟ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์ค„์€ ์ „๋ฌธํ™”์ž…๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ „๋ฌธํ™”๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ผ๋ฐ˜ ํ…œํ”Œ๋ฆฟ์—์„œ ์ „๋ฌธํ™”๋กœ์˜ "์ƒ์†" ๋ฉค๋ฒ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๊ฒฝ์šฐ์—๋„ ๋ชจ๋“  ํ•ด๋‹น ๋ฉค๋ฒ„๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€