일반화 프로그래밍: 알고리즘이나 자료구조에 대한 추상적인 개념을 가지고 일반적인 코드로 작성하고, 이것을 다양한 자료형의 객체들에 대해 재사용하는 기법
보통 여러 자료형으로 만들 필요가 있는 함수를 일반화 프로그래밍을 이용해서 만듭니다.
C++에서는 템플릿을 이용해 일반화 프로그래밍을 지원합니다.
- 템플릿(template)은 다형성의 한 종류로 컴파일 동안 일어나는 정적 다형성이므로 효율적입니다.
- 함수 템플릿과 클래스 템플릿이 있습니다.
- template와 typename 키워드를 사용하고, typename 다음에 형식 매개변수(또는 타입 매개변수를)를 지정합니다.
- 타입 매개변수 리스트에 꺽은 괄호 “< >”를 사용합니다.이것은 둥근 괄호 “( )”를 사용하는 함수의 매개변수 리스트와 구분됩니다.
템플릿에서 타입 매개변수는 “자료형”입니다. “값”이 아닙니다.
다음 함수 템플릿과 클래스 템플릿을 보면서 좀 더 알아봅시다.
▶함수 템플릿
함수 템플릿은 함수를 찍어내는 틀(template)입니다.
■함수 템플릿의 형식
template < typename T > // 또는 여러개의 타입 매개변수를 가질려면
// < typename T1, typename T2,....., typename Tn >
반환형 함수명 (매개변수목록)
{
.... // 함수 몸체
}
예시 코드로 배열의 최대값을 구하는 함수를 템플릿으로 구현하면 아래와 같습니다.
#include <iostream>
using namespace std;
template < typename T >
T findMaxValue(T a[], int len) {
T maxVal = a[0];
for (int i = 1; i<len; i++)
if (maxVal < a[i]) maxVal = a[i];
return maxVal;
}
void main() {
int iArr[5] = { 1, 4, 2, 5, 3 };
double dArr[5] = { 5.0, 8.0, 7.0, 9.0, 6.0 };
char cArr[] = "game over ! {09}";
int iMax = findMaxValue(iArr, 5);
double dMax = findMaxValue(dArr, 5);
char cMax = findMaxValue(cArr, strlen(cArr));
cout << "iMax = " << iMax << endl;
cout << "dMax = " << dMax << endl;
cout << "cMax = " << cMax << endl;
}
템플릿으로 구현된 함수를 사용하는 방법은 일반 함수와 다르지 않습니다,
일반 함수처럼 사용하면 됩니다.
▶ 클래스 템플릿
클래스가 객체를 찍어내는 틀이라면 클래스 템플릿은 클래스를 찍어내는 틀(template)입니다.
■ 클래스 템플릿의 형식
template < typename T > // 또는 여러개의 타입 매개변수를 가질려면
// < typename T1, typename T2,....., typename Tn >
class 템플릿명
{
.... // 클래스 몸체
}
클래스 템플릿에서 객체를 선언하기 위해서는 타입 매개변수에 대한 구체적인 유형을 지정해야 하는데, 형식은 다음과 같습니다.
템플릿명 < 타입1, 타입2,... 타입n > 객체이름;
이때 중요한 것은 템플릿명 < 타입1, 타입2,... 타입n >까지가 하나의 새로운 클래스가 된다는 것입니다.
아래는 여러 개의 타입 매개변수를 가진 클래스 템플릿으로
임의의 자료형의 두 값들을 연결시킵니다.
#include <iostream>
#include <string>
using namespace std;
template <typename T1, typename T2>
class Pair {
T1 data1;
T2 data2;
public:
Pair() { }
void set(T1 d1, T2 d2) { data1 = d1; data2 = d2; }
friend ostream& operator << (ostream& os, const Pair& p) {
os << "(" << p.data1 << " : " << p.data2 << ")";
return os;
}
};
void main() {
Pair<int, double> i2d[3];
i2d[0].set(10, 3.14159);
i2d[1].set(25, 2.71828);
i2d[2].set(14, 1.41421);
for (int i = 0; i < 3; i++)
cout << i2d[i] << endl;
Pair<string, double> map[3];
map[0].set("Pi, Archimedes' constant", 3.14159);
map[1].set("Euler's number", 2.71828);
map[2].set("square root of 2", 1.41421);
for (int i = 0; i < 3; i++)
cout << map[i] << endl;
}
1.
template <typename T1, typename T2>
class Pair {
먼저 클래스 템플릿 Pair를 선언하고 타입 매개변수로 T1과 T2를 사용합니다.
2.
T1 data1;
T2 data2;
그 후 멤버 변수로 T1형의 data1과 T2형의 data2를 선언합니다.
3.
Pair<int, double> i2d[3];
i2d[0].set(10, 3.14159);
i2d[1].set(25, 2.71828);
i2d[2].set(14, 1.41421);
for (int i = 0; i < 3; i++)
cout << i2d[i] << endl;
사용할 때는 배열의 각 항목에 Pair<int, double> 쌍을 저장하였고
화면으로 출력했습니다.
4.
Pair<string, double> map[3];
map[0].set("Pi, Archimedes' constant", 3.14159);
map[1].set("Euler's number", 2.71828);
map[2].set("square root of 2", 1.41421);
for (int i = 0; i < 3; i++)
cout << map[i] << endl;
다른 자료형으로도 사용할 수 있습니다.
템플릿의 유용한 기능
1.typedef
템플릿을 사용하면 자료형이 길어집니다.
이것은 번거롭고 프로그램을 복잡하게 보이도록 만듭니다.
typedef를 사용하여 간단한 이름으로 만들어 사용하면 편리합니다.
typedef Pair<string, double> str2db1;
str2db1 map[3];
2.디폴트 타입 매개변수
타입 매개변수에도 디폴트 값을 사용할 수 있습니다.
그런데 여기엔 일반 디폴트 매개변수처럼 “값”이 들어가는게 아닌,
“자료형”이 들어갑니다.
template <typename T1 = string, typename T2 = double>
class Pair { .... }
Pair<> map[3]; // == Pair<string, double> map[3];
3.템플릿의 상속
템플릿 클래스로도 상속을 사용할 수 있습니다.
다음은 Pair 템플릿을 이용해 단어장을 만들기 위한 WorldPair 클래스를 상속을 이용해 정의하는 문장입니다.
class WordPair : public Pair<string, string> { ... }
World myDic[1000];
myDic[0].set(“polymorphism”, “다형성”);
4.템플릿은 함수의 매개변수나 반환형으로도 사용할 수 있다.
다음은 정수형 Point 배열을 받아 평균을 구하고 결과를 실수형 Point 객체로 반환하는 함수입니다.
Point<double> average(Point<int> arr[], int len) {
Point<int> sum(0.0);
for (int I = 0; I < len; I++)
sum = sum + arr[i];
return (1.0 / len) * sum;
}
void main() {
point<int> arr[5];
for (int I = 0; I < 5; I++) {
arr[i] = Point<int>(I, I);
cout << “ ” << arr[i];
}
Point<double> avg = average(arr, 5);
cout << “\n평균 좌표 = ” << avg << endl;
'C++ 프로그래밍 > 클래스' 카테고리의 다른 글
윈도우에서 제공하는 표준 템플릿 라이브러리 라이브러리(STL) (1) | 2022.09.03 |
---|---|
형 변환 (1) | 2022.08.25 |
const 중요 (2) | 2022.08.25 |
예외 처리 방법들 (1) | 2022.08.22 |
예외 처리란? (1) | 2022.08.22 |