C++ ÅÛÇø´
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 C++ ÅÛÇø´
2 Ŭ·¡½º ÅÆÇø´
2.1 Ŭ·¡½º ÅÆÇø´ ¸¸µé±â
2.2 Ŭ·¡½º ÅÆÇø´ »ç¿ë
2.3 ¼³Á¤ Ŭ·¡½º
2.4 Ŭ·¡½º ÅÆÇø´ Specialization
2.5 ÅÛÇø´ Ŭ·¡½º Partial Specialization
3 ÅÛÇø´ ÇÔ¼ö
4 °ü·Ã±Û

1 C++ ÅÛÇø´

¸¹Àº C++ ÇÁ·Î±×·¥µéÀÌ ½ºÅÃ, Å¥, ¸®½ºÆ®¿Í °°Àº ÀϹÝÀûÀÎ ÀڷᱸÁ¶¸¦ »ç¿ëÇÑ´Ù. ¿¹ÄÁµ¥, ¸Þ½ÃÁö¸¦ Å¥·Î °ü¸®ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ. ÀÌ ¸Þ½ÃÁö Å¥´Â ¸Þ½ÃÁö¸¦ ¿ø¼Ò·Î »ç¿ëÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼­µµ Ȱ¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à Ŭ·¡½º·Î ¸¸µé¾ú´Ù¸é, ÀÚ½ÅÀÇ »óȲ¿¡ ¸Â°Ô Copy, find, replace µîÀÇ ¸Þ¼­µå¸¦ ±¸ÇöÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ´Â °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹ÖÀÇ Àç »ç¿ë¼ºÀ» ÈǸ¢ÇÏ°Ô Áö¿øÇÏ´Â °Íó·³ º¸ÀδÙ.

±×·¯³ª ÀÚ·áÇüÀÌ ´Ù¸¦ °æ¿ì Àç »ç¿ë¼ºÀº ¹°°Ç³Ê °£´Ù. Ŭ·¡½º´Â µ¿ÀÏÇÑ ÀÚ·áÇü¿¡ ´ëÇØ¼­´Â ÈǸ¢ÇÑ Àç »ç¿ë¼ºÀ» º¸¿©ÁÖÁö¸¸, ÀÚ·áÇüÀÌ ´Ù¸¦ °æ¿ì¿¡´Â ±×·¸Áö ¾Ê´Ù. ¸¸¾à Ŭ·¡½º¸¦ ÀڷᱸÁ¶·Î ¹Þ´Â Å¥°¡ ÇÊ¿äÇÏ´Ù¸é, ÇØ´ç ÀڷᱸÁ¶¿¡ ¸Â°Ô (¸¹Àº ºÎºÐÀ»)»õ·Î ±¸ÇöÇØ¾ß ÇÒ °ÍÀÌ´Ù. Ŭ·¡½º ¸íÀÌ ´Þ¶óÁú ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð »ó¼Ó°ú ´ÙÇü¼º °°Àº °³Ã¼ÁöÇâÀû ¿ä¼Ò ȤÀº ÆÐÅÏÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÁö¸¸ Á¦³Ê¸¯ÇÏÁö ¸øÇÏ´Ù.

ÅÛÇø´(Template)Àº Á¦³Ê¸¯ÇÁ·Î±×·¡¹ÖÀ» °¡´ÉÇϵµ·Ï ÇØÁÖ´Â À¯¿ëÇÑ µµ±¸´Ù. C++ÀÇ ÅÆÇø´Àº ÀÚ·áÇüÀÌ ´Ù¸¦ Áö¶óµµ À̸¦ ÃÖ¼ÒÇÑÀÇ ³ë·ÂÀ¸·Î Àç»ç¿ëÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù.

2 Ŭ·¡½º ÅÆÇø´

2.1 Ŭ·¡½º ÅÆÇø´ ¸¸µé±â

Ŭ·¡½º ÅÆÇø´À» ±¸ÇöÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. Ŭ·¡½º¿¡ template Ű¿öµå¸¸ ´õ ÇØÁÖ¸é µÈ´Ù.
template <class T> 
class Stack 
{ 
private: 
    int size; 
    int top; 
    T* stackPtr;     
public: 
    Stack(int = 10); 
    ~Stack() {delete[] stackPtr;} 
    int push_back(const T&); 
    int pop(T&); 
    int isFull(){ return top == size -1;}; 
    int end(){ return top == -1;} 
}; 
 
T´Â ÀÚ·áÇüÀ» ÀǹÌÇϴµ¥, ¾î¶² ÇüÅÂ¶óµµ »ç¿ëÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ¸¸¾à °³¹ßÀÚ°¡ int ÀÚ·áÇüÀ» »ç¿ëÇÑ´Ù¸é T´Â int·Î ġȯµÉ °ÍÀ̰í ÀÌ ½ºÅÃÀº intÇü ÀڷḦ À§ÇÑ Stack·Î »ç¿ëÇÒ ¼ö ÀִٰԵȴÙ. ÀÌ°Ô °¡´ÉÇÑ ÀÌÀ¯´Â ÄÄÆÄÀÏ ½Ã°£¿¡ ÀÚ·áÇüÀ» ÆÇ´ÜÇØ¼­ Äڵ带 ¸¸µé±â ¶§¹®ÀÌ´Ù.

2.2 Ŭ·¡½º ÅÆÇø´ »ç¿ë

¸ÕÀú Ŭ·¡½º ÅÆÇø´À» ¸¸µç´Ù.
// mytemp.h 
template <class T> 
class a 
{ 
public: 
    a(){} 
    int push(const T&) 
    { 
        // ... 
    } 
    ~a(){} 
} 
 

ÀÌÁ¦ »ç¿ëÇÏ¸é µÈ´Ù.
#include "mytemp.h" 
 
int main() 
{ 
    a<int> inta; 
    a<string> stringa; 
} 
 

2.3 ¼³Á¤ Ŭ·¡½º

¼³Á¤ °ªÀ» Àоî¿À´Â Ŭ·¡½º¸¦ ¸¸µç´Ù°í °¡Á¤Çغ¸ÀÚ. ¼³Á¤À» °¡Á®¿À´Â API´Â ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖÀ¸¸ç, À̸¦ È£ÃâÇØ¼­ »ç¿ëÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ. À̰æ¿ì ¼³Á¤°ªÀº ´ëºÎºÐ ±¸Á¶Ã¼¸¦ void *·Î Çüº¯È¯Çؼ­ »ç¿ëÇÒ °Å´Ù.

ÀÌ·¯ÇÑ °æ¿ì ´ÙÀ½°ú °°ÀÌ Å¬·¡½º¸¦ ¸¸µé°í À̸¦ »ó¼ÓÇØ¼­ »ç¿ëÇÑ´Ù¸é, ¹ü¿ëÀûÀ¸·Î »ç¿ë°¡´ÉÇÑ ¼³Á¤ Ŭ·¡½º¸¦ °³¹ßÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
template <class T> class ConfigBase 
{ 
private: 
    vector<T *> cfgVector; 
public: 
    ConfigBase() {} 
    ~ConfigBase() 
    { 
        cfgVector.clear(); 
    } 
 
    // ¿©±â¿¡¼­ ¼³Á¤ API¸¦ È£ÃâÇÏ°í ±× °ªÀº cfgVector¿¡ ³Ö´Â´Ù. 
    // ¼³Á¤À» Àоî¿À´Â ¿ÜºÎ ÇÔ¼ö´Â configread ¶ó°í ÇϰڴÙ.  
    // ¼³Á¤À» ÀúÀåÇϱâ À§ÇѸ޸𸮸¦ ÇÒ´çÇϱ⠶§¹®¿¡ 
    // ¼³Á¤°ªÀ» »ç¿ëÇÏÁö ¾ÊÀ» °Å¶ó¸é configfree ÇÔ¼ö¸¦ È£Ã⠸޸𸮸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.  
    int ReadCfg(const char *cfgname) 
    { 
        T *a; 
        while( (a = (T *)configread()) != NULL) 
        { 
            cfgVector.push_back(a); 
        } 
    } 
    int CfgSize() 
    { 
        return cfgVector.size(); 
    } 
    vector<T> *Fetch() 
    { 
        return &cfgData; 
    } 
 
    void CloseFetch() 
    { 
        configfree(); 
    } 
    virtual int LoadCfg(const char *cfgname) = 0; 
}; 
 

ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ ConfigBase¸¦ »ó¼Ó¹Þ¾Æ¼­ »ç¿ëÇÏ¸é µÈ´Ù. ÀÚ·áÇü¿¡ »ó°ü¾øÀÌ ¼³Á¤À» ÀÐÀ» ¼ö ÀÖ´Ù.
class appCfg : ConfigBase<struct clientInfo> 
{ 
private: 
    vector<clientInfo> *cfgList; 
public: 
    int LoadCfg(const char *cfgname) 
    { 
        cfgList = Fetch(); 
        // ÀÌ·± Àú·± ÀÛ¾÷ ÈÄ 
        CloseFetch(); 
    } 
}; 
 

2.4 Ŭ·¡½º ÅÆÇø´ Specialization

ÅÛÇø´ Ŭ·¡½ºµµ ¿À¹ö¶óÀ̵ùÇÒ ¼ö ÀÖ´Ù.

#include <iostream> 
 
using namespace std ; 
 
template <class T> 
class stream 
{ 
    public: 
        void f() { cout << "stream<T>::f()"<< endl ;} 
} ; 
 
template <> 
class stream<char> 
{ 
    public: 
        void f() { cout << "stream<char>::f()"<< endl ;} 
} ; 
 
int main() 
{ 
    stream<int> si ; 
    stream<char> sc ; 
 
    si.f() ; 
    sc.f() ; 
     
    return 0 ; 
} 
 
À§ ¿¹´Â stream<char>À϶§ ¿ø·¡ Á¤ÀÇµÈ f() ÇÔ¼ö´ë½Å »õ·Î ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵ùÇØ¼­ »ç¿ëÇÏ´Â ¹ýÀ» º¸¿©ÁØ´Ù. ƯÁ¤ ÀÚ·áÇü¿¡ ´ëÇØ¼­ ´Ù¸¥ ÇൿÀ» Á¤ÀÇÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

2.5 ÅÛÇø´ Ŭ·¡½º Partial Specialization

ÅÛÇø´ Ŭ·¡½ºÀÇ typenameÀ» ƯÁ¤Çؼ­, ¿©·¯ ƯȭµÈ ÅÛÇø´À» µ¿½Ã¿¡ ¿î¿ëÇÒ ¼öµµ ÀÖ´Ù.
include <iostream> 
 
using namespace std; 
 
// Base ÅÛÇø´ Ŭ·¡½º 
template<typename T1, typename T2> 
class X 
{ 
public: 
    X(){ cout << "Base Template" << endl; } 
} ; 
 
//partial specialization 
template<typename T1> 
class X<T1, int> 
{ 
public: 
    X() { cout << "T1, int Template" << endl; } 
} ; //C2989 here 
 
int main() 
{ 
    X<char, char> xcc ; 
    X<char, int> xii ; 
 
    return 0 ; 
} 
 
class X<T1, int>¿¡¼­ int ŸÀÔÀ» ƯÁ¤Çؼ­, ÅÛÇø´À» ¿î¿ëÇϰí ÀÖ´Ù. À½ ÅÛÇø´ ¿À¹ö·ÎµùÀ̶ó°í ºÁµµ µÉ °Í °°Àºµ¥. Âü°í·Î ÄÄÆÄÀÏ·¯¿¡ µû¶ó¼­ partial ÅÛÇø´À» Áö¿øÇÏÁö ¾Ê´Â °æ¿ìµµ ÀÖÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î Visual C++ 5.0Àº Áö¿øÇÏÁö ¾Ê´Â´Ù°í ÇÑ´Ù. ¿äÁò¿¡¾ß 8.0ÀÌ»óÀ» »ç¿ëÇϰí ÀÖÀ¸´Ï ¹®Á¦µÉ °Í °°Áø ¾ÊÁö¸¸ È®ÀÎÀº ÇÊ¿äÇÒ °Í °°´Ù.

3 ÅÛÇø´ ÇÔ¼ö

ÅÛÇø´À» ÀÌ¿ëÇϸé, ÄÄÆÄÀÏ ½Ã°£¿¡ µ¥ÀÌÅÍ ÇüÀ» Á¤ÇØÁֹǷΠ¹ü¿ë ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù.
#include <iostream> 
#include <stdio.h> 
#include <string.h> 
 
using namespace std; 
 
template <class T> 
T Sum(T a, T b) 
{ 
    return a + b; 
} 
 
template <> 
char *Sum(char *a, char * b) 
{ 
    return strcat(a, b); 
} 
 
int main() 
{ 
    char a[80]="hello"; 
    char *b = " joinc"; 
    cout << Sum(1, 5) << endl; 
    cout << Sum(8.1, 5.5) << endl; 
    cout << Sum(8.1, 5.5) << endl; 
    cout << Sum(a, b) << endl; 
} 
 
ÅÛÇø´À» ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô ¹ü¿ë µ¡¼À ÇÁ·Î±×·¥À» ¸¸µé¾ú´Ù. ´Ü char ¹®ÀÚ¿­ µ¥ÀÌÅÍÀÇ °æ¿ì µ¡¼À ¿¬»êÀÌ ºÒ°¡´ÉÇϱ⠶§¹®¿¡, char * µ¥ÀÌÅ͸¦ ó¸®Çϱâ À§ÇÑ ÅÛÇø´ ÇÔ¼ö¸¦ º°µµ·Î Á¤ÀÇ Çß´Ù. ´ÙÀ½Àº ÇÁ·Î±×·¥ ½ÇÇà °á°ú´Ù.
6 
13.6 
13.6 
hello joinc 
 

4 °ü·Ã±Û

ÅÂ±× :

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.