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; } } |
(모든 동영상 강의는 무료입니다.)
'언어 자료구조 알고리즘 > Escort C++' 카테고리의 다른 글
[C++] 상세 설계 및 구현, 클래스 추가 및 관계에 따른 헤더 포함 (0) | 2016.04.15 |
---|---|
[C++] OOP 프로그래밍 실습 - 설계(시퀀스 다이어그램) (0) | 2016.04.15 |
[C++] OOP 프로그래밍 실습 - 설계 (클래스 다이어그램) (0) | 2016.04.15 |
[C++] OOP 프로그래밍 실습 - 요구 분석 (0) | 2016.04.15 |
[C++] OOP 프로그래밍 실습, 개발 공정 및 시나리오 (0) | 2016.04.15 |
[C++] 템플릿 클래스 (0) | 2016.04.15 |
[C++] 명시적 템플릿 인수 사용 (0) | 2016.04.15 |
[C++] 전역 템플릿 함수 (0) | 2016.04.15 |
[C++] 8. 구조화 된 예외처리 (0) | 2016.04.15 |
[C++] 함수 개체 실습의 Zone 클래스 구현 예제 코드 (0) | 2016.04.15 |