SW/C++

C++ : 템플릿 프로그래밍 : 기본 개념, 예제, 활용방법, 주의사항

얇은생각 2020. 4. 20. 07:30
반응형

C++ : 템플릿 프로그래밍 : 기본 개념, 예제, 활용방법, 주의사항

 

템플릿 프로그래밍

java와 C#에서의 제너렉 메서드 / 클래스와 유사합니다. STL 컨테이너 또한 템플릿으로 구성되어 있습니다. 덕분에 코드를 자료형마다 중복으로 장석하지 않아도 됩니다. 

 

 

 

함수 템플릿

template <class T>
T Add(T a, T b)
{
  // ...
}

template <typename T>
T Add(T a, T b)
{
  //
}

 

함수 템플릿을 호출할 때 템플릿 매개변수를 생략할 수 있습니다. 

 

 

typename vs class

차이가 무엇일까요? 사실상 큰 차이는 없다고 합니다. 그냥 typename을 사용해도 무방합니다. 

 

 

 

템플릿은 어떻게 동작할까요?

템플릿을 인스턴스화할 때마다 컴파일러가 내부적으로 코드를 생성합니다. 템플릿에 넣는 자료형 가짓수에 비례해서 exe 파일 크기가 증가합니다.

 

 

예시

class MyIntArray
{
  public:
    bool Add(int data);
    MyIntArray();
  
private:
  enum{ MAX = 3 };
  int mSize;
  int mArray[MAX];
};

int main()
{
  MyIntArray scores;
  
  scores.Add(10);
  scores.Add(20);
  scores.Add(30);
  scores.Add(40);
  
  return 0;
}

 

컴파일러가 Main.cpp을 컴파일할 떄 , MyArray.cpp를 못찾습니다. MyArray.h를 통해서 오직 MyArray 틀래스 선언만 볼 수 있습니다. 따라서, 컴파일러가 MyArray<int>를 만들어 줄 수 없을 떄가 있습니다. 

그래서 보통, 템플릿 프로그래밍을 한 구현체를 헤더파일에 구현하는게 기본적인 해결 방법입니다. 

 

 

클래스 템플릿

개체를 선언할 떄 템플릿 매개변수를 명시해야 합니다. 왜냐하면 컴파일러는 어떤 타입의 클래스를 만들어 줄지 모르기 때문입니다. 

반응형