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

[C++] 템플릿 클래스 만들기

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

9.3.2 템플릿 클래스 만들기

 

 ANSI 표준에서는 STL(Standard Template Library)이라는 표준 템플릿 라이브러리를 제공하고 있습니다. STL에는 자료를 보관할 때 사용하는 컨테이너 클래스들과 보관된 자료들을 순회할 수 있는 반복자와 함수 개체 및 공통으로 사용할 수 있는 알고리즘들을 템플릿 클래스 및 템플릿 함수 형태로 제공하고 있습니다.

 

 여기에서는 배열을 템플릿 클래스로 만들면서 템플릿 클래스에 대해 학습해 보기로 합시다.

 

 먼저 템플릿 형식 인자의 개수와 용도를 결정해 봅시다. 배열에 보관할 형식을 사용자가 결정할 수 있게 하나의 템플릿 형식 인자를 정하면 되겠네요. 멤버 필드로는 배열에 원소들을 보관할 수 있게 템플릿 형식 인자의 포인터 형식의 멤버 필드 base와 최대 보관할 수 있는 원소 개수인 상수 멤버 필드 bsize가 있으면 될 것입니다.

 

#pragma once

template <typename T>

class Arr

{

    T *base;

    const int bsize;

    ...중략...

};

 

 생성자 메서드에서는 배열의 크기를 인자로 받아 bsize를 초기화하고 base에 요소들을 보관할 수 있는 메모리를 동적으로 할당받는 것과 각 원소를 0으로 초기화를 하면 될 것입니다.

 

#pragma once

template <typename T>

class Arr

{

    T *base;

    const int bsize;

public:

    Arr(int _bsize):bsize(_bsize)

    {

        base = new T[bsize];

        for(int i=0 ; i<bsize ; i++)

        {

            base[i] = 0;

        }

    }

    ...중략...

};

 

 그리고 [] 연산자를 중복 정의하여 입력 인자는 int 혹은 unsigned로 인덱스를 받게 하고 연산 결과로 보관한 원소의 참조를 반환하면 되겠네요. , 입력받은 인덱스가 유효하지 않은 인덱스라면 예외를 발생시켜 주면 잘못된 사용을 했을 때 사용하는 개발자가 빠른 단계에서 인지할 수 있을 것입니다. 마지막으로 소멸자에서 템플릿 클래스 내에서 동적으로 생성했던 base의 메모리를 해제하면 될 것입니다.

 

Arr.h

#pragma once

template <typename T>

class Arr

{

    T *base;

    const int bsize;

public:

    Arr(int _bsize):bsize(_bsize)

    {

        base = new T[bsize];

        for(int i=0 ; i<bsize ; i++)

        {

            base[i] = 0;

        }

    }

    ~Arr()

    {

        delete[ ] base;

    }

    T &operator[](int index)

    {

        if((index>=0)&&(index<bsize))

        {

            return base[index];

        }

        throw "잘못된인덱스를사용하였습니다.";

    }

};

  

 이처럼 템플릿 클래스를 만들면 사용하는 곳에서는 템플릿 형식 인자를 명시하여 변수 선언 및 개체를 생성하여 배열처럼 사용할 수가 있습니다. 또한, 잘못된 인덱스에 접근할 때 예외가 발생하여 버그를 빨리 인지하여 수정할 수 있습니다.

 

Example.cpp

#include "Arr.h"

#include <iostream>

using namespace std;

void main()

{

    Arr<int> arr(10);

 

    for(int i = 0; i<10; i++)

    {

        arr[i] = i+1;

    }

    for(int i = 0; i<10; i++)

    {

        cout<<arr[i]<<endl;

    }

}

 

9장 릿

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

반응형