언어 자료구조 알고리즘/Escort C++

[C++] 템플릿 클래스

언제나휴일 2016. 4. 15. 15:31
반응형

9.3 템플릿 클래스

 

9.3.1 템플릿 클래스

 

 템플릿 클래스는 멤버 필드의 형식과 일부 멤버 메서드의 인수의 형식만 다르고 메서드 내부의 논리 전개가 같은 경우에 사용합니다. 템플릿 클래스도 가상의 클래스이며 사용하는 코드의 템플릿 형식 인자에 따라 구체화 된 클래스를 컴파일러에 의해 만들어지게 됩니다. 템플릿 클래스를 작성하는 것은 가상의 코드를 만드는 것이고 이를 기반으로 컴파일러에 의해 구체화 된 클래스를 만들어지는 것이기 때문에 일반적으로 멤버 메서드도 헤더 파일에 작성한다.

 

 다음은 템플릿 클래스 문법을 파악하기 위한 간단한 예를 두 가지 형태로 보여 드리겠습니다.

 

 첫 번째는 멤버 메서드를 템플릿 클래스 내부에 구현하는 경우입니다. 템플릿 클래스를 만들 때에는 멤버 메서드를 포함하여 템플릿 클래스가 가상의 코드이기 때문에 헤더에 작성하는 것이 일반적이며 멤버 메서드도 클래스 내부에 구현하는 경우가 많습니다.

 

MyTemplate.h

#pragma once

template <typename T>

class MyTemplate

{

    T data;

public:

    MyTemplate(T _data)

    {

        data = _data;

    }

    int Compare(T in)

    {

        return data - in;

    }

    operator T()

    {

        return data;

    }

};

 

 두 번째는 멤버 메서드를 템플릿 클래스 외부에 구현하는 경우입니다. 이 경우에는 해당 멤버 메서드가 템플릿 클래스의 멤버라는 것을 각 멤버 메서드를 구현부에 명시하여야 합니다.

 

MyTemplate.h - 템플릿 클래스 외부에 멤버 메서드 구현 예

#pragma once

template <typename T>

class MyTemplate

{

    T data;

public:

    MyTemplate(T _data);

    int Compare(T in);

    operator T();

};

 

template <typename T>

MyTemplate<T>::MyTemplate(T _data)

{

    data = _data;

}

 

template <typename T>

int MyTemplate<T>::Compare(T in)

{

    return data - in;

}

 

template <typename T>

MyTemplate<T>::operator T()

{

    return data;

}

 

 위의 예제를 보시면 아시겠지만 템플릿 클래스 명은 실제 클래스 명이 될 수 없으며 사용할 템플릿 형식 인자를 포함해야 클래스 명이 됩니다. 그리고 멤버 메서드를 템플릿 클래스 외부에 구현할 떄에는 각각의 메서드가 템플릿 메서드임을 명시하여야 합니다. 

 

 이처럼 템플릿 클래스(위의 두 가지 방법 중 어떠한 방법을 사용하더라도 차이는 없습니다.)를 정의하였을 때 사용하는 코드에서 어떠한 템플릿 형식 인자에 해당하는 개체를 만들 것인지 선언부에서 명확하게 명시하여야 합니다. 컴파일러는 명시된 템플릿 형식 인자에 맞게 템플릿 클래스를 기반으로 실제 클래스 코드를 작성하고 이를 사용하는 코드로 전개해 줍니다.

 

Example.cpp

#include "MyTemplate.h"

#include <iostream>

using namespace std;

void main()

{

    MyTemplate<int> mt(3);

    int diff = mt.Compare(8);

    cout<<"차이:"<<diff<<endl;

 

    if(mt == 3)

    {

        cout<<"같다."<<endl;

    }

    else

    {

        cout<<"다르다."<<endl;

    }

 

    MyTemplate<char> *mt2 = new MyTemplate<char>('a');

    delete mt2;

}

 

 사용하는 곳에서 템플릿 인자를 명시하여 변수를 선언하고 new 연산을 통해 동적으로 개체를 생성할 때에도 이를 명시하여야 함에 주의합시다. 물론, typedef을 이용하면 간략하게 표현할 수 있을 것입니다.

 

typedef MyTemplate<int> MyInt;

...중략...

MyInt mt(3);

MyInt *mt2 = new MyInt(4);


9장 릿

(모든 동영상 강의는 무료입니다.)

반응형