C++ 템플릿

2023. 12. 7. 16:31C++

 

 

static int y는 컴파일시 값이 결정(정적 바인딩)

int x는 문장을 실행할 때 결정 (동적 바인딩)

 

static변수는 프로그래밍이 끝날때 지워진다

#include <iostream>
using std::cout;
class Point{
int x;
int y;
static int count; //선언
public:
Point(){cout<<++count;}
~Point(){cout<<--count;}
};
int Point::count=0; //정의
int main()
{
Point p1,p2,p3;
return 0;
}

컴파일시(static 바인딩) count의 값이 하나 만들어짐 

static변수 count를 초기화 하지 않으면 메모리 할당만 되고 값이 없기 때문에 오류가 발생한다.

 

 

 

Generic programming 이란  int x = 10;처럼 자료형을 미리 정해놓지 않고 <int> x= 10;와 같이 자료형을 나중에 결정 하는 것을 의미한다.

templat 예제

#include <iostream>
using std::cout;
using std::endl;
template<class T> T Max(T i, T j) //코드를 실행 할 때 자료형 결정(T)
{
	return i > j ? i : j;
}
int main()
{
	cout << "Max값은=" << Max(1, 2) << endl;
	cout << "Max값은=" << Max(7.5, 3.6) << endl;
	cout << "Max값은=" << Max('A', 'B');
	return 0;
}

결정되지 않은 자료형이 두 종류 일 때

#include <iostream>
using std::cout;
using std::endl;
template <typename T1, typename T2> void fun(T1 x, T2 y)
{ // 두 개의 매개변수 자료형이 T1과 T2로 다르다.
	cout << x << " " << y << endl;
}
int main()
{
	fun("Han", 30); // T1은 문자열(const char *),T2는 정수형(int)
	fun(25, 50.5); // T1은 정수형(int), T2는 double형
	return 0;
}

비슷한 기능을 하는 class들 

#include <iostream>
using std::cout;
using std::endl;
class CCC1
{
int x;
int y;
public:
CCC1(int xx, int yy) {x=xx;y=yy;}
void Print(){ cout<<x<<','<<y<<endl;}
};
class CCC2
{
double x;
double y;
public:
CCC2(double xx, double yy) {x=xx;y=yy;}
void Print(){ cout<<x<<','<<y<<endl;}
};
class CCC3
{
char x;
const char* y;
public:
CCC3(char xx, const char* yy) {x=xx;y=yy;}
void Print(){ cout<<x<<','<<y<<endl;}
};
int main()
{
CCC1 c1(10,20);
CCC2 c2(3.5,5.5);
CCC3 c3('I', "Love You!");
c1.Print();
c2.Print();
c3.Print();
return 0;
}

위 소스를 템플릿을 사용해 통일 

#include <iostream>
using std::cout;
using std::endl;
template <typename T1, typename T2>
class CCC1   //CCC1,CCC2,CCC3 다 비슷한 클래스기 때문에 템플릿을 사용해 하나로 통일
{
	T1 x;
	T2 y;
public:
	CCC1(int xx, int yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};

int main()
{
	CCC1 c1(10, 20);
	c1.Print();
	return 0;
}

마지막으로 < >안에 자료형을 미리 지정해야 한다

#include <iostream>
using std::cout;
using std::endl;
template <typename T1, typename T2>
class CCC1   //CCC1,CCC2,CCC3 다 비슷한 클래스기 때문에 템플릿을 사용해 하나로 통일
{
	T1 x;
	T2 y;
public:
	CCC1(T1 xx, T2 yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};

int main()
{
	CCC1<int,int> c1(10, 20);//< >	안에 어느 자료형으로 바뀌는지 미리 지정해야 함
	CCC1<double, double> c2(1.2, 3.2);
	CCC1<char, const char*> c3('a', "asd");
	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

위 소스와 같은 클래스를 제네릭(Generics)클래스 라고 한다.

 

 

 

STL의 기능 여럿 포함한 소스

#include <iostream>
#include <vector> // vector container
#include <algorithm> // sort
#include <functional> // 함수자 less<>, greater<>
using namespace std;
int main()
{
	vector<int> v(5); //vector container
	cout << v.size() << " : " << v.capacity() << endl; //5 :5
	//capacity는 할당된 메모리 공간의 크기, size는 저장된 데이터 요소의 개수
	for (int i = 0; i < v.size(); i++) cout << v[i] << ' '; //0 0 0 0 0
	cout << endl;
	for (int i = 0; i < v.size(); i++) v[i] = i + 1;
	for (int i = 0; i < v.size(); i++) cout << v[i] << ' '; //1 2 3 4 5
	cout << endl;
	for (int i = 0; i < 5; i++) v.push_back(10 - i);
	vector<int>::iterator iter; //iterator
	for (iter = v.begin(); iter != v.end(); iter++)cout << *iter << ' ';
	// 1 2 3 4 5 10 9 8 7 6
	sort(v.begin(), v.end()); cout << endl; //algorithm
	for (iter = v.begin(); iter != v.end(); iter++)cout << *iter << ' ';
	// 1 2 3 4 5 6 7 8 9 10
	sort(v.begin(), v.end(), greater<int>()); //functor
	cout << endl;
	for (iter = v.begin(); iter != v.end(); iter++)cout << *iter << ' ';
	// 10 9 8 7 6 5 4 3 2 1
	return 0;
}

 

 

Exception handling
오류에는 컴파일오류/런타임오류가 있다. Exception handling는 런타임 오류 중에서 예외사항에 대한 부분을 프로그래밍 하는 것을 뜻한

예외 처리를 하는 3개의 키워드

 

 

예외처리를 하기 위한 3단계 과정 소스

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo)
{
	try {//예외처리 1단계: try블럭으로 묶는다.
		if(mo==0){ throw mo; }//2단계:예외가 발생할 수 있는 변수를 catch쪽으로 던진다
		cout << "결과:" << ja / mo << endl;
		
	}
	catch(double)//3단계 throw에서 던진 변수를 받는 블럭 ()안에는 받는 변수의 자료형을 써준다
	{
		cout << "오류 0으로 나눌 수 없음";
	}
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

'C++' 카테고리의 다른 글

C++ reference, 형식 설정 멤버함수, 파일 입출력  (0) 2023.12.14
C++ 상속 심화  (0) 2023.11.30
c++ 상속  (1) 2023.11.23
c++ 함수 중첩, 디폴트 인자  (0) 2023.11.16
C++ Const, 동적 메모리 할당  (0) 2023.11.09