본문 바로가기

개발일지

C++ 스터디 - 템플릿

  • C++ 스터디 4주차 템플릿

템플릿에는 크게 2가지가 있는데 함수 템플릿/클래스 템플릿이 있습니다.

 

함수 템플릿의 경우 함수위에 template<typename T> 를 명시해주고

함수내에 변수 타입자리에 T를 기재해서 T가 상황에 맞는 변수형으로 인식한다.

EX)

template <typename T>
T getArraySum(T arr[], int n){
    T sum = T();
    for (int i=0; i<n; i++){
        sum += arr[i];
    }    
    return sum;
}

위와 같이 임의의 타입 T 형 배열을 받아서 배열내 값들을 더해 최종 sum을 반환해주는 함수를 작성하였다.

 

int main(){

    int iarr[4]={1,2,3,4};
    float farr[4]={3.1 ,3.2, 1.3 ,2.4};
    string sarr[2]={"hello" , "world"};

    cout << getArraySum(iarr , 4) <<endl;
 
출력값 : 10 
 
클래스 템플릿은 아래와 같습니다.
클래스 선언위에 함수와 같이 template<typename T>  를 명시해주고 내부 변수선언에 타입을 T로 정의합니다.
EX)
template<typename T>
class Vector {
    private:
    T x;
    T y;
    public :
    Vector() : x(0),y(0){};
    Vector(T x, T y) : x(x),y(y){}
    T GetX(){
        return x;
    }
    T GetY(){
        return y;
    }
    Vector operator+=(Vector v){
        x += v.GetX();
        y += v.GetY();
        return *this;
    }
    Vector operator-=(Vector v){
        x -= v.GetX();
        y -= v.GetY();
        return *this;
    }
    Vector operator+(Vector v){
        return Vector(x + v.GetX(),y + v.GetY());
    }
    Vector operator-(Vector v){
        return Vector(x - v.GetX(),y - v.GetY());
    }
};
 
int main(){

   
    Vector<int> v1(1,2);
    Vector<float> v2(1.1,2.2);
    Vector<float> v3(3.1,5.3);  

     cout<< v2.GetX() <<", " << v2.GetY()<<endl;

}
 
출력값 : 1.1 ,2.2

여기서 주의할 점은 template class 를 이용해 해당 객체를 만들고자하면 변수타입을 명시해주어야 합니다.

사실 임의로 알수는 있겠지만, 치명적인 에러를 방지하고자 컴파일 에러가 나오게 됩니다.

또한 template <class T> 형태로도 사용 가능합니다.