ν¨μ ν νλ¦Ώ
ν¨μ ν νλ¦Ώμ ν¨μμ μΌλ°ν μμ μ΄λ€. μ¦, ν¨μ ν νλ¦Ώμ int νμ΄λ double νκ³Ό κ°μ ꡬ체μ μΈ λ°μ΄ν°νμ ν¬κ΄ν μ μλ μΌλ°νμΌλ‘ ν¨μλ₯Ό μ μνλ€. ν νλ¦Ώμ ꡬ체μ μΈ λ°μ΄ν°ν λμ , μΌλ°νμΌλ‘ νλ‘κ·Έλλ°μ νκ² λλ―λ‘ μ΄κ²μ μΌλ°ν νλ‘κ·Έλλ°(generic programming)μ΄λΌκ³ νλ€. λ°μ΄ν°νμ΄ λ§€κ°λ³μμ μν΄ ννλλ―λ‘, ν νλ¦Ώμ λλ‘λ 맀κ°λ³μμ λ°μ΄ν°ν(parameterized type)μ΄λΌκ³ ν¨.
μ¬μ© μμ
//ν¨μ ν νλ¦Ώ μν
template <class Amy>
void Swap(Any &a, Any &b);
//ν¨μ ν νλ¦Ώ μ μ
template<class Any>
void Swap(Any &a,Any &b)
{
Any temp;
temp=a;
a=b;
b=temp;
}
ν νλ¦Ώμ μ€λ² λ‘λ©
μΌλ°μ μΈ μ€λ² λ‘λ©κ³Ό λ§μ°¬κ°μ§λ‘, ν νλ¦Ώμ μ€λ² λ‘λ©ν λμλ νμ€νκ² κ΅¬λΆλλ ν¨μ μκ·Έλ΄μ²λ₯Ό μ¬μ©ν΄μΌ ν¨
μ¬μ© μμ
template <typename T> //μλ³Έ ν νλ¦Ώ
void Swap(T &a,T &b);
template<typename T> //μΆκ° ν νλ¦Ώ
void Swap(T *a,T *b,int n);
...
template<typename T>
void Swap(T &a,T &b)
{
T temp;
temp = a;
a=b;
b=temp;
}
template<typename T>
void Swap(T a[],T b[],int n)
{
T temp;
...
}
ν νλ¦Ώ μ ν
λ€μκ³Ό κ°μ ν νλ¦Ώ ν¨μκ° μλ€κ³ κ°μ
template <class T>
void f(T a,T b)
{...}
Tνμ΄ built-in λ°°μ΄νμΌ κ²½μ°
a=b; μ κ°μ ꡬ문μ μ°Έμ΄ μλλ€.
λͺ μμ νΉμν
struct job
{
char name[40];
double salary;
int floor;
};
μ΄λ¬ν ꡬ쑰체 λ κ°λ₯Ό λ§λ ν, λ ꡬ쑰체μ λ΄μ©μ κ΅ννλ €κ³ ν λ μλ³Έ ν νλ¦Ώμ λ€μκ³Ό κ°μ μ½λλ₯Ό μ¬μ©νμ¬ λ΄μ©μ κ΅ν
temp=a;
a=b;
b=temp;
C++μμλ νλμ ꡬ쑰체λ₯Ό λ€λ₯Έ νλμ ꡬ쑰체μ λμ ν μ μκΈ° λλ¬Έμ, Anyνμ΄ job κ΅¬μ‘°μ²΄μΈ κ²½μ°μλ μμ μ½λλ μ λμν¨. κ·Έλ¬λ salaryμ floor λ©€λ²λ§ κ΅ννκ³ , name λ©€λ²λ κ·Έλλ‘ λκ³ μΆλ€κ³ κ°μ -> λͺ μμ νΉμν(explicit specialization)λΌλ νΉμνλ ν¨μ μ μλ₯Ό, νμν μ½λμ ν¨κ» μ 곡 κ°λ₯
μ»΄νμΌλ¬κ° ν¨μ νΈμΆμ μ νν λμνλ νΉμνλ μ μλ₯Ό λ°κ²¬νλ©΄, ν νλ¦Ώμ μ°Ύμ§ μκ³ κ·Έ μ μλ₯Ό μ¬μ©ν¨. μ΄λ¬ν νΉμν νμμ C++κ° λ°μ νλ©΄μ κ³μ λ³νν΄μλ€.
3μΈλ νΉμν(ISO/ANSI C++ νμ€)
νΉμν λ°©μμ λͺ¨λ μ€νν ν, C++98 νμ€μ μ΄ λ°©μμ λ€μκ³Ό κ°μ΄ μ 립ν¨.
- ν¨μ μ΄λ¦μ΄ νλ μ£Όμ΄μ§λ©΄, μ¬μ©μλ ν νλ¦Ώμ΄ μλ ν¨μ, ν νλ¦Ώ ν¨μ, λͺ μμ νΉμν ν νλ¦Ώ ν¨μλ₯Ό κ°μ§ μ μλ€. λν μ΄ λͺ¨λ κ²λ€μ μ€λ² λ‘λ© λ²μ λ κ°μ§ μ μλ€.
- λͺ μμ νΉμνλ₯Ό νκΈ° μν μνκ³Ό μ μ μμ template <>κ° μμΌ νλ€. κ·Έλ¦¬κ³ κ·Έ νΉμνμ μ΄λ¦μ μμ ν΄μΌ νλ€.
- νΉμνλ ν νλ¦Ώμ 무μνκ³ , ν νλ¦Ώμ΄ μλ ν¨μλ νΉμνμ ν νλ¦Ώ λ λ€ λ¬΄μ
λ€μμ jobν ꡬ쑰체λ₯Ό κ΅ννλ μΈ κ°μ§ νμμ ν¨μ μν
//ν νλ¦Ώμ΄ μλ ν¨μ μν
void Swap(job &,job &);
//ν νλ¦Ώ μν
template<typename T>
void Swap(T &,T &);
//jobνμ μν λͺ μμ νΉμν
template<> void Swap<job>(job &,job &);
->jobνμ μν νΉμνλΌλ κ²μ ν¨μ 맀κ°λ³μμ λ°μ΄ν°νμ΄ μλ €μ£ΌκΈ° λλ¬Έμ, Swap <job>μ μλ <job>μ μλ΅ κ°λ₯
μνλ λ€μκ³Ό κ°μ΄ λ€μ μμ± κ°λ₯
template<>void Swap(job &,job &); //λ κ°λ¨ν¨.
ꡬ체νμ νΉμν
μ»΄νμΌλ¬κ° νΉμ λ°μ΄ν°νμ λ§λ ν¨μ μ μλ₯Ό μμ±νκΈ° μν΄ ν νλ¦Ώμ μ¬μ©ν λ, κ·Έ κ²°κ³Όλ₯Ό ν νλ¦Ώμ ꡬ체νλΌ νλ€.
template<typename T>
void Swap(T &a,T &b);
...
int main()
{
...
Swap(i,j); //i,jλ intν
}
Swap(i,j) ν¨μ νΈμΆμ, μ»΄νμΌλ¬κ° intνμ μ¬μ©νλ Swap()μ ꡬ체ννκ² λ§λ λ€.
ν νλ¦Ώμ ν¨μ μ μκ° μλλΌ intνμ μ¬μ©νλ νΉμ ꡬ체νκ° ν¨μ μ μμ΄λ€. μ΄λ¬ν λ°©μμ ꡬ체νλ₯Ό μμμ ꡬ체νλΌ ν¨.
λͺ μμ ꡬ체ν λ¬Έλ²
<> νκΈ°λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°νμ λνλ΄κ³ , μ μΈ μμ templateμ μ¬μ©
template void Swap<int> (int,int); //λͺ μμ ꡬ체ν
->Swap() ν νλ¦Ώμ μ¬μ©νμ¬ int νμ λ§λ ν¨μ μ μλ₯Ό μμ±νλΌ.
λͺ μμ ꡬ체νλ₯Ό λͺ μμ νΉμνμ μλ‘ λΉκ΅ν΄λ³΄μ.
λͺ μμ νΉμνλ λλ±ν λ€μ λ μ μΈ μ€μμ ν κ°λ₯Ό μ¬μ©ν¨.
template<>void Swap<int>(int &,int &);
template<>void Swap(int &,int &);
->ν¨μ μ μλ₯Ό μμ±νκΈ° μν΄ Swap() ν νλ¦Ώμ μ¬μ©νμ§ λ§κ³ , intνμ λ§κ² νΉλ³ν λͺ μμ μΌλ‘ μ μλ ν¨μ μ μλ₯Ό μ¬μ©. λͺ μμ νΉμν μ μΈμ ν€μλ template λ€μ <>λ₯Ό κ°μ§λ λ°λ©΄, λͺ μμ ꡬ체νλ <>λ₯Ό μλ΅
μμμ ꡬ체ν, λͺ μμ ꡬ체ν,λͺ μμ νΉμνλ₯Ό λͺ¨λ νΉμνλΌκ³ νλ€. μ΄λ€μ 곡ν΅μ μ λͺ¨λ ꡬ체μ μΈ λ°μ΄ν°νμ μ¬μ©νλ ν¨μ μ μλ₯Ό λνλΈλ€λ κ²μ΄λ€.
μ€λ² λ‘λ© λΆμ
- ν보 ν¨μλ€μ λͺ©λ‘μ λ§λ λ€
- λ§€κ° λ³μμ κ°μκ° μΌμΉνλ ν¨μλ€μ λͺ©λ‘μ λ§λ λ€
- κ°μ₯ μ λΉν ν¨μκ° μλμ§ νλ¨
may('B'); //μ€μ 맀κ°λ³μκ° char ν
void may(int); //#1
float may(float,float=3);//#2
void may(char); //#3
char *may(const char *);//#4
char may(const char &);//#5
template<class T> void may(const T &);//#6
template<class T> void may(T *); //#7
#4μ #7μ μ μνμ΄ ν¬μΈν°νμΌλ‘ λ³νλ μ μμΌλ―λ‘ νλ½
μ»΄νμΌλ¬λ μ΄μλ¨μ λ€μ― κ° ν¨μ μ€μμ μ΅μ μ κ²μ 골λΌμΌ ν¨.
μ΄μλ¨μ ν보 ν¨μλ€μ νμ 맀κ°λ³μμ μ€μ 맀κ°λ³μλ₯Ό λμμν€κΈ° μν΄μ, μ»΄νμΌλ¬λ νμν λ³νμ μνν¨
- 맀κ°λ³μκ° μ ννκ² λμνλ κ², μΌλ° ν¨μκ° ν νλ¦Ώλ³΄λ€ μμκ° λλ€.
- μΉκΈ λ³ν(μλ₯Ό λ€λ©΄, charμ shortλ₯Ό int νμΌλ‘, floatλ₯Ό doubleνμΌλ‘ μλ λ³ν)
- νμ€ λ³ν(intλ₯Ό charλ‘, longμ doubleλ‘ λ³ν)
- ν΄λμ€ μ μΈμμ μ μλλ λ³νκ³Ό κ°μ, μ¬μ©μ μ μ λ³ν
μ νν λμκ³Ό μ΅μ μ λμ
c++λ μ νν λμμ λ§λ€κΈ° μν΄ λͺ κ°μ§ μ¬μν λ³νμ νμ©
λ³ν μ μ€μ 맀κ°λ³μ | λ³ν ν νμ 맀κ°λ³μ |
Type | Type & |
Type & | Type |
Type [] | * Type |
Type(argument-list) | Type(*)(argument-list) |
Type | const Type |
Type | volatile Type |
Type * | const Type * |
Type * | volatile Type * |
//Typeμ μμμ λ°μ΄ν°ν
//char &κ³Ό κ°μ λ°μ΄ν°νλ Typeνμ΄ λ μ μλ€.
//Type(argument-list)λ μ€μ 맀κ°λ³μλ‘ μ¬μ©λλ ν¨μ μ΄λ¦μ΄, νμ 맀κ°λ³μλ‘ μ¬μ©λλ ν¨μ ν¬μΈν°μ λμ
λμνλ μνμ΄ μ¬λ¬ κ° μ‘΄μ¬νλ©΄, μ»΄νμΌλ¬λ μ€λ² λ‘λ© λΆμ μ μ°¨λ₯Ό μλ£ν μ μμ§λ§ λλ‘λ μ ννκ² λμνλ ν¨μκ° λ κ° μΈλ°λ λΆκ΅¬νκ³ μ€λ²λ‘λ© λΆμμ μννλ κ²½μ°κ° μλ€.
ex) constκ° μλ λ°μ΄ν°λ₯Ό μ§μνλ ν¬μΈν°μ μ°Έμ‘°λ, constκ° μλ ν¬μΈν°μ μ°Έμ‘° 맀κ°λ³μμ λμν¨.
νλμ μ νν λμμ΄ λ€λ₯Έ λμλ³΄λ€ λ μ’μ μ΄μ λ, νλλ ν νλ¦Ώμ΄ μλ ν¨μκ³ , λ€λ₯Έ νλλ ν νλ¦Ώ ν¨μμΌ λμ΄λ€.
μ΄λ¬ν κ²½μ°, ν νλ¦Ώμ΄ μλ ν¨μκ° λͺ μμ νΉμνλ₯Ό ν¬ν¨νλ ν νλ¦Ώ ν¨μλ³΄λ€ λ μ’μ κ²μΌλ‘ κ°μ£Ό
λ λ€ ν νλ¦Ώ ν¨μ μ΄λ©΄μ μ ννκ² λμν κ²½μ°, νΉμνλ ν νλ¦Ώ ν¨μκ° μ’ λ μ’μ ν¨μμ΄λ€.
λ€μκ³Ό κ°μ λ κ°μ ν νλ¦Ώμ΄ μλ€κ³ κ°μ νμ.
template<class Type>void recycle(Type t); //#1
template<class Type>void recycle(Type *t)//#2
...
struct blot{int a;char b[10];};
blot ink={25,"spots"};
...
recycle(&ink);
recycle νΈμΆμ blot *λ‘ ν΄μλλ Typeμ κ°μ§ ν νλ¦Ώ #1μ λμ, inkκ° TypeμΌ κ²½μ° ν νλ¦Ώ #2μ λμ
recycle<blot *>(blot *)μ μμ±λλ λμ€μ λ³νμ΄ λ μ κ² μΌμ΄λλ―λ‘ λ νΉμν κ²μΌλ‘ κ°μ£Όλ¨.