Qaupot Blog
Software Engineering, Trip

501. Template

πŸ• Fri, 19 Aug 2016 09:00:00 GMT

Template

template은 ν•˜λ‚˜μ˜ ν•¨μˆ˜ ν˜Ήμ€ classκ°€ μ„œλ‘œ λ‹€λ₯Έ μžλ£Œν˜•μ— λŒ€ν•΄ λ™μž‘ν•  수 μžˆλ„λ‘ ν•΄ μ€λ‹ˆλ‹€.

#include <iostream>
template <typename T1,class T2>
int Add(T1 t1,T2 t2)
{
    std::cout << typeid(t1).name() << std::endl;
    std::cout << typeid(t2).name() << std::endl;

    return t1 + t2;
}

int main(int argc, const char * argv[])
{
    std::cout << Add<int,int>(1,2) << std::endl;
    std::cout << Add(1,2.1) << std::endl;
    //std::cout << Add("T1","T2") << std::endl; // compile error
    
    return 0;
}
i
i
3
i
d
3

μ„ μ–Έ 문법은 template<typename 'νƒ€μž…',typename 'νƒ€μž…', ...> μž…λ‹ˆλ‹€.
ν•„μš”ν•œλ§ŒνΌ <> μ•ˆμ— νƒ€μž…μ„ λ‚˜μ—΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ—¬κΈ°μ—μ„œ typenameκ³Ό classλŠ” 같은 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

μ‚¬μš©μ‹œμ—λŠ” ν•¨μˆ˜ ν˜Ήμ€ ν΄λž˜μŠ€μ— <>λ₯Ό 뢙이고 μΉ˜ν™˜ν•  νƒ€μž…μ„ λ‚˜μ—΄ν•˜κ²Œ λ©λ‹ˆλ‹€.
Add<int,int>의 경우, μ•„λž˜μ™€ 같이 μΉ˜ν™˜λ˜μ–΄ 컴파일 λ©λ‹ˆλ‹€.

int Add(int t1,int t2)
{
    std::cout << typeid(t1).name() << std::endl;
    std::cout << typeid(t2).name() << std::endl;

    return t1 + t2;
}

μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μœ μΆ”ν•  수 μžˆλŠ” 경우, μ‚¬μš©μ‹œμ— νƒ€μž… λͺ…μ‹œλŠ” μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ˜ˆμ œμ—μ„œ std::cout << Add(1,2.1) << std::endl; μ½”λ“œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
μ΄λ•Œ μ²«λ²ˆμ§ΈλŠ” int둜, λ‘λ²ˆμ§ΈλŠ” double이 μœ μΆ”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

template을 μ„œλ‘œ λ‹€λ₯Έ μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν—€λ”νŒŒμΌμ— λͺ¨λ“  κ΅¬ν˜„μ„ κ°–μΆ”κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
μ΄λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ‹€μ œ ν…œν”Œλ¦Ώ μ½”λ“œκ°€ μ‚¬μš©λ˜λŠ” ν˜•νƒœλ₯Ό 보고 μ λ‹Ήν•˜κ²Œ κ΅¬ν˜„ μ½”λ“œλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ΄λ©°,
μ•„λž˜ μΌ€μ΄μŠ€λŠ” 컴파일 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

template <typename T1,class T2>
int Add(T1 t1,T2 t2);

λ˜ν•œ, template μ½”λ“œ μ•ˆμ—λŠ” λ¬Έλ²•λ§Œ 맞으면 μ–΄λ– ν•œ μ½”λ“œλΌλ„ μž‘μ„±ν•  수 μžˆμ§€λ§Œ
μ‹€μ œ μΉ˜ν™˜ν•˜μ—¬ μ»΄νŒŒμΌμ„ ν• λ•Œ λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.
std::cout << Add("T1","T2") << std::endl; μ½”λ“œλŠ” const char pointer μžλ£Œν˜•μœΌλ‘œ μœ μΆ”λ˜λŠ”λ°
const char pointer + const char pointer λŠ” μ‹€μ œ λŒ€μ‘ν•˜λŠ” 연산이 μ—†μœΌλ―€λ‘œ 컴파일 μ—λŸ¬κ°€ λ‚˜κ²Œ λ©λ‹ˆλ‹€.

클래슀둜 ν•΄λ‹Ή κ΅¬ν˜„μ„ ν•œλ²ˆ 감싼닀면 μ•„λž˜μ™€ 같은 μ½”λ“œκ°€ 될 κ²ƒμž…λ‹ˆλ‹€.

#include <iostream>
template <typename T1,class T2>
class Calculator
{
public:
    static int Add(T1 t1,T2 t2)
    {
        std::cout << typeid(t1).name() << std::endl;
        std::cout << typeid(t2).name() << std::endl;
        
        return t1 + t2;
    }
    
    template <typename T3,class T4>
    int Add2(T3 t1,T4 t2)
    {
        std::cout << typeid(t1).name() << std::endl;
        std::cout << typeid(t2).name() << std::endl;
        
        return t1 + t2;
    }
};

int main(int argc, const char * argv[])
{
    std::cout << Calculator<int,int>::Add(1,2) << std::endl;
    //std::cout << Calculator::Add(1,2.1) << std::endl; // compile error
    return 0;
}

template class μ•ˆμ—λŠ” λ¬Όλ‘  λ‹€λ₯Έ template methodκ°€ μž‘μ„±λ˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.
λ‹€λ§Œ, class에 template μ •μ˜κ°€ 있기 λ•Œλ¬Έμ—
function의 μΈμˆ˜λΆ€ν„° template의 νƒ€μž… μœ μΆ”λ₯Ό ν•˜μ§€ λͺ» ν•˜λŠ” 상황이 μœ„μ˜ μ—μ œμ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.

template은 μžλ£Œν˜•μ— 독립적인 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•΄ μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
C++의 ν‘œμ€€ μ€‘μ—λŠ” STL (standard template library)κ°€ μ‘΄μž¬ν•˜λ©°, μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜λ“€μ΄ 미리 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

이 λΈ”λ‘œκ·ΈλŠ” 개인 λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€. κ²Œμ‹œκΈ€μ€ 였λ₯˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ 수 μžˆμ§€λ§Œ, μ €μžλŠ” 였λ₯˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
κ²Œμ‹œκΈ€μ— λ³„λ„μ˜ 고지가 μ—†λŠ” 경우, ν¬λ¦¬μ—μ΄ν‹°λΈŒ 컀먼즈 μ €μž‘μžν‘œμ‹œ-λΉ„μ˜λ¦¬-λ³€κ²½κΈˆμ§€ 4.0 λΌμ΄μ„ μŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.