산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 클래스 템플릿 마스터: 실전 가이드

C++ 클래스 템플릿 마스터: 실전 가이드

명확한 실전 예제를 통해 C++ 클래스 템플릿을 활용해 유연하고 타입에 독립적인 코드를 작성하는 방법을 학습합니다.

소개

템플릿은 C++에서 제네릭 프로그래밍의 초석입니다. 어떤 데이터 타입과도 작동하는 재사용 가능한 컴포넌트를 만들 수 있어 코드 명확성을 높이고 중복을 줄여줍니다. C++은 두 종류의 템플릿을 제공합니다: 함수 템플릿과 클래스 템플릿.

클래스 템플릿은 여러 데이터 타입에 적응하는 단일 클래스를 정의할 수 있게 해줍니다. 이는 코드를 줄여줄 뿐만 아니라 유지보수도 쉽게 만듭니다.


클래스 템플릿 선언

클래스 템플릿은 template 키워드로 시작하고, 꺾쇠 괄호로 둘러싸인 템플릿 매개변수 리스트가 옵니다. 그 뒤에 실제 클래스 정의가 옵니다.

template <class T>
class MyClass {
private:
    T var;
public:
    T getVar() const;
};

여기서 T는 템플릿이 인스턴스화될 때 제공될 데이터 타입을 위한 플레이스홀더입니다. 키워드 class는 typename으로 바꿔도 의미가 같습니다.


클래스 템플릿 인스턴스화

템플릿이 정의되면 원하는 타입을 지정해 객체를 생성할 수 있습니다:

MyClass<int> intObj;
MyClass<float> floatObj;
MyClass<std::string> stringObj;

각 인스턴스화는 컴파일 시 지정된 타입에 맞춘 구체적인 클래스를 생성합니다.


예제 1: 제네릭 숫자 래퍼

#include <iostream>
using namespace std;

// 임의 타입의 단일 값을 저장하는 클래스 템플릿
template <class T>
class Number {
private:
    T value;
public:
    Number(T v) : value(v) {}
    T getValue() const {
        return value;
    }
};

int main() {
    Number<int> intNum(7);
    Number<double> doubleNum(7.7);
    cout << "int Number = " << intNum.getValue() << endl;
    cout << "double Number = " << doubleNum.getValue() << endl;
    return 0;
}

출력

int Number = 7
double Number = 7.7

템플릿 매개변수 T가 멤버 변수, 생성자 인수, 반환 타입에 사용되어 클래스가 어떤 타입과도 작동할 수 있음을 알 수 있습니다.


클래스 외부에서 멤버 정의

멤버 함수가 크거나 특수화 간에 공유될 때 클래스 본문 외부에서 정의할 수 있습니다:

template <class T>
class Sample {
public:
    T identity();
};

// 클래스 외부 정의
template <class T>
T Sample<T>::identity() {
    return static_cast<T>(1);
}

클래스 외부 정의 앞에 template<class T> 선언이 반복됨을 주목하세요.


예제 2: 클래스 템플릿을 사용한 계산기

#include <iostream>
using namespace std;

template <class T>
class Calculator {
private:
    T a, b;
public:
    Calculator(T x, T y) : a(x), b(y) {}
    T add() const { return a + b; }
    T subtract() const { return a - b; }
    T multiply() const { return a * b; }
    T divide() const { return a / b; }
    void display() const {
        cout << "a: " << a << ", b: " << b << endl;
        cout << "a + b = " << add() << endl;
        cout << "a - b = " << subtract() << endl;
        cout << "a * b = " << multiply() << endl;
        cout << "a / b = " << divide() << endl;
    }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4f, 1.2f);
    cout << "Int results:\n";
    intCalc.display();
    cout << "\nFloat results:\n";
    floatCalc.display();
    return 0;
}

출력

Int results:
a: 2, b: 1
a + b = 3
a - b = 1
a * b = 2
a / b = 2
Float results:
a: 2.4, b: 1.2
a + b = 3.6
a - b = 1.2
a * b = 2.88
a / b = 2

다중 매개변수 템플릿

클래스 템플릿은 둘 이상의 매개변수를 받을 수 있으며 기본 타입도 제공할 수 있습니다:

template <class T, class U, class V = int>
class MultiParam {
    T first;
    U second;
    V third;
};

예제 3: 다중 매개변수 템플릿

#include <iostream>
using namespace std;

template <class T, class U, class V = char>
class ClassTemplate {
private:
    T var1;
    U var2;
    V var3;
public:
    ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}
    void print() const {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    ClassTemplate<int, double> obj1(7, 7.7, 'c');
    cout << "obj1 values:\n";
    obj1.print();
    ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nobj2 values:\n";
    obj2.print();
    return 0;
}

출력

obj1 values:
var1 = 7
var2 = 7.7
var3 = c
obj2 values:
var1 = 8.8
var2 = a
var3 = 0

이 예제에서 세 번째 템플릿 매개변수는 기본적으로 char이지만 obj2에서 bool로 오버라이드할 수 있음을 보여줍니다.

C 언어

  1. C# static 키워드: 정적 변수, 메서드, 클래스 완벽 활용
  2. C# 중첩 클래스(Nested Class) 이해: 정의, 사용법, 상속
  3. C++ 연산자 마스터하기: 유형별 완벽 가이드와 실전 예제
  4. C++ 주석: 가독성 높고 유지보수하기 좋은 코드 작성법
  5. C++ 저장 클래스 완벽 가이드: 범위, 수명, 용법
  6. C++ 다형성 이해하기: virtual 함수와 순수 가상 함수
  7. C++ 데이터 추상화 마스터하기: 인터페이스와 구현 분리로 설계 단순화
  8. C++ 데이터 캡슐화: 코드 보호의 핵심 원리
  9. C++ 인터페이스: 추상 클래스와 순수 가상 함수 마스터하기
  10. C++ 템플릿 마스터하기: 제네릭 프로그래밍 가이드