ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 템플릿
    프로그래밍/C & C++ 2024. 7. 5. 20:05
    728x90
    반응형

    템플릿은 C++에서 코드를 작성할 때 타입을 일반화하여 재사용성을 높이는 강력한 기능입니다. 템플릿을 사용하면 하나의 함수나 클래스 정의를 통해 다양한 타입을 지원할 수 있습니다. 템플릿은 함수 템플릿과 클래스 템플릿 두 가지 주요 형태로 사용됩니다.

    1. 함수 템플릿 (Function Template)

    함수 템플릿은 여러 타입을 처리할 수 있는 일반적인 함수를 정의할 때 사용됩니다. 함수 템플릿을 사용하면 타입에 독립적인 코드를 작성할 수 있습니다.

    함수 템플릿 예시

    #include <iostream>
    
    // 함수 템플릿 정의
    template <typename T>
    T add(T a, T b) {
        return a + b;
    }
    
    int main() {
        std::cout << "Int addition: " << add(3, 4) << std::endl;           // int 타입
        std::cout << "Double addition: " << add(3.14, 2.71) << std::endl;  // double 타입
        return 0;
    }

    위 예제에서 add 함수 템플릿은 T 타입을 매개변수로 받아, int, double 등 다양한 타입에 대해 동작합니다.

    2. 클래스 템플릿 (Class Template)

    클래스 템플릿은 특정 타입에 구애받지 않는 일반적인 클래스를 정의할 때 사용됩니다. 이를 통해 하나의 클래스 정의로 다양한 타입의 객체를 생성할 수 있습니다.

    클래스 템플릿 예시

    #include <iostream>
    
    template <typename T>
    class MyClass {
    public:
        MyClass(T value) : value(value) {}
        void display() const {
            std::cout << "Value: " << value << std::endl;
        }
    private:
        T value;
    };
    
    int main() {
        MyClass<int> intObj(42);        // int 타입의 MyClass 객체
        MyClass<double> doubleObj(3.14); // double 타입의 MyClass 객체
    
        intObj.display();
        doubleObj.display();
    
        return 0;
    }

    위 예제에서 MyClass 클래스 템플릿은 T 타입을 매개변수로 받아, int, double 등 다양한 타입의 객체를 생성할 수 있습니다.

    3. 템플릿 특수화 (Template Specialization)

    템플릿 특수화는 특정 타입에 대해 템플릿을 별도로 정의하는 것입니다. 이를 통해 특정 타입에 대해 최적화된 동작을 구현할 수 있습니다.

    템플릿 특수화 예시

    #include <iostream>
    
    template <typename T>
    class MyClass {
    public:
        MyClass(T value) : value(value) {}
        void display() const {
            std::cout << "Value: " << value << std::endl;
        }
    private:
        T value;
    };
    
    // int 타입에 대한 특수화
    template <>
    class MyClass<int> {
    public:
        MyClass(int value) : value(value) {}
        void display() const {
            std::cout << "Integer Value: " << value << std::endl;
        }
    private:
        int value;
    };
    
    int main() {
        MyClass<int> intObj(42);        // int 타입의 특수화된 MyClass 객체
        MyClass<double> doubleObj(3.14); // double 타입의 일반 MyClass 객체
    
        intObj.display();
        doubleObj.display();
    
        return 0;
    }

    위 예제에서 MyClass<int>int 타입에 대해 특수화되어, 일반 템플릿과는 다른 동작을 수행합니다.

    4. 템플릿의 장점

    1. 재사용성: 한 번의 정의로 다양한 타입에 대해 재사용할 수 있습니다.
    2. 유연성: 타입에 독립적인 코드를 작성할 수 있습니다.
    3. 유지보수성: 코드의 중복을 줄여 유지보수를 쉽게 합니다.

    5. 템플릿의 제한 사항

    1. 컴파일 시간 증가: 템플릿은 컴파일 시점에 인스턴스화되므로, 컴파일 시간이 증가할 수 있습니다.
    2. 디버깅 어려움: 템플릿 코드에서 발생하는 컴파일 오류는 이해하고 수정하기 어려울 수 있습니다.
    3. 코드 크기 증가: 여러 타입에 대해 인스턴스화될 때 코드 크기가 증가할 수 있습니다.

    요약

    템플릿은 C++에서 타입에 독립적인 코드를 작성할 수 있게 해주는 강력한 기능입니다. 함수 템플릿과 클래스 템플릿을 사용하면 다양한 타입에 대해 동일한 코드로 작업할 수 있으며, 특수화를 통해 특정 타입에 대해 최적화된 동작을 구현할 수 있습니다. 이를 통해 코드의 재사용성과 유연성을 크게 향상시킬 수 있습니다.

    728x90
    반응형
Designed by Tistory.