태그 글목록: C++ STL

[C++정리] 제네릭 프로그래밍을 위한 템플릿 사용 2015-07-06

제네릭 프로그래밍(Generic programming)이란 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식으로 템플릿은 STL 제네릭 프로그래밍의 핵심이라고 할 수 있다.

#include "stdafx.h"
#include <iostream>

using namespace std;

// 오버로딩을 통한 구현
// - 함수 오버로드
void PrintOverload(int a, const char* b)
{
	cout << a << "::" << b << "\n";
}
void PrintOverload(double a, const char* b)
{
	cout << a << "::" << b << "\n";
}
// - 클래스 생성
class PrintClass1
{
public:
	PrintClass1(int a)
	{
		cout << a << "\n";
	}
};
class PrintClass2
{
public:
	PrintClass2(double a)
	{
		cout << a << "\n";
	}
};
class PrintClass3
{
public:
	PrintClass3(const char* a)
	{
		cout << a << "\n";
	}
};

// 템플릿을 통한 구현
// - 함수 템플릿
template<typename T1, typename T2>
void PrintTemplate(T1 a, T2 b)
{
	cout << a << "::" << b << "\n";
}
// - 클래스 템플릿
template<typename T=int, int number=10>
class PrintClassTemplate
{
public:
	PrintClassTemplate(T a)
	{
		cout << number << "::" << a << "\n";
	}
};

int _tmain(int argc, _TCHAR* argv[])
{	
	PrintOverload(10, "Overload");
	PrintOverload(11.1, "Overload");

	cout << "====================\n";

	PrintTemplate<int, const char*>(10, "Template");
	PrintTemplate<double, const char*>(11.1, "Template");

	cout << "====================\n";

	PrintClass1 printClass1(10);
	PrintClass2 printClass2(11.1);
	PrintClass3 printClass3("Class");

	cout << "====================\n";

	PrintClassTemplate<int, 1> printClass4(10);
	PrintClassTemplate<double, 2> printClass5(11.1);
	PrintClassTemplate<const char*, 3> printClass6("Class");
	// 매개변수에 아무값도 지정하지 않을경우
	// 기본형 typename T=int, int number=10으로 인식된다.
	PrintClassTemplate<> printClass7(10);

	return 0;
}
* 템플릿을 사용해 비슷한 유형의 클래스를 용도별로 구현하지 않고도 유연하게 활용할 수 있다.

[C++ 정리] 연산자 오버로딩 2015-06-29

사용자가 만든 클래스 타입에 C++의 연산자를 오버로딩 하여 사용할 수 있는데 이는 더 직관적이며 일반화된 코드를 만들 수 있게 해준다.

#include "stdafx.h"
#include <iostream>

using namespace std;

class Point
{
private:
	int x;
	int y;
public:
	Point(int _x, int _y) :x(_x), y(_y){}	
	// 1. 멤버함수를 이용한 연산자 오버로딩
	const int operator+(const Point& point2)
	{
		return 10;
	}
};

// 2. 전역함수를 이용한 연산자 오버로딩
const int operator-(const Point& point1, const Point& point2)
{
	return 20;
}

int _tmain(int argc, _TCHAR* argv[])
{
	Point point1(10, 10), point2(20, 20);
	int testPlus = point1 + point2;
	int testMinus = point1 - point2;

	cout << "PLUS : " << testPlus << "\n";
	cout << "MINUS : " << testMinus << "\n";
		
	return 0;
}
* 멤버함수를 이용한 연산자 오버로딩, 전역함수를 이용한 연산자 오버로딩 두가지 방법이 있다.